Դաս 8 – Android Development: Services

0

Service-ը բաղադրիչ է, որը աշխատում է հետին պլանում գործողություններ կատարելու նպատակով առանց կարիք ունենալու համագործակցել օգտատերի հետ և աշխատում է նույնիսկ այն դեպքում, երբ ծրագիրը ոչնչացվել է: Service-ը կարող է, ըստ էության ունենալ երկու վիճակ․

Started

Service-ը սկսվում է, երբ հավելվածի բաղադրիչը, ինչպես օրինակ activity-ն, սկսում է այն կոչ անելով startService (). Սկսվելուց հետո Service-ը կարող է աշխատել հետոին պլանում անորոշ ժամանակով, նույնիսկ այն դեպքում, երբ բաղադրիչը, որը սկսել էր այն ոչնչանա։

Bound

Service-ը սկսվում է, երբ հավելվածի բաղադրիչը, կապում է այն՝ կոչ անելով bindService (). bound service-ը առաջարկում է client-server ինտերֆեյս, որը թույլ է տալիս բաղադրիչներին համագործակցել service-ի հետ, հարցումներ ուղարկել, արդյունքներ ստանալ և նույնիսկ անել այս ամբողջ գործընթացները interprocess communication-ի հետ (IPC)։

Service-ը ունի կյանքի ցիկլի Callback մեթոդներ, որոնք դուք կարող եք իրականացնել service-ի վիճակի փոփոխությունները վերահսկելու համար և կարող եք իրականացնել աշխատանքը համապատասխան փուլում: Ձախ կողմում գտնվող դիագրաման ցույց է տալիս կյանքի ցիկլը, երբ service-ը ստեղծված է startService()-ով իսկ աջ կողմի դիագրաման, երբ ծառայությունը ստեղծված է bindService()-ով:

services

Service ստեղծելու համար դուք ստեղծում եք Java class, որը լայնարձակում է Service base class-ը կամ արդեն գոյություն ունեցող ենթադասերից որևէ մեկը։ Service base class-ը սահմանում է տարբեր հետկանչի՝ Callback, մեթոդներ։ Դրանցից առավել կարևորները ներկայացված են ստորև։ Իհարկե անհրաժեշտ չէ իրականացնել բոլոր Callback մեթոդները: Սակայն կարևոր է, որ դուք հասկանաք դրանցից յուրաքանչյուրը և իրականացնեք նրանք, որոնք անհրաժեշտ են ծրագրի ճշգրիտ անշխատանքի համար։

Callback & Description

onStartCommand()

Համակարգը դիմում է այս մեթոդին, երբ մեկ այլ բաղադրիչ ինչպես օրինակ activity-ին պահանջում է, որպեսզի service-ը սկսվի, կոչ անելով startService ()-ին։ Եթե իրականացնեք այս մեթոդը, ապա ձեր պարտքն է կանգնեցնել service-ը երբ վերջինիս աշխատանքը ավարտվի։ Կանգնեցնելու համար դիմեք stopSelf() կամ stopService() մեթոդներին։

onBind()

Համակարգը դիմում է այս մեթոդին, երբ մեկ այլ բաղադրիչ ցանկանում է կապվել service-ի հետ կոչ անելով bindService()-ին։ Եթե իրականացնեք այս մեթոդը, ապա վերադարձնելով IBinder object-ը պետք է տրամադրեք այնպիսի ինտերֆեյս, որը հաճախորդները կօգտագործեն service-ի հետ շփվելու համար։ Միշտ իրականացնեք այս մեթոդը, բայց եթե չեք ցանկանում թույլ տալ binding-ը, ապա վերադարձեք null-ին:

onUnbind()

Համակարգը դիմում է այս մեթոդին, երբ բոլոր հաճախորդները անջատվել են ինտերֆեյսից, որը հրապարակված էր Service-ի կողմից։

onRebind()

Համակարգը դիմում է այս մեթոդին, երբ բոլոր հաճախորդները միացել են Service-ին, այն բանից հետո, որ ավելի վաղ նշվել է, որ բոլորը անջատել են իրենց onUnbind(Intent)

onCreate()

Համակարգը դիմում է այս մեթոդին, երբ Service-ը ստեղծվում է առաջին անգամ օգտագործելով onStartCommand() կամ onBind()-ը։ Այն պահանջվում է մեկ անգամյա set-up-ի համար։

