سرویس ها در اندروید

سرویس کامپوننتی است برای اجرای عملیات طولانی مدت که بدون اینکه نیاز باشد با کاربر تعامل کند، در پس زمینه اجرا می شود.

شماره حالت و توضیح
۱ Started

یک سرویس زمانی شروع شده یا Started است که یک کامپوننت اپلیکیشن، مثلا یک اکتیویویتی آن را با فراخوانی متد startService() اجرا کرده باشد. زمانی که سرویش شروع شد، می تواند بدون محدودیت در پس زمینه اجرا شود، حتی زمانی که کامپوننت اجرا کننده سرویس نابود شده باشد.

۲ Bound

یک سرویس زمانی bound شده است که یک کامپوننت اپلیکیشن با استفاده از متد bindService() آن را به خود bind یا متصل کرده باشد. سرویسی که bound شده یک رابط کلاینت سروری ارائه می دهد که به کامپوننت ها این اجازه را می دهد که با سرویس تعامل انجام دهند. مثلا درخواست هایشان را به سرویس ارسال کنند، پاسخ ها را از سرویس دریافت کنند و حتی با با استفاده از ارتباط بین پردازه ایپردازه ها کار کنند (IPC) ، با پردازه ها کار کنند.

 

یک سرویس دارای متد هایی برای چرخه اجرا می باشد که به شما این اجازه را می دهد که تغییرحالت های سرویس را زیر نظر داشته باشید و کارهایی را در مرحله مناسب انجام دهید. در شکل زیر، دیاگرام سمت چپ، چرخه اجرای سرویس زمانی که با استفاده از متد startService() ایجاد شده است را نشان می دهد و دیاگرام سمت راست چرخه اجرای سرویس وقتی که سرویس با استفاده از متد bindService() ایجاد شده است را نشان می هد.

چرخه اجرای سرویس

 

برای ایجاد سرویس باید یک کلاس ایجاد کنید که از کلاس Service  یا کلاسی که از یکی از زیر کلاس های Service مشتق شده باشد ( ارث بری داشته باشد ). کلاس Service متد های مختلفی تعریف کرده که مهترین متد های آن در جدل زیر توضیح داده شده است. نیازی نیست که همه ی متد ها را پیاده سازی کنید. به هر حال مهم است که هر کدام از متدها را درک کرده و آن هایی که اپلیکیشن شما به آن احتیاج دارد را پیاده سازی کنید.

شماره متد و توضیح
۱ onStartCommand()

سیستم زمانی این متد را صدا می زند که یک کامپوننت دیگر – مثلا یک اکتیویتی – با فراخوانی متد startService() درخواست کرده که سرویس شروع شود. اگر شما این متد را پیاده سازی کنید، مسئولیت متوقف کردن سرویس  با استفاده از متدهای stopSelf() یا stopService()  وقتی که سرویس کارش تمام شد به عهده شما می باشد.

۲ onBind()

سیستم زمانی این متد را فراخوانی می کند که یک کامپوننت دیگر با فراخوانی متد bindService() بخواهد به سرویس متصل شود. شما باید یک interface  ارائه دهید که کاربران بتوانند از طریق آن با برگرداندن یک شی IBinder ، با سرویس ارتباط برقرار کنند. شما همیشه باید این متد را پیاده سازی کنید، اما اگر نمی خواهید کامپوننتی به سرویس متصل شود، باید در این متد null را برگردانید.

۳ onUnbind()

سیستم زمانی این متد را فراخوانی می کند که همه کلاینت ها اتصالشان با یک interface خاص از سرویس را قطع کرده باشند.

۴ onRebind()

سیستم زمانی این متد را فراخوانی می کند که کلاینتی بعد از این که اتصالش با سرویط قطع شد و متد  onUnbind(Intent) فراخوانی شد، مجددا به سرویس متصل شده باشد.

۵ onCreate()

سیستم زمانی این متد را فراخوانی می کند که سرویس برای اولین بار با استفاده از متد های onStartCommand() یا onBind() ایجاد شود. فراخوانی این متد برای انجام کارهایی که فقط یک بار در زمان ایجاد سرویس لازم است انجام شود، ضروری است.

۶ onDestroy()

