شما اینجا هستید: خانه » برنامه نویسی اندروید » مفاهیم اولیه برنامه نویسی اندروید » سرویس ها در اندروید ( Service )

سرویس ها در اندروید ( Service )

 

فایل ویدیویی این آموزش بطور کامل با زبان فارسی و با کیفیت بالا اضافه شد میتوانید از لینک زیر دانلود کنید : 

4000 تومان – خرید
 

 

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

هر سرویس اساسا" از دو حالت اساسی تشکیل شده است :

حالت توضیحات
Started وقتی یک سرویس شروع میکند . از طریق کامپوننت های دیگر مانند اکتیویتی و از طریق صدا زدن متد startService() شروع به فعالیت میکند. زمانی که سرویس شروع کرد ، به طور نامحدودی در پس زمینه میتواند ادامه پیدا کند حتی اگر اکتیویتی بسته شود منظور اکتیویتی هست  که این سرویس را صدا کرده و اعلام کرده است که آغاز به کار کند
Bound  

 

سرویس ها نیز همانند اکتیویتی ها ، چرخه ی حیات خاص خود را دارند ، متدهایی که در طول چرخه ی حیات سرویس اجرا میگردند به برنامه نویسان کمک میکنند تا سرویس های خود را پیاده سازی کنند . در دیاگرام زیر به چرخه ی حیات سرویس اشاره میکنیم که با متد startService() ساخته میشوند :

چرخه ی حیات سرویس ها

چرخه ی حیات سرویس ها

برای ساخت یک سرویس در اندروید شما باید یک کلاس جاوا بسازید و از  کلاس Service ارث بری کنید . یک سرویس دارای متدهای مختلفی هست و تعدادی از مهمترین متدهای یک سرویس در جدول زیر آمده است ، شما مجبور نیستید تمام متدهای زیر را ایجاد کنید ولی بسته به نیاز خود میتوانید از آنها بهره ببرید ، به هر حال یادگیری موارد زیر در آینده حتما برای شما کاربردی خواهد بود : 

متد توضیحات
onStartCommand() این متد زمانی توسط سیستم اجرا میگردد که سرویس توسط کامپوننت های دیگر مانند یک اکتیویتی ، اجرا شود . این اجرا توسط فراخوانی متد startService() انجام میگیرد . اگر شما از این متد استفاده کنید مسئولیت متوقف کردن سرویس بعد از اتمام کارش به عهده ی خودتان هست ، متوقف کردن سرویس توسط متد های stopSelf() یا stopService() انجام میگیرد 
onBind()

این متد توسط سیستم زمانی که بخواهید سرویس با کامپوننت های دیگر اندروید عمل bind را انجام دهد باید با صدا زدن متدbindService() این عمل را انجام میدهد، اگر شما از این متد استفاده میکنید باید یک userinterface جهت برقراری ارتباط با کاربر استفاده کنید ، باید مقدار بازگشتی نیز شی IBinder  باشد .

شما بایستی همیشه این متد را به کار ببرید ولی اگر نمیخواهید عمل bind انجام بگیرد کافیست مقدار null برگردانید! 

onUnbind() زمانی این متد توسط سیستم اجرا میشود که تمام کاربرها ، از یک رابط کاربری سرویس خاص ، قطع شده باشند . 
onRebind() این متد زمانی رخ میدهد که کاربر جدیدی به رابط کاربری سرویس متصل شود . همانطور که در بالا گفتم زمان رخداد onUnbind(Intent) کاربران از سرویس قطع رابطه شده بودند 
onCreate() این متد زمانی رخ میدهد که سرویس برای اولین بار فراخوانی و ساخته شود با استفاده از متد های onStartCommand() یا onBind()
onDestroy() این متد زمانی رخ میدهد که استفاده از سرویس به پایان رسیده و اصطلاحا" سرویس نابود شده است . سرویس باید از این متد استفاده کند برای اینکه بتواند منابعی مانند  threads, registered listeners, receivers را آزاد کند

 

مثال زیر اسکلتی از یک سرویس اندرویدی را نمایش میدهد که از متدهای چرخه های حیات سرویس استفاده کرده است : 

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 که در ابتدا ساختیم را در نظر بگیرید و مراحل زیر را روی آن اعمال کنید : 

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

 

در زیر کد ویرایش شده ی فایل src/com.example.My Application/MainActivity.java را مشاهده میکنید . این فایل میتواند حاوی تمام متدهای چرخه ی حیات باشد ولی ما فقط دو متد startService() و stopService() را برای شروع و متوقف کردن برنامه اضافه کرده ایم .

package com.example.My Application;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;

public class MainActivity extends Activity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
   }
   
   @Override
   public boolean onCreateOptionsMenu(Menu menu) {
      getMenuInflater().inflate(R.menu.activity_main, menu);
      return true;
   }

   // Method to start the service
   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));
   }
}

کدهای زیر محتوای src/com.example.My Application/MyService.java خواهند بود . این فایل میتواند شامل یک یا چند متد مورد نیاز سرویس های اندرویدی باشد . ما دو متد را به این سرویس اضافه میکنیم onStartCommand()  و onDestroy() :

package com.example.My Application;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;

public class MyService extends Service {
   
   @Override
   public IBinder onBind(Intent arg0) {
      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…/>  را برای معرفی کردن سرویس جدید اضافه کردیم تا معرفی شود : 

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.MyApplication"
   android:versionCode="1"
   android:versionName="1.0" >
   
   <uses-sdk
      android:minSdkVersion="13"
      android:targetSdkVersion="22" />
   
   <application
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
       
       <activity
          android:name=".MainActivity"
          android:label="@string/title_activity_main" >
       
          <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="Samenta.ir "
         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>

و کدهای زیر نیز محتویات res/values/strings.xml هستند که دو مقدار جدید اضافه شده است : 

<resources>
    <string name="app_name">My Application</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">MainActivity</string>
</resources>

بیایید برنامه ویرایش شده ی Hello World! را اجرا کنیم نتیجه ی کار تقریبا به شکل زیر خواهد بود : 

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

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

 

و بعد از اینکه دکمه ی Start Service کلیک میشود : 

Service در اندروید

Service در اندروید

 

ما سایت سامنتا را با هدف انتقال دانش و تجربیات خود از بهترین متدهای آموزشی دنیا راه اندازی کردیم . محتویات این سایت از ابتدا براساس سلیقه ، نظرات و پیشنهادهای کاربران ساخته شده است . به امید روزی که سیستم آموزشی ایران متحول و از شیوه های نوین آموزشی استفاده کنند

http://Samenta.ir

3 دیدگاه

  1. ممنون مطلب جالبی بود

  2. ایشالا که موفق باشی آقای نیکزاد سایتتون عالیه

پاسخ دهید

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