onDestroy()

Համակարգը դիմում է այս մեթոդին, երբ Service-ը այլևս չի օգտագործվում և ոչնչացվել է։ service-ը պետք է մաքրի ցանկացած ռեսուրսներ, ինչպիսիք են threads, registered listeners, receivers և այլն։

Այս կմախքը ցույց է տալիս service-ի յուրաքանչյուր մեթոդի կյանքի ցիկլը՝

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() {

   }
}

Օրինակ

Այս օրինակը պարզ քայլերով ցույց է տալիս, թե ինչպես ստեղծել Android Service։ Հետևեք այս քալերին մեր կողմից նախորդ դասերում արդեն իսկ ստեղծված Android հավելվածը (Hello World օրինակ) ձևափոխելու համար․

1․Դուք պետք է օգտագործեք Android StudioIDE Android հավելված ստեղծելու համար և անվանեք այն  My Application՝  com.example.tutorialspoint7.myapplication փաթեթի տակ ինչպես նկարագրված է Hello World դասընթացում։

2․Մոդիֆիկացրեք main activity ֆայլը  MainActivity.java  ավելացնելով  startService()  և  stopService()  մեթոդները։

3․Ստեղծեք նոր java ֆայլ MyService.java՝ com.example.My Application փաթեթի տակ։ Այս ֆայլը կունենա ներդրում Android service-ի հետ կապված մեթոդներում։

4․Սահամանեք Ձեր service-ը AndroidManifest.xml ֆայլում օգտագործելով <service…/> թեգը։ Հավելվածը կարող է ունենալ մեկ կամ մեկից ավել service-ներ առանց որևէ սահմանափակումնների։

5․Մոդիֆիկացրեք res/layout/activity_main.xml ֆայլը գծային դասավորություն մեջ երկու կոճակ ներառելու համար։

6․Կարիք չկա ձևափոխելու որևէ հաստատուններ՝ constants, res/values/strings.xml  ֆայլում։ Android studio-ն կհոգա դրա մասին։

7․Գործարկեք հավելվածը Android emulator-ում կատարված փոփոխությունների արդյունքները ստուգելու համար։

Հաջորդիվ ներկայացնում ենք մոդիֆիկացված main activity ֆայլը MainActivity.java. Ֆայլը կարող է ներառել ֆունդամենտալ կյանքի ցիկլերի մեթոդներից յուրաքանչյուրը։ Մենք ավելացրել ենք startService() և stopService() մեթոդները service-ը սկսելու կամ ավարտելու համար։

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-ի կոնտենտն է։ Այս ֆայլը կարող է ունենալ մի կամ մի քանի մեթոդի իրականացում կախված Service-ի պահանջարքների հետ։ Այժմ մենք իրականացնելու ենք միայն երկու մեթոդ՝ 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…/> թեգը մեր 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>

Փորձենք աշխատացնել մեր կողմից քիչ առաջ ձևափոխված Hello World! Հավելվածը: Ենթադրում ենք, որ դուք ստեղծել եք ձեր AVD-ն environment setup-ի ժամանակ։ Գործարկեք ծրագիրը Android studio-ից, բացեք ձեր project activity ֆայլերից մեկը և սեղմեք Run։ Android studio-ն կտեղադրի ծրագիրը ձեր AVD-ում և կսկսի այն։ Եթե ամեն ինչ կարգին է Ձեր setup-ի և հավելվածի հետ, ապա կցուցադրվի հետևյալ Emulator պատուհանը

services1

Այժմ սկսենք մեր service-ը։ Սեղմեք Start Service կոճակին, որը կսկսի service-ը onStartCommand() մեթոդով։ Ներքևում կհայտնվի Service Started հաղորդագրությունը։ Ահա այսպես

services2

Service-ը վերջացնելու համար սեղմեք Stop Service կոճակը։

Հարգելի ընթերցող, խնդրում ենք չմոռանալ like տալ մեր ֆեյսբուքյան էջին, քանի որ նորությունների մեծ մասը առաջինը տեղադրվում է հենց այնտեղ։ Ինչպես նաև հետևեք մեզ այլ սոցիալական ցանցերում և, իհարկե, գրանցվեք մեր բլոգում։

Share.