گروه مقاله : اندروید
تاريخ انتشار : 1396/04/12 - 17:00
كد :7679

اجرای برنامه در پس زمینه گوشی

سرویس ها به شما اجازه میدهد تا بصورت دائمی کد هایی را در گوشی اجرا کنید به این ترتیب کاربر میتواند هنگام رخ دادن اتفاقی مانند دریافت پیام به نرم افزار شما لینک شود.

اجرای کد در پس زمینه گوشی

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

سرویس یک کامپوننت است که در پسزمینه اجرا میشود ، سرویس ها نیاز به پردازش طولانی دارند، بنابراین در پسزمینه اجرا میشوند تا کاربران را تحت تاثیر قرار ندهند، معمولا یک سرویس بعد از پایان اجرای نرم افزار به کار خود ادامه داده و متوقف نمی شود. یک سرویس میتواند دو 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 میگذارید، این اپلیکیشن در شاخه ی  packagecom.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 کلیک کنید.

شرکت برنامه نویسی سارگون مجری برنامه نویسی اندروید بصورت حرفه ای با ما تماس بگیرید.  

نظرات كاربران :