Services trong Android

0
203

Một dịch vụ là một thành phần chạy dưới nền để thực hiện các hoạt động lâu dài mà không cần tương tác với người dùng và nó hoạt động ngay cả khi ứng dụng bị hủy. Một dịch vụ cơ bản có thể có hai trạng thái –

STT Trang thái và mô tả
1 Started

Một dịch vụ được started khi một thành phần của ứng dụng, chẳng hạn như một activity, bắt đầu nó bằng cách gọi startService(). Một khi bắt đầu, một dịch vụ có thể chạy trong nền vô thời hạn, ngay cả khi thành phần bắt đầu nó bị phá hủy.

2 Bound

Một dịch vụ là bound khi một thành phần ứng dụng liên kết với nó bằng cách gọi bindService(). Một dịch vụ ràng buộc cung cấp giao diện client-server cho phép các thành phần tương tác với dịch vụ, gửi yêu cầu, có được kết quả, và thậm chí làm như vậy qua các quá trình với interprocess communication (IPC).

Một dịch vụ có các phương thức gọi lại chu kỳ mà bạn có thể thực hiện để giám sát các thay đổi trong trạng thái của dịch vụ và bạn có thể thực hiện công việc ở giai đoạn thích hợp. Biểu đồ dưới đây cho thấy chu kì  khi dịch vụ được tạo với startService () và biểu đồ bên phải cho thấy chu kỳ khi dịch vụ được tạo bằng bindService (): (hình ảnh tham khảo: android.com)

Để tạo một dịch vụ, bạn tạo một lớp Java thừa kế lớp cơ sở Service hoặc một lớp con hiện có của nó. Lớp cơ sở Service xác định các phương thức gọi lại khác nhau và quan trọng nhất được đưa ra dưới đây. Bạn không cần thực hiện tất cả các phương pháp gọi lại. Tuy nhiên, điều quan trọng là bạn phải hiểu từng chiến dịch và thực hiện những điều đảm bảo ứng dụng của bạn hoạt động theo cách mà người dùng mong đợi.

STT Gọi lại và mô tả
1 onStartCommand()

Hệ thống gọi phương pháp này khi một thành phần khác, chẳng hạn như một activity, yêu cầu bắt đầu dịch vụ, bằng cách gọi startService(). Nếu bạn thực hiện phương thức này, bạn có trách nhiệm ngừng dịch vụ khi công việc đã thực hiện bằng cách gọi phương thức stopSelf() hoặc stopService().

2 onBind()

Hệ thống gọi phương thức này khi một thành phần khác muốn liên kết với dịch vụ bằng cách gọi hàm bindService(). Nếu bạn thực hiện phương pháp này, bạn phải cung cấp một giao diện cho khách hàng sử dụng để giao tiếp với dịch vụ, bằng cách trả lại một đối tượng IBinder. Bạn phải luôn luôn thực hiện phương thức này, nhưng nếu bạn không muốn cho phép ràng buộc, bạn nên trả về null.

3 onUnbind()

Hệ thống gọi phương pháp này khi tất cả các máy khách đã ngắt kết nối từ một giao diện cụ thể do dịch vụ xuất bản.

4 onRebind()

Hệ thống gọi phương pháp này khi khách hàng mới kết nối với dịch vụ, sau khi nó đã được thông báo rằng tất cả đã bị ngắt kết nối trong onUnbind của nó (Intent).

5 onCreate()

Hệ thống gọi phương pháp này khi dịch vụ được tạo ra lần đầu tiên bằng cách sử dụng onStartCommand() hoặc onBind(). Cuộc gọi này được yêu cầu để thực hiện một lần cài đặt.

6 onDestroy()

Hệ thống gọi phương pháp này khi dịch vụ không còn sử dụng nữa và đang bị phá hủy. Dịch vụ của bạn nên thực hiện việc này để xóa bất kỳ tài nguyên nào như threads, registered listeners, receivers, vv

Dịch vụ  dưới đây thể hiện từng phương thức trong một chu kỳ –

package com.tutorialspoint;



import android.app.Service;

import android.os.IBinder;

import android.content.Intent;

import android.os.Bundle;



public class HelloService extends Service {

  

   /** Chỉ ra cách cư xử nếu dịch vụ bị giết */

   int mStartMode;

  

   /** Giao diện cho các máy khách kết nối */

   IBinder mBinder;    

  

   /** Cho biết onRebind có được sử dụng */

   boolean mAllowRebind;



   /** Gọi khi dịch vụ đang được tạo. */

   @Override