سیستم زمانی این متد را فراخوانی می کند که سرویس دیگر استفاده نمی شود و نابود شده است. سرویس شما باید این متد را برای پاک سازی کردن هر نوع ریسورسی از قبیل threadها، listenerهای ثبت شده، receiverها و … ، پیاده سازی کند.

 

ساختار سرویس زیر هر کدام از متد های چرخه اجرا آن را نشان می دهد.

 

package com.app2app;

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 ایجاد کردیم را ویرایش کنیم.

گام توضیح
۱ ایجاد یک پروژه اپلیکیشن اندروید  در اندروید استدیو و نامگذاری آن به MyApplication و پکیجش به com.example.app2app.myapplication ، همانطور که در آموزش Hello World توضیح داده شد.
۲ ویرایش فایل MainActivity.java یا همان اکتیویتی اصلی اپلیکیشن برای اضافه کردن متد startService() و stopService() به آن.
۳ ایجاد یک فایل جدید جاوا به نام  MyService.java در پکیج com.example.app2app.myapplication. این فایل متد های مربوط به سرویس اندروید را پیاده سازی می کند.
۴ تعریف سرویستان در فایل AndroidManifest.xml با استفاده از تگ <service…/>. یک اپلیکیشن بدون هیچ محدودیتی می تواند یک یا بیشتر از یک سرویس داشته باشد.
۵ ویرایش محتوای پیش فرض فایل res/layout/activity_main.xml برای اضافه کردن دو دکمه در Relative Layout.
۶ نیازی به تغییر هیچ چیزی در فایل res/values/strings.xml نیست. اندروید استدیو مقادیر این فایل را مدیریت می کند.
۷ اپلیکیشن را روی گوشی اجرا کنید و تغییرات ایجاد شده در اپلیکیشن را بررسی کنید.

 

در زیر کد ویرایش شده فایل اکتیویتی اصلی یا همان MainActivity.java را می بینید. این فایل می تواند شامل هر کدام از متد های اساسی چرخه اجرای اپلیکیشن باشد. ما برای اجرا کردن و متوقف کردن سرویس متد های startService() و stopService() را به آن اضافه کرده ایم.

 

package com.example.app2app.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 را می بینید. این فایل می تواند یک یا بیشتر از یک متد مزبوط به سرویس پایه یا همان کلاس Service را پیاده سازی کند. فعلا ما قصد داریم دو متد onStartCommand() و onDestroy() را پیاده سازی کنیم.

 

package com.example.app2app.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();
   }
}

در زیر کد ویرایش شده فایل AndroidManifest.xml را می بینید. در اینجا ما تگ  <service…/> را که سرویسمان را در بر می گیرد را اضافه کرده ایم.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.app2app.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>

 

اجازه بدهید اپلیکیشن تغییر داده شده Hello World را اجرا کنیم. برای اجرای اپلیکیشن، در اندروید استدیو یکی از فایل های اکتیویتی پروژه را باز کنید و بر روی آیکن Run دکمه Run که در تولبار قرار دارد کلیک کنید. اندروید استدیو اپلیکیشن را بر روی گوشی نصب کرده، و اگر همه ی کارها را درست انجام داده باشید برنامه در صفحه گوشی اپلیکیشن را مانند شکل زیر خواهید دید.
برنامه آموزشی سرویس ها در اندروید

 

حالا روی دکمه Start Service کلیک کنید. این کار سرویس را اجرا سرویس شده و طبق کدی که در متد  onStartCommand() نوشتیم ، پیام Service Started در پایین صفحه گوشی ظاهر می شود.

برنامه آموزشی سرویس ها در اندروید
برای متوقف کردن سرویس می توانید بر روی دکمه Stop Service کلیک کنید.

امید فرجی

سلام، امید فرجی هستم از همدان. بیشتر از 7 سال میشه که در حوضه برنامه نویسی جاوا و اندروید فعالیت دارم و در این مدت پروژه های تجاری مختلفی انجام دادم. همچنین از سال 91 سایت آموزش تخصصی جاوا را راه اندازی کردم و در خدمت شما هستم. امیدوارم مفید بوده باشم. برای سفارش پروژه هاتون باهام تماس بگیرید.

شما ممکن است این را هم بپسندید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اگر به دنبال پروژه های آماده هستید از فروشگاه ما دیدن کنید رد کردن