سرویس ها (Services) در اندروید
سرویس جزئی از یک برنامه است که کار خود را در پس زمینه و بدون نیاز به ارتباط با کاربر انجام می دهد. هنگامی که برنامه اصلی بسته شود، باز هم سرویس به کارش ادامه خواهد داد.
حالت های یک سرویس در اندروید
ردیف | وضعیت و توضیح |
1 | Started هنگامی که بخشی از یک برنامه مانند activity با استفاده از متد startService() یک سرویس را اجرا می کند، سرویس در حالت started قرار می گیرد. پس از شروع، یک سرویس می تواند در پس زمینه به طور نامحدود اجرا شود، حتی اگر مولفه ای که آن را اجرا کرده بود، بسته شود. |
2 | Bound یک سرویس زمانی که یک جزء برنامه به آن متصل می شود، با فراخوانی متد bindService() محدود می شود (در وضعیت bound قرار می گیرد). زمانی که یک سرویس در حالت bound قرار داشته باشد، اجزای مختلف برنامه می توانند با سرویس ارتباط برقرار کنند. |
هر سرویس چرخه حیات مختص خود را دارد و شما می توانید با پیاده سازی متدهای callback، سرویس را در وضعیت های گوناگون مدیریت کنید. در دیاگرام سمت چپ چرخه حیات سرویسی که توسط متد startService() اجرا شده است را مشاهده می کنید و در سمت راست نیز دیاگرام سرویسی که توسط متد bindService() فراخوانی شده است را مشاهده می کنید.
به منظور ایجاد یک سرویس، ابتدا باید یک کلاس جاوا که از کلاس پایه Service مشتق شده است را در برنامه خود ایجاد کنید. کلاس Service پایه، متد های callback مختلفی دارد که مهمترین آن ها را در جدول زیر مشاهده می کنید. شما نیازی ندارید که همه این متدها را درون سرویس خود پیاده سازی کنید، اما بهتر است نحوه کار و استفاده از آن ها بدانید تا در مواقع لزوم بتوانید از آن ها استفاده کنید.
ردیف | متد callback و توضیحات |
1 | onStartCommand() سیستم هنگامی که بخشی از یک برنامه مانند activity با استفاده از متد startService() سرویس را اجرا می کند، فراخوانی می شود. |
2 | onBind() سیستم هنگامی که بخشی از یک برنامه مانند activity با استفاده از متد bindService() سرویس را اجرا می کند، فراخوانی می شود. اگر شما این متد را پیاده سازی کنید، باید رابطی برای ارتباط سرویس با کلاینت با استفاده از شیء IBinder فراهم کنید. در یک سرویس این تابع همیشه باید این متد را پیاده سازی کنید، پس از قصد انجام کاری در این متد را ندارید می توانید، مقدار null برگردانید. |
3 | onUnbind() سیستم این متد را زمانی که تمام کلاینت های متصل به سرویس، اتصال خودشان را قطع کنند، فراخوانی می شود. |
4 | onRebind() سیستم این متد را زمانی که کلاینت جدید به سرویس متصل شود، فراخوانی می کند. |
5 | onCreate() سیستم هنگامی که سرویس برای اولین بار توسط متد onStartCommand() یا onBind() ایجاد می شو، این متد را فراخوانی می کند. |
6 | onDestroy() سیستم این متد را زمانی که سرویس به مدت طولانی بدون استفاده باشد، فراخوانی می کند. برای آزاد سازی منابعی که سرویس از آن ها استفاده می کند، باید این متد را پیاده سازی کنید. |
در مثال زیر تمامی متد های مربوط به چرخه حیات یک سرویس پیاده سازی شده اند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | package com.test1; 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() { } } |
مثال
مثال زیر نحوه ایجاد یک سرویس اندرویدی را به صورت گام به گام آموزش می دهد. مراحل زیر را برای اصلاح مثال ساده در اندروید استودیو که قبلا ایجاده کرده بودیم، دنبال کنید:
مرحله | توضیحات |
1 | با استفاده از نرم افزار Android StudioIDE یک پروژه ایجاده کنید و نام آن را My Application با نام پکیج com.example.test1.myapplication انتخاب کنید. |
2 | فایل MainActivity.java را به منظور اضافه کردن متد های startService() و stopService() ویرایش کنید. |
3 | یک فایل جدید با نام MyService.java تحت پکیج com.example.test1.myapplication اضافه کنید. این فایل حاوی متدهای مربوط به سرویس اندرویدی ما خواهد بود. |
4 | سرویس خود را در فایل AndroidManifest.xml و با استفاده از تگ <service…/> تعریف کنید. یک برنامه می تواند یک یا چند سرویس داشته باشد (بدون محدودیت). |
5 | برای اضافه کردن دو دکمه به برنامه فایل res/layout/activity_main.xml را ویرایش کنید. |
6 | نیاز به تغییر ثوابت موجود در فایل res/values/strings.xml نیست. |
7 | برنامه را اجرا کنید تا شبیه ساز اندروید را راه اندازی شود و نتیجه تغییرات انجام شده در برنامه را مشاهده کنید. |
در زیر محتوای ویرایش شده فایل MainActivity.java را مشاهده می کنید. این فایل می تواند شامل هر یک از متدهای مربوط به چرخه حیات سرویس باشد. ما متدهای startService() و stopService() را به منظور مدیریت اجرا و توقف سرویس، اضافه کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package com.example.test1.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() را پیاده سازی کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.example.test1.myapplication; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.widget.Toast; /** * Created by test1. */ 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…/> سرویس خود را معرفی کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test1.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 را مشاهده می کنید که دو دکمه به آن اضافه کرده ایم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <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="Test1 " 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> |
خوب حالا برنامه ای که ایجاد کرده ایم را اجرا می کنیم. ما فرض می کنیم شما AVD (Android Virtual Device) خود را حین تنظیم محیط برنامه نویسی اندروید ایجاد کرده اید. به منظور اجرای برنامه در اندروید استودیو، یکی از فایل های activity برنامه را باز کنید سپس بر روی نماد اجرا کلیک کنید. اندروید استودیو این برنامه را در AVD نصب کرده و آن را اجرا می کند و اگر همه چیز به درستی تنظیم شده باشد، یک پنجره شبیه ساز مانند شکل زیر نمایش داده خواهد شد:
اکنون می توانید سرویس خود را با استفاده از دکمه Start Service اجرا کنید و همچنین می توانید از دکمه Stop Service نیز برای متوقف کردن آن استفاده کنید.
خیلی عالی بود.