کار با سرویس در اندروید استودیو همراه یک مثال کاربردی

کار با سرویس در اندروید استودیو - سرویس اندروید - service اندروید - ساخت یک سرویس در اندروید استودیو | آموزش برنامه نویسی اندروید الکامکو

در این مقاله می خواهیم نحوه پیاده سازی سرویس در اندروید استودیو (Android Service) را به صورت پروژه محور به شما آموزش دهیم که شامل ساخت سرویس در اندروید، انواع سرویس اندروید، متدهای سرویس های اندروید می باشد. پس با مرجع آموزش برنامه نویسی اندروید الکامکو همراه باشید.

سرویس اندروید چیست و چکار می کند؟ 

سرویس در اندروید (Android Service) کامپوننتی در اندروید است که بدون تعامل با کاربر، اجرای پردازش هایی که طولانی مدت هستند را در پس زمینه (Background) انجام می دهد و حتی در صورت از بین رفتن برنامه نیز کار می کند و این اجراها را کاربر نمی بیند.

اجرای سرویس اندروید در پس زمینه یعنی چی؟ 

منظور از اجرا در پس زمینه این است که مهم نیست برنامه باز باشد یا بسته. یعنی بعد از اجرای سرویس، حتی اگر کاربر از برنامه ما خارج شد و برنامه دیگری را باز کرد هم سرویس در پشت صحنه به کار خود ادامه می‌دهد. به طور خلاصه می‌توان گفت سرویس‌ها هیچ وابستگی به چرخه حیات Activity ندارد.

آشنایی با انواع سرویس ها در اندروید : 

سرویس ها در اندروید دو مدل هستند :  

سرویس اندروید Started : 

یک سرویس اندروید Started هنگامی شروع می شود که کامپوننت اندرویدی مانند یک اکتیویتی، آن را با فراخوانی ()startService شروع کند. پس از شروع کار ، یک سرویس می تواند به طور نامحدود در پس زمینه اجرا شود، حتی اگر مؤلفه ای که آن را شروع کرده است از بین برود.

سرویس اندروید Bound : 

یک سرویس اندروید Bound هنگامی شروع می شود که کامپوننت اندرویدی مانند یک اکتیویتی، آن را با فراخوانی ()bindService کند. یک سرویس Bound یک رابط کلاینت-سرور ( client-server ) را ارائه می دهد که به کامپوننت ها اجازه ارسال درخواست، دریافت نتایج و حتی انجام این کار را با پردازش های ارتباطی میان پردازشی (IPC) به سرویس می دهد و در واقع اجازه تعامل با سرویس را می دهد.

یک سرویس دارای متد های callback ای در چرخه عمر خود است که می توانید آنها را برای نظارت بر تغییرات در وضعیت سرویس پیاده سازی کنید و می توانید کار را در یک مرحله مناسب انجام دهید.

نمودار زیر در سمت چپ چرخه عمر سرویس اندروید را وقتی که با ()startService ایجاد می شود نشان می دهد و نمودار سمت راست چرخه عمر سرویس اندروید را وقتی که با ()bindService ایجاد می شود نشان می دهد.

ساخت یک سرویس در اندروید استودیو چگونه است؟

برای ایجاد یک سرویس در اندروید (Android Service) ، یک کلاس جاوا ایجاد کنید که کلاس اصلی Service اندروید یا یکی از زیر کلاسهای موجود در آن را گسترش می دهد. اصلی ترین کلاس Service اندروید متد های callback مختلفی را تعریف می کند که در ادامه می خواهیم به مهم ترین آنها اشاره کنیم و نیازی نیست شما بخواهید همه این متد ها را پیاده سازی و اجرا کنید ولی خب اینکه با هر کدام آشنایی داشته باشید بسیار مهم است تا بتوانید با استفاده از اطلاعات بدست آمده از این سرویس های اندروید، مواردی را انتخاب کنید که نیاز برنامه شما را تامین کنند.

آشنایی با متدهای سرویس اندروید:  

()onStartCommand :

یک سیستم زمانی این متد را فراخوانی می کند که مولفه­ ی دیگری مانند یک اکتیویتی (activity)، با فراخوانی ()startService درخواست کند که سرویس آغاز شود. در صورتی که شما این متد را پیاده سازی کنید، متوقف کردن سرویس اندروید بعد از پایان شدن کارش، به عهده شماست. اتمام کار با فراخوانی متد های ()stopSelf یا ()stopService انجام می شود.

