Services trong Android
Trong Android, service là một component giữ cho ứng dụng chạy ở chế độ nền để thực hiện các hoạt động lâu dài dựa trên yêu cầu. Service sẽ không hiển thị giao diện mà nó sẽ chạy các ứng dụng ở chế độ nền như phát nhạc hoặc xử lý các hoạt động mạng khi người dùng đang chạy các ứng dụng khác.
1. Vòng đời service Android
Trong Android, vòng đời của service sẽ đi theo hai con đường khác nhau là Started hoặc Bound.
Started Service
Một component application, chẳng hạn như một activity gọi phương thức startService()
khi bắt đầu nó sẽ chạy vô thời hạn trong nền ngay cả khi component khởi động bị hủy. Đó là một Started Service.
Chúng ta có thể dừng Started service bằng cách sử dụng phương thức stopService()
, hoặc service có thể tự dừng bằng cách gọi phương thức stopSelf()
. Trong Android, component Started service sẽ thực hiện một thao tác duy nhất và nó sẽ không trả lại bất kỳ kết quả nào cho người gọi.
Bài viết này được đăng tại [free tuts .net]
Bound Service
Một Bound service là khi một component khác gọi phương thức bindService()
. Bound service sẽ chạy miễn là một component ứng dụng khác bị ràng buộc với nó.
Có thể hủy liên kết service bằng cách gọi phương thức unbindService()
. Ngoài ra cũng có thể liên kết nhiều component với một service cùng lúc, service sẽ bị hủy trong trường hợp tất cả các component hủy liên kết.
2. Sơ đồ vòng đời service Android
Sơ đồ sau cho thấy vòng đời của Started service khi nó được tạo bằng startService()
. Và vòng đời của Bound service khi nó được tạo bằng bindService()
.
Khi tạo một service chúng ta cần extends từ một lớp Service cơ sở hoặc một trong các lớp con của nó. Trong quá trình triển khai service, chúng ta phải ghi đè một số phương thức callback, những phương thức này xử lý các khía cạnh chính của vòng đời service và cho phép các component liên kết với service.
3. Tạo một service trong Android
Nói chung, trong Android để tạo một service, chúng ta phải tạo một lớp con của service hoặc sử dụng một trong các lớp con hiện có. Trong Android, các component như activity có thể khởi động service bằng cách gọi phương thức startService()
, sẽ dẫn đến gọi phương thức onStartCommand()
của service.
Sau đây là ví dụ đơn giản về việc tạo một service trong ứng dụng Android.
public class SampleService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { //TODO write your own code return Service.START_NOT_STICKY; } @Override public IBinder onBind(Intent intent) { //TODO for communication return IBinder implementation return null; } }
4. Đăng ký một service trong tệp Manifest
Khi tạo một service, chúng ta phải đăng ký trong file Manifest
của Android bằng phần tử <service>
như dưới đây.
<manifest ... > ... <application ... > <service android:name=".SampleService" /> </application> ... </manifest>
5. Bắt đầu một service
Trong Android, các component như activity, service hoặc receiver có thể bắt đầu service bằng phương thức startService()
. Sau đây là đoạn code mẫu của việc bắt đầu một service bằng phương thức startService.
Intent intent = new Intent(this, MyService.class); startService(intent)
6. Phương thức callback của service trong Android
Trong quá trình xây dựng service ta cần ghi đè một số phương thức callback sau đây.
onStartCommand ()
Hệ thống sẽ gọi phương thức này khi một component khác như activity yêu cầu service bắt đầu bằng cách gọi startService () . Khi phương thức này được thực thi, service sẽ khởi động và chạy vô thời hạn trong nền. Nếu chúng ta thực hiện điều này trong code thì phải dừng service sau khi hoàn công việc bằng cách gọi phương thức stopSelf() hoặc stopService().
Trong Android, phương thức onStartCommand() phải trả về một kiểu Interger, đây là giá trị mô tả cách hệ thống sẽ tiếp tục service trong trường hợp hệ thống hủy nó.
Phương thức onStartCommand() sẽ trả về một giá trị là một trong những hằng số sau.
Tùy chọn | Mô tả |
---|---|
START_STICKY | Nó sẽ khởi động lại service trong trường hợp dữ liệu truyền cho phương thức onStartCommand () là NULL. |
START_NOT_STICKY | Nó sẽ không khởi động lại service và nó hữu ích cho những service chạy định kỳ. Service sẽ khởi động lại khi có lệnh startService (). Đó là cách tốt nhất để tránh service chạy khi không cần thiết. |
START_REDELIVER_INTENT | Nó giống như START_STICKY và nó tạo lại service, gọi onStartCommand() với intent cuối cùng đã được gửi đến service. |
onBind ()
Hệ thống sẽ gọi phương thức này khi một component khác muốn liên kết với service bằng cách gọi bindService()
. Trong quá trình thực hiện phương thức này, chúng ta phải cung cấp giao diện cho khách hàng để liên lạc với service bằng cách trả về một đối tượng IBinder.
onCreate ()
Hệ thống sẽ gọi phương thức này khi service được tạo bằng cách sử dụng phương thức onStartCommand()
hoặc onBind()
. Trong trường hợp nếu service đã chạy, thì phương thức này sẽ không được gọi.
onDestroy ()
Hệ thống sẽ gọi phương thức này khi service không còn được sử dụng và đang bị hủy. Đây là phương thức cuối cùng mà service sẽ nhận được và chúng ta cần triển khai phương thức này trong service của mình để dọn sạch mọi tài nguyên không sử dụng như threads, receivers hoặc listeners.
Nói chung, nếu bắt đầu service bằng phương thức gọi startService()
thì service sẽ chạy liên tục ngay cả khi component khởi động service bị hủy, cho đến khi dừng service bằng cách sử dụng stopService() hoặc nó tự dừng với phương thức stopSelf().
Tương tự, nếu tạo một service bằng phương thức gọi bindService()
, service sẽ chạy miễn là component đó bị ràng buộc với nó. Sau khi service không bị ràng buộc từ tất cả các client, hệ thống sẽ hủy nó.
Trong Android, vòng đời của service là có một tập hợp các phương thức callback cần được triển khai để theo dõi trạng thái service và thực hiện những điều cần thiết trong thời gian thích hợp.
7. Android Skeleton Service
Sau đây là skeleton service mô tả về từng phương thức trong vòng đời.
package com.tutlane.services; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class SampleService extends Service { int mStartMode; // It indicates how to behave if the service is killed IBindermBinder; // interface for clients that bind boolean mAllowRebind; // It indicates whether onRebind should be used @Override public void onCreate() { // The service is being created } @Override public int onStartCommand(Intent intent, int flags, int startId) { // The service is starting, due to a call to startService() return mStartMode; } @Override public IBinder onBind(Intent intent) { // A client is binding to the service with bindService() return mBinder; } @Override public boolean onUnbind(Intent intent) { // All clients have unbound with unbindService() return mAllowRebind; } @Override public void onRebind(Intent intent) { // A client is binding to the service with bindService(), // after onUnbind() has already been called } @Override public void onDestroy() { // The service is no longer used and is being destroyed } }
8. Ví dụ về Service trong Android
Sau đây là ví dụ về việc bắt đầu phát nhạc ở chế độ nền .Khi chúng ta bắt đầu service và nhạc sẽ phát liên tục cho đến khi chúng ta dừng service .
Tạo một ứng dụng Android mới bằng cách sử dụng android studio và đặt tên là Service.
Bây giờ chúng ta cần tạo file service MyService.java
trong đường dẫn \ java \ com.tutlane.service
bằng cách nhấp chuột phải vào thư mục application -> New -> Java Class và đặt tên là MyService.java
.
Hãy nhập nội dung dưới đây cho file này.
MyService.java
package com.tutlane.services; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.provider.Settings; import android.widget.Toast; /** * Created by Tutlane on 02-08-2017. */ public class MyService extends Service { private MediaPlayer player; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Toast.makeText(this, "Service was Created", Toast.LENGTH_LONG).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { player = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI); // This will play the ringtone continuously until we stop the service. player.setLooping(true); // It will start the player player.start(); Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // Stopping the player when service is destroyed player.stop(); Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); } }
Bây giờ mở file Activity_main.xml
từ đường dẫn \ src \ main \ res \ layout
và viết đoạn code sau.
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/btnStart" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="startService" android:layout_marginLeft="130dp" android:layout_marginTop="150dp" android:text="Start Service"/> <Button android:id="@+id/btnstop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="stopService" android:layout_marginLeft="130dp" android:layout_marginTop="20dp" android:text="Stop Service"/> </LinearLayout>
Bây giờ mở file MainActivity.java
từ đường dẫn \ java \ com.tutlane.service
và viết đoạn code sau để thực hiện tùy chỉnh broadcast intents.
MainActivity.java
package com.tutlane.services; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // Start the service public void startService(View view) { startService(new Intent(this, MyService.class)); } // Stop the service public void stopService(View view) { stopService(new Intent(this, MyService.class)); } }
Bây giờ chúng ta cần đăng ký service của mình trong file manifest Android ( AndroidManifest.xml
) bằng cách sử dụng thuộc tính <service>
như được hiển thị bên dưới.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tutlane.services"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" 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>
9 Kết quả của ví dụ về service trong Android
Khi chạy ví dụ trên trong trình giả lập Android sẽ nhận được kết quả như hiển thị bên dưới
Nếu nhấp vào nút START SERVICE, nhạc chuông mặc định sẽ bắt đầu phát và nó sẽ tiếp tục cho đến khi stop service. Đây là cách tạo, bắt đầu hoặc dừng service trong các ứng dụng Android dựa trên yêu cầu .