سرویس در برنامه نویسی اندروید
سرویس در برنامه نویسی اندروید
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، با سرویس در برنامه نویسی اندروید (Android Services) آشنا خواهیم شد.
سرویس در برنامه نویسی اندروید بخشی است که برای انجام عملیات طولانی مدت بدون نیاز به تعامل با کاربر در پس زمینه اجرا می شود و حتی اگر برنامه از بسته شود. یک سرویس اساساً می تواند دو حالت داشته باشد –
حالت و توضیحات | |
---|---|
1 | Started
یک سرویس هنگامی شروع می شود که یک جز برنامه، مانند یک فعالیت، آن را با فراخوانی ()startService شروع کند. با شروع کار یک سرویس می تواند به صورت نامحدود در پس زمینه اجرا شود، حتی اگر جز شروع کننده آن از بین برود. |
2 | Bound
وقتی یک مولفه برنامه با فراخوانی ()bindService به آن متصل می شود ، سرویس محدود می شود. یک سرویس محدود یک رابط سرویس گیرنده-سرور را ارائه می دهد که به اجزای سازنده امکان می دهد با سرویس ارتباط برقرار کنند، درخواست ارسال کنند، نتیجه بگیرند و حتی این کار را در فرایندهای ارتباط بین پردازشی (IPC) انجام دهند. |
یک سرویس دارای روش های برگشت چرخه حیات است که می توانید برای نظارت بر تغییرات وضعیت سرویس پیاده سازی کنید و می توانید کار را در مرحله مناسب انجام دهید. نمودار زیر سمت چپ ، چرخه حیات را هنگام ایجاد سرویس با ()startService نشان می دهد و نمودار سمت راست، چرخه حیات را هنگام ایجاد سرویس با ()bindService نشان می دهد:
برای ایجاد یک سرویس در برنامه نویسی اندروید، شما یک کلاس جاوا ایجاد می کنید که کلاس پایه سرویس یا یکی از زیر کلاس های موجود آن را گسترش می دهد. کلاس پایه سرویس روشهای مختلفی برای پاسخگویی را تعریف می کند و مهمترین آنها در زیر آورده شده است. نیازی به پیاده سازی همه روش های برگشت کال بک نیست. با این حال، مهم این است که شما هر یک را بفهمید و مواردی را که برنامه شما را مطابق انتظار کاربران عمل می کند، پیاده سازی کنید.
کال بک و توضیحات | |
---|---|
1 |
()onStartCommand یک سیستم وقتی متغیر دیگری، مانند یک فعالیت، با راه اندازی با ()startService درخواست می کند، این روش را فراخوانی می کند. اگر این روش را اجرا کنید، وظیفه شماست که وقتی کار سرویس تمام شد، با تماس با روش های stopSelf () یا stopService () متوقف شوید. |
2 | ()onBind
این سیستم زمانی این متد را فراخوانی می کند که مولفه دیگری با فراخوانی ()bindService به سرویس بپیوندد. اگر این روش را پیاده سازی کنید، باید با بازگرداندن یک شی IB IBinder ، رابطی ارائه دهید که کلاینت ها از آن برای ارتباط با سرویس استفاده می کنند. شما همیشه باید این روش را پیاده سازی کنید، اما اگر نمی خواهید اجازه اتصال دهید، باید صفر برگردید. |
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 43 44 45 46 47 48 49 50 51 52 53 54 |
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 ایجاد کرده ایم اصلاح کنید –
مرحله | توضیحات |
---|---|
1 | شما از Android StudioIDE برای ایجاد یک برنامه اندروید و نامگذاری آن به عنوان My Application تحت یک بسته com.example.tutorialspoint7.myapplication استفاده خواهید کرد. |
2 | پرونده فعالیت اصلی MainActivity.java را تغییر دهید تا روش ()startService و ()stopService را اضافه کنید. |
3 | یک فایل جاوا جدید ایجاد کنید MyService.java در بسته com.example.My Application. این فایل از روش های مربوط به سرویس اندروید استفاده می کند. |
4 | با استفاده از برچسب <service … /> سرویس خود را در پرونده AndroidManifest.xml تعریف کنید. یک برنامه کاربردی می تواند یک یا چند سرویس بدون هیچ محدودیتی داشته باشد |
5 | محتوای پیش فرض فایل res / layout / activity_main.xml را تغییر دهید تا شامل دو دکمه در طرح بندی خطی باشد. |
6 | بدون نیاز به تغییر ثابت در پرونده res / values / strings.xml. Android studio از مقادیر رشته مراقبت می کند |
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 26 27 28 29 30 31 |
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 است. این پرونده بر اساس نیازها می تواند یک یا چند روش مرتبط با سرویس را اجرا کند. در حال حاضر ما فقط دو روش را روی ()StartCommand و ()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 |
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 … /> را اضافه کرده ایم تا شامل سرویس ما شود –
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.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 وجود دارد که شامل دو دکمه است –
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="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 اصلاح شده خود را اجرا کنیم! من تصور می کنم شما AVD خود را هنگام راه اندازی محیط ایجاد کرده اید. برای اجرای برنامه از Android studio، یکی از پرونده های فعالیت پروژه خود را باز کنید و از نوار ابزار روی کلیک کنید. Android Studio برنامه را روی AVD شما نصب کرده و شروع به کار می کند و اگر با تنظیمات و برنامه هایتان همه چیز خوب باشد، زیر پنجره شبیه ساز نمایش داده می شود.
اکنون برای شروع سرویس خود، بر روی دکمه Start Service کلیک کنید، این سرویس شروع به کار می کند و طبق برنامه نویسی ما به روش ()onStartCommand، یک پیام Service Started در پایین شبیه ساز به شرح زیر ظاهر می شود –
برای توقف سرویس، می توانید روی دکمه Stop Service کلیک کنید.
لیست جلسات قبل آموزش برنامه نویسی اندروید
- نگاهی کلی به برنامه نویسی اندروید
- تنظیمات محیط در برنامه نویسی اندروید
- معماری برنامه نویسی اندروید
- اجزای برنامه در برنامه نویسی اندروید
- Hello World در برنامه نویسی اندروید
- سازماندهی و دسترسی به منابع در برنامه نویسی اندروید
- فعالیت در برنامه نویسی اندروید
دیدگاه شما