با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره کامل آموزش برنامه نویسی اندروید را دنبال می کنند. سرویس یک جزء از برنامه است که در پس زمینه اجرا می شود تا عملیات دراز مدت و پیچیده بدون نیاز به ارتباط با کاربر انجام شود و حتی اگر برنامه متوقف شود، باز هم کار می کند. یک سرویس می تواند اساسا یکی از دو حالت started و bound را داشته باشد. سرویس ها نیز همانند Activity در اندروید در یک سیکل چرخشی از ایجاد تا توقف کامل اجرا می شوند. برای آشنایی با سرویس ها در اندروید و چگونگی استفاده از سرویس در اندروید با ادامه ی مباحث این بخش با ما همراه باشید.
در ادامه ی این آموزش شما را با چگونگی کار با سرویس ها در اندروید و متدهای مربوطه آشنا می کنیم.
همانطور که اشاره شد به طور کلی سرویس ها در اندروید شامل یکی از دو ضعیت زیر هستند:
ردیف | وضعیت و توضیحات مربوطه |
---|---|
۱ | Started یک سرویس زمانی شروع می شود که یک جزء برنامه، مانند یک فعالیت، با فراخوانی () startService شروع می شود |
۲ | Bound یک سرویس زمانی که یک جزء برنامه به آن متصل می شود، با فراخوانی () bindService محدود می شود. این وضعیت یک رابط client-server را فراهم می کند. |
سرویس یک سیکل از فراخوانی متدهای callback است. که شما می توانید برای نظارت بر تغییرات سرویس آن را پیاده سازی کنید.
در شکل زیر در نمودار سمت چپ سیکل چرخشی که با متد () startService آغاز می شود را نشان می دهد.
نمودار سمت راست نیز سیکل چرخشی که با متد () bindService اجرا می شود را نشان می دهد:
برای ایجاد سرویس، شما باید یک کلاس Java را ایجاد کنید که کلاس پایه Service یا یکی از زیر کلاس های موجود را گسترش می دهد.
کلاس پایه Service متد های مختلفی را برای فراخوانی تعریف می کند و مهمترین آنها در ادامه آمده است.
البته شما نیازی به پیاده سازی و استفاده از تمام متدهای زیر را ندارید اما بد نیست که یک درک کلی از همه ی این موارد داشته باشید:
ردیف | متدهای Callback و توضیحات مربوطه |
---|---|
۱ | onStartCommand() سیستم با استفاده از این متد، وقتی یک جزء دیگر، مانند یک فعالیت، سرویس متد () startService را فراخوانی می کند، این متد را فراخوانی می کند. با استفاده از این متد می توانید سرویس ها را با متد ()stopSelf یا ()stopService متوقف کنید.
|
۲ | onBind() زمانیکه که جزء دیگر می خواهد با سرویس ()bindService ارتباط برقرار کند، سیستم از این متد استفاده می کند. شما باید سعی کنید که همیشه از این متد استفاده کنید. |
۳ | onUnbind() زمانیکه اتصال تمام مشتری های یک رابط خاص توسط یک سرویس قطع می شود این متد فراخوانی می شود.
|
۴ | onRebind() سیستم هنگامی که مشتریان جدید به سرویس متصل می شوند، این متد را فراخوانی می کند.
|
۵ | onCreate() سیستم هنگامی که سرویس برای اولین بار با استفاده از ()OnStartCommand یا ()onBind ایجاد می شود این متد را می گیرد.
|
۶ | 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 43 44 45 | package com.pvlearn; import android.app.Service; import android.os.IBinder; import android.content.Intent; import android.os.Bundle; public class HelloService extends Service { int mStartMode; IBinder mBinder; boolean mAllowRebind; @Override public void onCreate() { } @Override public int onStartCommand(Intent intent, int flags, int startId) { return mStartMode; } @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public boolean onUnbind(Intent intent) { return mAllowRebind; } @Override public void onRebind(Intent intent) { } @Override public void onDestroy() { } } |
در این مثال ما به شما چگونگی ایجاد سرویس در اندروید را نشان خواهیم داد.
مراحل زیر را برای تغییر دادن برنامه ی اندرویدی که در بخش قبل ایجاد کردیم دنبال کنید:
مراحل | توضیحات |
---|---|
۱ | مراحل ایجاد برنامه در اندروید استدیو را طبق بخش های قبلی دنبال کرده و نام پکیج را com.example.pvlearn.myapplication قرار بدهید. |
۲ | فایل main activity را با افزودن متدهای () methods startService و () stopService تغییر بدهید. |
۳ | یک فایل جاوا جدید MyService.java را در زیر بسته برنامه com.example.My ایجاد کنید. این فایل اجرایی متدهای مربوط به سرویس Android را اجرا خواهد کرد. |
۴ | سرویس خود را در فایل AndroidManifest.xml با استفاده از برچسب <service … /> تعریف کنید. یک برنامه می تواند یک یا چند سرویس را بدون محدودیت داشته باشد. |
۵ | در محتویات res / layout / activity_main.xml دو دکمه در طراحی خطی اضافه کنید. |
۶ | فایل res / values / strings.xml. را بدون تغییر رها کنید. |
۷ | در نهایت برنامه را Run کرده تا نتیجه را در شبیه ساز اندروید مشاهده کنید. |
در کد زیر محتوای فایل اصلی 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 26 27 28 29 30 | package com.example.pvlearn.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 : "; @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 28 | package com.example.pvlearn.myapplication; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; import android.widget.Toast; 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(); } } |
محتوای FileManifest.xml نیز بصورت زیر اصلاح می شود که ما برچسب <service … /> را اضافه کردیم تا سرویس ها را در برگیرد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.pvlearn.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 52 53 54 55 56 57 | <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="Pvlearn " 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> |
برای اجرای برنامه ی اندرویدی خود یکی از فایل های activity در برنامه ی خود کلیک کنید.
سپس روی نماد (Run) از نوار ابزار برای شروع اجرای برنامه کلیک کنید.
اگر همه چیز بخوبی پیش برود شبیه ساز اندروید پنجره ی زیر را نمایش خواهد داد:
حالا برای شروع سرویس خود، بر روی دکمه Start Service کلیک کنید، اینکار سرویس را با فراخوانی متد متد ()onStartCommand شروع می کند.
سپس سرویس پیام شروع شده در پایین شبیه ساز به صورت زیر ظاهر می شود:
همچنین برای توقف سرویس، می توانید روی دکمه Stop Service کلیک کنید.
سرویس ها فرآیندها ی مختلفی هستند که به دور از چشم کاربر و در پس زمینه ی برنامه های اندروید اجرا می شود، و قابلیت های زیادی را ارائه می دهند، از این رو مباحث این بخش را به چگونگی کار با سرویس ها در اندروید و ساخت یک سرویس در اندروید اختصاص دادیم.