()onBind:

سیستم ، این متد را زمانی فراخوانی می کند که یک مولفه دیگر بخواهد با فراخوانی ()bindService به سرویس متصل شود. در صورت پیاده سازی این متد، شما باید با برگرداندن یک شیء IBinder ، واسطی را ایجاد کنید که کلاینت ، از آن برای برقراری ارتباط با سرویس استفاده کند. باید همیشه این متد را پیاده سازی کنید، ولی در صورتی که نخواهید اجازه ­ی اتصال بدهید، باید null را برگردانید.

()onUnbind :

سیستم این متد را زمانی فراخوانی می کند که اتصال همه ­ی کلاینت ها، از یک واسط خاص منتشر شده به وسیله ­ی سرویس (service) قطع شود. این متد بعد از اینکه سیستم از طریق :

(onUnbind(Intent :

متوجه شود که اتصال همه سرویس ها قطع شده است ، اجرا می شود.

()onRebind :

سیستم این متد را زمانی فراخوانی می کند که سرویس برای اولین بار توسط ()StartCommand یا ()onBind ایجاد شود. این فراخوانی یک بار در طول راه اندازی انجام می شود.

()onDestroy :

سیستم این متد را زمانی فراخوانی می کند که سرویس، دیگر مورد استفاده قرار نگیرد و از بین برود. سرویس (service) شما باید این کار را برای پاک کردن تمام منابع مانند thread ، شنود کننده های ثبت شده (registered listeners) ، دریافت کننده ها (receivers) و غیره انجام دهد.

هر کدام از چرخه های زیر را می توانید در کد زیر ببینید:

package com.tutorialspoint;

import android.app.Service;
import android.os.IBinder;
import android.content.Intent;
import android.os.Bundle;

public class HelloService extends Service {
   
   /** indicates how to behave if the service is killed */
   int mStartMode;
   
   /** interface for clients that bind */
   IBinder mBinder;     
   
   /** indicates whether onRebind should be used */
   boolean mAllowRebind;

   /** Called when the service is being created. */
   @Override
   public void onCreate() {
     
   }

   /** The service is starting, due to a call to startService() */
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      return mStartMode;
   }

   /** A client is binding to the service with bindService() */
   @Override
   public IBinder onBind(Intent intent) {
      return mBinder;
   }

   /** Called when all clients have unbound with unbindService() */
   @Override
   public boolean onUnbind(Intent intent) {
      return mAllowRebind;
   }

   /** Called when a client is binding to the service with bindService()*/
   @Override
   public void onRebind(Intent intent) {

   }

   /** Called when The service is no longer used and is being destroyed */
   @Override
   public void onDestroy() {

   }
}

با استفاده از این مثال می توانید متوجه ساخت یک سرویس در اندروید شوید. بمنظور تغییر اپلیکیشن اندرویدی ای که ما در بخش Hello World Example ایجاد کردیم، مراحل زیر را دنبال کنید:

مرحله اول: برای ایجاد اپلیکیشن اندرویدی خود از Android StudioIDE استفاده کنید و آن را تحت پکیج My Application نامگذاری کنید. همان طور که در مثال بخش Hello World Example شرح داده شد، تحت پکیج Hello World Example، HelloWorld بنامید.

مرحله دوم: فایل activity اصلی MainActivity.java را به متد های  startService() و stopService() تغییر دهید.

مرحله سوم: یک فایل جاوای جدید MyService.java را تحت پکیج com.example.helloworld ایجاد کنید. این فایل شامل پیاده سازی متد های مربوط به سرویس اندرویدی خواهد بود.

مرحله چهارم: سرویس خود را با استفاده از تگ <service…/> ، در فایل AndroidManifest.xml تعریف کنید. یک اپلیکیشن بدون هیچ محدودیتی می تواند یک یا تعداد بیشتری سرویس (service) داشته باشد.

مرحله پنجم: محتوای پیش فرض فایل res/layout/activity_main.xml را تغییر دهید به طوری که شامل دو دکمه در صفحه بندی خطی (linear layout) باشد.

مرحله ششم: دو ثابت start_service و stop_service را در فایل res/values/strings.xml تعریف کنید. نیاز به تغییر ثابت فایل res/values/strings.xml نیست. (اندروید استودیو از مقادیر رشته ای مراقبت می کند)

مرحله هفتم: اپلیکیشن را در شبیه سازی اندروید (emulator) اجرا کنید و بررسی کنید که چه تغییراتی در اپلیکیشن اعمال شده است.

در کد زیر محتوای فایل  activity اصلی MainActivity.java را مشاهده می کنید. این فایل می تواند شامل هر کدام از متد های چرخه حیات اصلی باشد. ما متد های ()startService و ()stopService را برای شروع و متوقف کردن سرویس اضافه کرده ایم.

package com.example.tutorialspoint7.myapplication;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;

public class MainActivity extends Activity {
   String msg = "Android : ";

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Log.d(msg, "The onCreate() event");
   }

   public void startService(View view) {
      startService(new Intent(getBaseContext(), MyService.class));
   }

   // Method to stop the service
   public void stopService(View view) {
      stopService(new Intent(getBaseContext(), MyService.class));
   }
}

