آموزش سرویس ها در اندروید به زبان ساده
سرویس جزئی از برنامه است که برای انجام عملیات طولانی مدت بدون نیاز به تعامل با کاربر ، در پس زمینه اجرا می شود و حتی در صورت بسته شدن برنامه اصلی نیز کار می کند. یک سرویس اساساً می تواند دو حالت را در بر بگیرد –
شماره | حالت و توضیحات |
۱ | Started
سرویس هنگامی شروع می شود که یک مؤلفه برنامه ، مانند activity ، آن را با فراخوانی ()startService شروع کند. پس از شروع ، یک سرویس می تواند به طور نامحدود در پس زمینه اجرا شود ، حتی اگر مؤلفه ای که آن را شروع کرده، بسته شود. |
۲ | Bound
هنگامی که یک مؤلفه برنامه با فراخوانی ()bindService به آن وصل شود ، سرویس محدود می شود. یک سرویس محدود(bound) یک رابط مشتری-سرور را ارائه می دهد که به اجزای سازنده امکان تعامل با سرویس ، ارسال درخواست ، دریافت نتایج و حتی انجام این کار را با فرآیندهای ارتباطی میان پردازشی (IPC) می دهد. |
یک سرویس دارای متد های callback چرخه حیات است که می توانید آنها را برای نظارت بر تغییرات در وضعیت سرویس پیاده سازی کنید و کار را در مرحله مناسب انجام دهید. نمودار زیر در سمت چپ، چرخه حیات سرویس را نشان می دهد که با ()startService ایجاد می شود و نمودار سمت راست چرخه حیات را هنگام ایجاد سرویس با ()bindService نشان می دهد:
برای ایجاد یک سرویس ، یک کلاس جاوا ایجاد کنید که از کلاس پایه Service مشتق شده است. کلاس Service متد های مختلف callback را تعریف می کند که مهمترین آنها در زیر آورده شده است. نیازی به اجرای همه متد های callback نیست. با این حال ، مهم است که شما هرکدام را درک کرده و مواردی را اجرا کنید که مطمئن شوید برنامه همانطور که انتظار می رود کار کند.
شماره | Callback و توضیحات |
۱ | ()onStartCommand
این سیستم هنگامی که مؤلفه دیگری مانند activity ، با startService() درخواست شروع سرویس می کند، این متد را فراخوانی می کند. اگر این متد را پیاده سازی کنید ، وظیفه شماست که هنگام انجام کار ، سرویس ها را با فراخوانی متدهای stopSelf() یا stopService() متوقف کنید. |
۲ | ()onBind
این سیستم هنگامی که مؤلفه دیگری بخواهد با فراخوانی bindService() از سرویسی استفاده کند ، این متد را فراخوانی می کند. اگر این متد را پیاده سازی کنید ، باید با استفاده از یک شی IBinder ، رابطی را ارائه دهید که کلاینت ها از آن برای برقراری ارتباط با سرویس استفاده کنند. شما همیشه باید این متد را پیاده سازی کنید ، اما اگر نمی خواهید اجازه اتصال دهید ، باید null را برگردانید. |
۳ | ()onUnbind
سیستم هنگامی که همه کلاینت ها اتصال خود را با سرویس قطع می کنند، این متد را فراخوانی می کنند. |
۴ | ()onRebind
سیستم هنگامی که کلاینت های جدید به سرویس متصل شوند، این متد را فراخوانی می کنند. |
۵ | ()onCreate
سیستم وقتی سرویس برای اولین بار با استفاده از onStartCommand() یا onBind() ایجاد می شود ، این متد را فراخوانی می کند. |
۶ | ()onDestroy
سیستم وقتی سرویس دیگر مورد استفاده قرار نمی گیرد و در حال از بین رفتن است ، این متد را فراخوانی می کند. متد باید پیاده سازی شود تا منابعی که سرویس از آن ها استفاده می کند آزاد شوند. |
سرویس زیر هریک از متد های چرخه حیات را نشان می دهد –
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 ایجاد کردیم ، مراحل زیر را دنبال کنید –
شماره | توضیحات |
۱ | می توانید از Android StudioIDE برای ایجاد برنامه اندروید استفاده کنید و آن را My Application تحت پکیج com.example.tutorialspoint7.myapplication نامگذاری کنید ، همانطور که در قسمت مثال Hello World توضیح داده شده است. |
۲ | فایل MainActivity.java را تغییر داده و متد های startService() و stopService() را اضافه کنید. |
۳ | یک فایل جدید MyService.java را تحت پکیج com.example.My Application ایجاد کنید. این فایل پیاده سازی متد های مرتبط با سرویس اندروید را دارد. |
۴ | با استفاده از تگ <service…/ > سرویس خود را در فایل AndroidManifest.xml تعریف کنید. یک برنامه می تواند بدون محدودیت یک یا چند سرویس داشته باشد. |
۵ | برای افزودن دو دکمه به برنامه فایل res / layout / activity_main.xml را ویرایش کنید. |
۶ | نیاز به تغییر هرگونه ثابتی در فایل res/values/strings.xml نیست. Android studio از مقادیر رشته ای مراقبت می کند. |
۷ | برنامه را اجرا کنید تا شبیه ساز اندروید راه اندازی شود و نتیجه تغییرات انجام شده در برنامه را ببینید. |
در زیر محتوای فایل 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.
*/
برنامه نویسی اندروید رو قورت بده! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی با ساخت اپلیکیشن و بازی، سه پک زیر جوابت هست:
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 (Android Virtual Device را حین تنظیم محیط برنامه نویسی اندروید ایجاد کرده اید. برای اجرای برنامه، یکی از فایل های activity را باز کرده سپس روی نماد اجرا کلیک کنید. Android studio برنامه را در AVD نصب کرده و آن را اجرا می کند. اگر همه چیز به درستی تنظیم شده باشد، پنجره ای شبیه ساز مانند شکل زیر نمایش می دهد:
اکنون برای شروع سرویس خود ، روی دکمه Start Service کلیک کنید ، این دکمه سرویس را شروع می کند و طبق برنامه نویسی ما در متد ()onStartCommand ، یک پیام Service Started در پایین شبیه ساز به شرح زیر ظاهر می شود –
برای متوقف کردن سرویس می توانید بر روی دکمه Stop Service کلیک کنید.