تخفیفات زمستانه تاپایان: شنبه ۴ تیر ۱۴۰۱
بزن بریم فروشگاه
درس ۷-آموزش سرویس ها (service) در اندروید

سرویس (service) یکی از کامپوننت های اصلی اپلیکیشن های اندرویدی در برنامه نویسی اندروید است که برای پردازش های طولانی در پس زمینه مورد استفاده قرار میگیرد. سرویس حتی با وجود بسته شدن اپلیکیشن باز هم ادامه پیدا میکند و بدون اینکه نیاز باشد در صفحه چیزی نمایش داده بشود در بک گراند کار خود را انجام میدهد که دو حالت دارند : 

 

شماره حالت و توضیحات
۱ Started
یک سرویس زمانی در حالت started هست که توسط یک کامپوننت دیگری مثل یک activity با استفاده از متود startService() اجرا شود. زمانی که یک سرویس استارت شد بدون نیاز به کامپوننت دیگری به کار خود ادامه میدهد حتی اگر کامپوننت استارت کننده از بین رفته شده باشد.
۲ Bound
یک سرویس زمانی به حالت bound میرود که متود bindService() اجرا شود. یک سرویس bound شده بین دیگر کامپوننت ها یک حالت client-server ایجاد میکند که تعامل همیشگی بین آن داشته باشند. در این حالت دیگر کامپوننت ها میتوانند به سرویس درخواست بفرستند و نتیجه دریافت کنند.

 

سرویس ( Service ) ها در برنامه نویسی اندروید

هر سرویس (Service) برای خود یک چرخه ی حیات (Life Cycle) نیز دارد که با استفاده از متودهای چرخه ی حیات میتوانید عملیات یک سرویس را کنترل کنید و از انها استفاده کنید.در تصویر زیر دیاگرام کاملی از چرخه ی حیات سرویس ها مشاهده میکنید که از متود startService() شروع میشود و در سمت راست تصویر نیز یک سرویس حالت bound شده با متود bindService() گفته میشود. 

دیاگرام سرویس ها ( service ها ) در برنامه نویسی اندروید

برای ساختن یک سرویس (service) جدید یک فایل کلاس Java باید درست کنید که از کلاس اصلی Service ارث بری میکند.همانطور که بالاتر هم ذکر شد سرویس ها در برنامه نویسی اندروید متودهای callback زیادی دارد که البته همه ی آن ها ممکن است مورد استفاده قرار نگیرد ولی ما مهم ترین آنها را در جدول زیر شرح داده ایم.

 

شماره متود و توضیحات
۱ onStartCommand()
این متود زمانی اجرا میشود که یک سرویس توسط کامپوننت های دیگری مثل یک اکتیویتی با استفاده از متود startService() استارت شود. وقتی شما در چنین حالتی یک سرویس را در اندروید اجرا میکنید مسئولیت متوقف کردن آن نیز برعهده ی برنامه نویس هست و این کار را باید با متود های stopSelf() یا stopService() انجام دهید.
۲ onBind()
این متود زمانی اجرا میشود که یک کامپوننت دیگری بخواهد ارتباط bind با استفاده از متود bindService() برقرار کند. اگر شما از این متود استفاده کنید باید یک interface برای ارتباط client با server بسازید و یک آبجکت IBinder برگرداند. اگر قصد داشتید که bind اتفاق نیوفتد باید null برگردانید.
۳ onUnbind()
این متود زمانی اجرا میشود که تمامی کلاینت ها که به inteface یک سرویس متصل هستند قطع اتصال شوند.
۴ onRebind()
این متود زمانی اجرا میشود که کلاینت های جدیدی به interface سرویس متصل شوند در حالیکه قبلا تمامی کلاینت ها با استفاده از onUnbind(Intent) قطع شده باشند.
۵

onCreate()

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

۶

onDestroy()

این متود زمانی اجرا میشود که یک سرویس دیگر استفاده نشود یا بصورت کامل از بین برود. سرویس باید طوری پیاده سازی شود که با استفاده از این متود برای پاکسازی resource هایی همانند threads, registered listeners, receivers و... استفاده کند.

مثال زیر اسکلت یک سرویس را نشان میدهد که شما را با هر یک از متود های callback مربوط به سرویس ها آشنا میکند : 

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() {

   }
}

مثال شماره ی یک  : 

در این مثال عملی شما بصورت قدم به قدم یادمیگیرید که چطور سرویس ها را برنامه نویسی کنید و در برنامه نویسی اندروید از آنها استفاده کنید :‌

 

قدم توضیحات
۱ شما باید از محیط Android Studio استفاده کنید و یک پروژه ی جدید بسازید و نام آنرا My Application قرار دهید  و نام پکیج آنرا ir.example.avasam.myapplication قرار میدهید 
۲ فایل MainActivity.java را ویرایش کنید و متود های startService()  و  stopService() را اضافه کنید.
۳ یک فایل جاوا جدید بسازید و نام آنرا MyService.java قرار دهید که از این فایل برای پیاده سازی یک سرویس استفاده خواهیم کرد.
۴ فایل AndroidManifest.xml  را ویرایش کنید و تگ <service.../> را اضافه کنید. هر اپلیکیشن میتواند یک یا چند سرویس بدون دخالت به همدیگر داشته باشد.
۵ فایل res/layout/activity_main.xml  را ویرایش کنید و دو عدد دکمه به آن اضافه کنید.
۶ نیازی به تغییر در فایل res/values/strings.xml  نیست. اندروید استودیو از مقادیر رشته ای مراقبت میکند.
۷ اپلیکیشن را اجرا کنید تا نتیجه ی آنرا روی امولاتور اندرویدی خود ببینید.

در زیر کدهای ویرایش شده ی MainActivity.java را میبینید. این فایل میتواند شامل تمام متود های لازم باشد که ما در اینجا دو متود startService() و stopService() اضافه کردیم که باعث start و stop شدن سرویس میشوند  : 

mport 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 استفاده کردیم :‌

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="ir.example.avasam.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>

کدهای زیر برای فایل layout هستند که در مسیر 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>

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

زمانی که اپلیکیشن را در اندروید استودیو اجرا کنید و در امولاتور نتیجه را ببینید مشابه تصویر زیر خواهد بود : 

آموزش سرویس (Service) در برنامه نویسی اندروید

حال برای استارت شدن سرویس کافیست روی دکمه ی START SERVICE کلیک کنید زمانی که این دکمه فشار داده میشود متود onStartCommand() بصورت خودکار اجرا میشود بعد از آن یک متن در صفحه ی اپ به شکل تصویر زیر نمایش داده میشود‌:

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