سرویس ها به شما اجازه میدهد تا بصورت دائمی کد هایی را در گوشی اجرا کنید به این ترتیب کاربر میتواند هنگام رخ دادن اتفاقی مانند دریافت پیام به نرم افزار شما لینک شود.
اجرای کد در پس زمینه گوشی
سرویس های اندروید
سرویس یک کامپوننت است که در پسزمینه اجرا میشود ، سرویس ها نیاز به پردازش طولانی دارند، بنابراین در پسزمینه اجرا میشوند تا کاربران را تحت تاثیر قرار ندهند، معمولا یک سرویس بعد از پایان اجرای نرم افزار به کار خود ادامه داده و متوقف نمی شود. یک سرویس میتواند دو states دریافت کند:
شماره
State & Description
1
Started:
یک سرویس زمانی شروع میشود که یک کامپوننت نرم افزار ، مانند یک activity ،آن را با فراخوانی startService() آغاز کند. هنگامیکه یک سرویس شروع بکار کرد ، میتواند بصورت نامحدود از نظر زمانی در پس زمینه اجرا شود، یعنی اینکه ، حتی اگر کامپوننتی که سرویس را ایجاد کرده است دیگر وجود نداشته باشد،سرویس میتواند به فعالیت خود ادامه دهد.
2
Bound:
یک سرویس زمانی به صورت Bound اجرا می شود که یک کامپوننت نرم افزار با کمک فراخوانی bindService() به آن متصل شود. یک bound service یک client-server interface را ارائه میدهد که امکان ارتباط میان سرویس و کامپوننت را محیا می کند. به این ترتیب امکان ارسال درخواست و دریافت نتیجه و حتی انجام عملیات در حین پردازش به کمک interprocess communication (IPC). فراهم می آید.
یک سرویس یک متد فراخوانی چرخه حیات دارد، که شما با پیاده سازی آن بر خدمات service's state نظارت کنید. به این ترتیب شما میتوانید کار را در سطح مناسبی ایجاد کنید. دیاگرام زیر در سمت چپ به شما چرخه حیاتی را نشان میدهد که در آن سرویس با startService() ایجاد می شود . دیاگرام در سمت راست نیز چرخه حیات سرویس را در زمانی که با bindService() ایجاد میشود نشان میدهد . تصویر این دیاگرام از سایت android.com کپی شده است.
برای ایجاد یک سرویس ، شما میتوانید یک کلاس جاوا ایجاد کنید که یک کلاس را به کلاس های پایه سرویس بیافزاید و یا یک کلاس فعلی را ویرایش کند . کلاس Servicebase متد های فراخوانی مختلفی را فراخوانی می کند. مهمترین این متد ها در جدول زیر توضیح داده شده اند. شما نیازی به پیاده سازی تمام متد های فراخوانی ندارید. ولی دانستن آنها و پیاده سازی آنها برای درست کار کردن نرم افزار لازم است.
1
onStartCommand() :
سیستم این متد را زمانی فرامیخواند که دیگر کامپوننت ها مانند یک activity ، آن سرویس را برای شروع لازم دارد . با فراخوانی startService() این سرویس شروع به کار می کند. اگر شما این متد را پیاده سازی کنید. این مسئولیت به عهده شماست که هنگام پایان کار یک سرویس به آن خاتمه بدهید. این کار با فراخوانی متد calling stopSelf() یا stopService() صورت میگیرد.
2
onBind() :
سیستم این متد را وقتی فراخوانی می کند که سایر کامپوننت ها بخواهند به سرویس متصل شوند. اینکار با متد callingbindService() انجام میشود. اگر شما این متد را پیاده سازی کنید، شما باید یک رابط گرافیکی برای کاربر جهت ارتباط با این سرویس تهیه کنید. اینکار با بازگردانی یک شیئ IBinder ایجاد میشود. شما همواره باید این متد را پیاده سازی کنید ولی اگر مایل به اتصال با سرویس نیستید ، یک مقدار خالی بازگردانی خواهد شد.
3
onUnbind() :
این متد زمانی فراخوانی خواهد شد که همه مشتری ها با صفحه ای که سرویس آن را منتشر می کرد قطع ارتباط کنند.
4
onRebind() :
سیستم این متد را وقتیکه مشتری جدیدی با سرویس ارتباط برقرار می کند فراخوانی می کند. بعد از آن اگر کاربر قبلا با سرویس ارتباط برقرار کرده باشد با متد onUnbind(Intent) تمام اتصالات کاربر با سرویس قطع خواهد شد.
5
onCreate() :
سیستم این متد را هنگامی فراخوانی میکند که سرویس ایجاد میشود و برای ایجاد سرویس از این دو متد onStartCommand() یا onBind() استفاده شده باشد. فراخوانی این متد ها یکبار نیاز به تنظیم خواهد داشت.
6
onDestroy() :
سیستم این متد را هنگامی که سرویس دیگر استفاده نمی شود و سرویس ازبین رفته است فراخوانی می کند. سرویس شما باید این متد را پیاده سازی کند تا همه منابع مانند موضوعات threads ، لایسنس های ریجیستر شده registered listeners ، اطلاعات دریافتی receivers و غیره خاتمه یابند.
سرویس های skeleton service در پایین نشان دهنده همه متدهای life cycle هستند:
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() {
}
}
مثال
در این مثال به شما نشان میدهیم که چگونه سرویس های نرم افزار اندروید استودیوی خود را ایجاد کنید. این مثال ادامه پروژه سلام دنیا در اندروید میباشد، بنابراین اول نگاهی به آن مقاله بیاندازید.
1
شما از رابط کاربری اندروید برای ایجاد یک نرم افزار اندرویدی استفاده کرده و نام نرم افزار خود را
My Application میگذارید، این اپلیکیشن در شاخه ی package
com.example.tutorialspoint7.myapplication ایجاد می شود. به مثال
سلام دنیا رجوع کنید.
2
فایل main activity در MainActivity.java را ویرایش کنید و متد های addstartService() و stopService() را به آن بیافزایید.
3
یک فایل جاوا به نام MyService.java ایجاد کنید ، این فایل در زیر شاخه packagecom.example.My Application باید ایجاد شود . این فایل سرویس ها مرتبط به متد را پیاده سازی می کند.
4
برای تعریف سرویس خود در فایل AndroidManifest.xml از تگ <service.../> استفاده کنید. یک اپلیکیشن میتواند یک یا چند سرویس داشته باشد .این به آن معنا است که تعداد سرویس های یک نرم افزار محدودیتی ندارد.
5
محتوای پیشفرض فایل res/layout/activity_main.xml را ویرایش کنید، تا دو دکمه در نمای linear layout داشته باشد.
6
نیازی به تغییر ثابت ها در فایل res/values/strings.xml نیست اندروید استودیو مراقب مقادیر رشته ای است .
7
نرم افزار را اجرا کنید تا شبیه ساز اندروید اجرا شود و تغییرات ایجاد شده در نرم افزار تائید شود.
در زیر تغییرات در فایل 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>
حالا باید نرم افزار ویرایش شده سلام دنیا را اجرا کنیم .ما گمان را بر این گذاشته ایم که هنگام نصب شما محیط شبیه ساز نرم افزار یا همان AVD را هم نصب کرده اید. برای اجرای نرم افزار یکی از فایل های project's activity را باز کنید و روی ایکون Run کلیک کنید. این ایکون روی نوار ابزار قرار دارد. اندروید استودیو نرم افزار را روی محیط شبیه ساز نصب کرده و سپس اگر همه چیز در هنگام نصب خوب پیشرفت پنجره زیر به شما نمایش داده خواهد شد:
برای اجرای سرویس روی دکمه Start Service کلیک کرده و اینکار سرویس را در طول اجرای برنامه با متد onStartCommand() اجرا میکند. یک پیام سرویس در زیر شبیه ساز در تصویر زیر به نمایش در خواهد امد:
برای متوقف کردن سرویس شما میتوانید روی دکمه Stop Service کلیک کنید.
شرکت برنامه نویسی سارگون مجری برنامه نویسی اندروید بصورت حرفه ای با ما تماس بگیرید.