   public void onCreate() {

    

   }



   /** Dịch vụ đang bắt đầu từ một cuộc gọi đến startService ()*/

   @Override

   public int onStartCommand(Intent intent, int flags, int startId) {

      return mStartMode;

   }



   /** Một khách đang liên kết với dịch vụ bằng bindService() */

   @Override

   public IBinder onBind(Intent intent) {

      return mBinder;

   }



   /** Được gọi khi tất cả các khách đã không còn liên kết với dịch vụ bằng cách gọi unbindService() */

   @Override

   public boolean onUnbind(Intent intent) {

      return mAllowRebind;

   }



   /** Được gọi là khi máy khách đang liên kết dịch vụ bằng bindService() */

   @Override

   public void onRebind(Intent intent) {



   }



   /** Được gọi khi Dịch vụ không còn được sử dụng nữa và đang bị tiêu hủy */

   @Override

   public void onDestroy() {



   }

}

Ví dụ

Ví dụ này sẽ đưa bạn qua các bước đơn giản để tạo dịch vụ Android của riêng bạn. Thực hiện theo các bước sau để sửa đổi ứng dụng Android mà chúng tôi đã tạo trong ví dụ Hello World –

Bước Mô tả
1 Bạn sẽ sử dụng Android StudioIDE để tạo một ứng dụng Android và đặt tên nó là My Application dưới một gói com.example.tutorialspoint7.myapplication như được giải thích trong chương trình Hello World Example.
2 Chỉnh sửa main activity file MainActivity.java để gọi phương thức startService() and stopService().
3 Tạo một file java mới MyService.java bên trong gói com.example.My Application. Tệp này sẽ thực hiện các phương thức liên quan đến dịch vụ Android.
4 Định nghĩa service của bạn trong file AndroidManifest.xml sử dụng tag <service…/> . Một ứng dụng có thể có một hoặc nhiều dịch vụ mà không bị hạn chế.
5 Chỉnh sửa nội dung mặc định của file res/layout/activity_main.xml để khai báo 2 buttons trong linear layout.
6 Không cần thay đổi bất kỳ hằng số nào trong file res/values/strings.xml.
7 Chạy ứng dụng để khởi chạy bộ giả lập Android và xác minh kết quả của những thay đổi được thực hiện trong ứng dụng.

Sau đây là nội dung của tệp main activity MainActivity.java. Tập tin này có thể bao gồm các phương thức trong một chu kỳ cơ bản. Chúng tôi đã thêm các phương thức startService()stopService() để bắt đầu và ngừng dịch vụ.

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 : ";

   /** Được gọi khi activity được tạo lần đầu. */
   @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));
   }

   // Phương thức để dừng service
   public void stopService(View view) {
      stopService(new Intent(getBaseContext(), MyService.class));
   }
}

Sau đây là nội dung của MyService.java. Tệp này có thể thực hiện một hoặc nhiều phương thức liên quan đến Service dựa trên yêu cầu. Bây giờ chúng ta sẽ thực hiện hai phương pháp 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;

public class MyService extends Service {
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }
	
   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      // Để nó tiếp tục chạy cho đến khi nó dừng lại.
      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();
   }
}

Sau đây nội dung sửa đổi của file AndroidManifest.xml. Ở đây chúng tôi đã add tag <service…/> để khai báo service của chúng tôi −

<?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>

Sau đây là nội dung của file res/layout/activity_main.xml  để khai báo 2 buttons −

<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>

Hãy thử chạy Hello World của chúng tôi đã sửa đổi! Tôi cho rằng bạn đã tạo ra AVD của bạn trong khi thiết lập môi trường. Để chạy ứng dụng từ Android studio, hãy mở một trong các tệp activity của dự án và nhấp vào Icon Run Android StudioRun từ thanh công cụ. Android Studio cài đặt ứng dụng trên AVD của bạn và bắt đầu ứng dụng đó và nếu mọi thứ đều ổn với thiết lập và ứng dụng của bạn, nó sẽ hiển thị cửa sổ Emulator sau –

Android Service Demo

Bây giờ để bắt đầu dịch vụ của bạn, kích nút Start Service, nó sẽ bắt đầu dịch vụ  theo phương thức onStartCommand() của chúng tôi, một thông báo Service Started sẽ xuất hiện ở dưới cùng của trình mô phỏng như sau –

Android Service Start

Để dừng dịch vụ, bạn có thể nhấp vào nút Stop Service.

Chúc bạn thành công!

This site uses Akismet to reduce spam. Learn how your comment data is processed.