در کد زیر محتوای فایل MyService.java نمایش داده شده است. این فایل می تواند شامل پیاده سازی یک یا تعداد بیشتری سرویس اندروید اصلی یا نیازمندی ها باشد. در حال حاضر ما فقط قصد داریم که متد های ()onStartCommand و ()onDestroy را پیاده سازی کنیم.

package com.example.tutorialspoint7.myapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

/**
   * Created by TutorialsPoint7 on 8/23/2016.
*/

public class MyService extends Service {
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
	
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Let it continue running until it is stopped.
      Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
      return START_STICKY;
   }

   @Override
   public void onDestroy() {
      super.onDestroy();
      Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
   }
}

در کد زیر محتوای تغییر یافته­ ی فایل AndroidManifest.xml ارائه شده است، در اینجا ما تگ <service…/> را برای وارد کردن سرویس مان اضافه کرده ایم.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.tutorialspoint7.myapplication">

   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
		
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
		
      <service android:name=".MyService" />
   </application>

</manifest>

در کد زیر محتوای فایل res/layout/activity_main.xml برای وارد کردن دو دکمه می بینید:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
   
   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Example of services"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />
      
   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_above="@+id/imageButton"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="40dp" />

   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_centerVertical="true"
      android:layout_centerHorizontal="true" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/button2"
      android:text="Start Services"
      android:onClick="startService"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Stop Services"
      android:id="@+id/button"
      android:onClick="stopService"
      android:layout_below="@+id/button2"
      android:layout_alignLeft="@+id/button2"
      android:layout_alignStart="@+id/button2"
      android:layout_alignRight="@+id/button2"
      android:layout_alignEnd="@+id/button2" />

</RelativeLayout>

حالا نوبت به آن رسیده که اپلیکیشن تغییر یافته ­ی مثال Hello World! را اجرا کنیم، من فرض می کنم که شما ADV خود را در طول نصب محیط ایجاد کرده باشید. برای اینکه پروژه خودتان را در اندروید استودیو اجرا کنید یکی از فایل های activity پروژه ­ی خود را باز کنید و بر روی آیکن Run از نوار ابزار خود کلیک کنید.

اندروید استودیو (Android Studio) اپلیکیش را بر روی AVD شما نصب می کند و آن را راه اندازی می کندو در صورتی که همه­ ی موارد مربوط به تنظیمات و برنامه شما درست باشد، در صفحه امولاتور دو دکمه با عناوین start service و stop service ظاهر می شود.

حالا برای استارت زدن  سرویس خود، بر روی دکمه Start Service کلیک کنید، این کار سرویس شما را آغاز می کند و با توجه به کد های برنامه نویسی شده در متد ()onStartCommand پیغام Service Started (به معنای سرویس آغاز شد)، در بخش انتهایی امولاتور (یا شبیه ساز) نمایش داده می شود.

commentشما بگید!

شما چه سوالی درباره این موضوع دارید که اینجا مطرح نشده است؟ لطفا تجربیات خودتان را در این زمینه حتما توی کامنت برای ما بنویسید. منتظر نظرات، پیشنهادات و سوالات شما در همین صفحه از سایت آموزش برنامه نویسی الکامکو هستیم…

shareاشتراک گذاری این مطلب

shareآخرین مقالات

آخرین مقالات

آموزش های تکمیل شده

توجه

مقاله هایی که در سایت به صورت رایگان قرار گرفته است فقط برای مطالعه بیشتر شما کاربران عزیز می باشد. از هرگونه تماس تلفنی با پشتیبانی سایت و سوال در مورد محتوای مقاله ها خودداری شود.

0 دیدگاه
بازخورد درون خطی
مشاهده همه نظرات
فهرست