Android - Dịch vụ
A servicelà một thành phần chạy 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ị phá hủy. Một dịch vụ về cơ bản có thể có hai trạng thái:
Sr.No. | Trạng thái & Mô tả |
---|---|
1 | Started Một dịch vụ là startedkhi một thành phần ứng dụng, chẳng hạn như một hoạt động, khởi động nó bằng cách gọi startService () . Sau 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 khởi động nó bị phá hủy. |
2 | Bound Một dịch vụ là boundkhi 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ụ liên kết cung cấp giao diện máy khách-máy chủ cho phép các thành phần tương tác với dịch vụ, gửi yêu cầu, nhận kết quả và thậm chí làm như vậy trên các quy trình có giao tiếp giữa các quá trình (IPC). |
Một dịch vụ có các phương thức gọi lại vòng đời mà bạn có thể triển khai để theo dõi 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. Sơ đồ bên trái sau đây cho thấy vòng đời khi dịch vụ được tạo bằng startService () và sơ đồ bên phải cho thấy vòng đời khi dịch vụ được tạo bằng bindService (): ( imageesy : android.com)
Để tạo một dịch vụ, bạn tạo một lớp Java mở rộng lớp cơ sở Dịch vụ hoặc một trong các lớp con hiện có của nó. CácServicelớp cơ sở định nghĩa các phương thức gọi lại khác nhau và phương thức quan trọng nhất được đưa ra bên dưới. Bạn không cần phải triển khai tất cả các phương thức gọi lại. Tuy nhiên, điều quan trọng là bạn phải hiểu từng cái và triển khai những cái đó để đảm bảo ứng dụng của bạn hoạt động theo cách mà người dùng mong đợi.
Sr.No. | Gọi lại & Mô tả |
---|---|
1 | onStartCommand() Hệ thống gọi phương thức này khi một thành phần khác, chẳng hạn như một hoạt động, yêu cầu khởi động dịch vụ bằng cách gọi startService () . Nếu bạn triển khai phương thức này, bạn có trách nhiệm dừng dịch vụ khi công việc của nó hoàn thành, bằng cách gọi các 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 bindService () . Nếu bạn triển khai phương pháp này, bạn phải cung cấp một giao diện mà khách hàng sử dụng để giao tiếp với dịch vụ, bằng cách trả về một đối tượng IBinder . Bạn phải luôn triển khai phương thức này, nhưng nếu bạn không muốn cho phép ràng buộc, thì bạn nên trả về null . |
3 | onUnbind() Hệ thống gọi phương thức này khi tất cả các máy khách đã ngắt kết nối khỏi một giao diện cụ thể do dịch vụ xuất bản. |
4 | onRebind() Hệ thống gọi phương thức này khi các khách hàng mới đã kết nối với dịch vụ, sau khi trước đó nó đã được thông báo rằng tất cả đã ngắt kết nối trong onUnbind (Intent) của nó . |
5 | onCreate() Hệ thống gọi phương thức này khi dịch vụ được tạo lần đầu tiên bằng onStartCommand () hoặc onBind () . Cuộc gọi này được yêu cầu để thực hiện thiết lập một lần. |
6 | onDestroy() Hệ thống gọi phương thức này khi dịch vụ không còn được sử dụng và đang bị hủy. Dịch vụ của bạn nên triển khai điều này để dọn dẹp bất kỳ tài nguyên nào như luồng, người nghe đã đăng ký, người nhận, v.v. |
Dịch vụ khung sau đây trình bày từng phương pháp trong vòng đời:
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() {
}
}
Thí dụ
Ví dụ này sẽ hướng dẫn bạn qua các bước đơn giản để chỉ cách tạo Dịch vụ Android của riêng bạn. Làm theo các bước sau để sửa đổi ứng dụng Android mà chúng tôi đã tạo trong chương Ví dụ về Hello World -
Bươc | Sự miêu tả |
---|---|
1 | Bạn sẽ sử dụng Android StudioIDE để tạo ứng dụng Android và đặt tên ứng dụng đó là Ứng dụng của tôi theo gói com.example.tutorialspoint7.myapplication như được giải thích trong chương Ví dụ về Hello World . |
2 | Sửa đổi tệp hoạt động chính MainActivity.java để thêm các phương thức startService () và stopService () . |
3 | Tạo một tệp java mới MyService.java trong gói com.example.My Application . Tệp này sẽ có triển khai các phương pháp liên quan đến dịch vụ Android. |
4 | Xác định dịch vụ của bạn trong tệp AndroidManifest.xml bằng thẻ <service ... />. Một ứng dụng có thể có một hoặc nhiều dịch vụ mà không có bất kỳ hạn chế nào. |
5 | Sửa đổi nội dung mặc định của tệp res / layout / activity_main.xml để bao gồm hai nút trong bố cục tuyến tính. |
6 | Không cần thay đổi bất kỳ hằng số nào trong tệp res / giá trị / string.xml . Android studio chăm sóc các giá trị chuỗi |
7 | Chạy ứng dụng để khởi chạy trình giả lập Android và xác minh kết quả của các thay đổi được thực hiện trong ứng dụng. |
Sau đây là nội dung của tệp hoạt động chính được sửa đổi MainActivity.java. Tệp này có thể bao gồm từng phương pháp cơ bản của vòng đời. Chúng tôi đã thêm các phương thức startService () và stopService () để bắt đầu và dừ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 : ";
/** 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));
}
}
Sau đây là nội dung của MyService.java. Tệp này có thể có triển khai một hoặc nhiều phương pháp được liên kết với Dịch vụ dựa trên các yêu cầu. Hiện tại, chúng ta sẽ chỉ triển khai hai phương thức onStartCommand () và 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();
}
}
Sau đây sẽ là nội dung sửa đổi của tệp AndroidManifest.xml . Ở đây chúng tôi đã thêm thẻ <service ... /> để bao gồm dịch vụ 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 sẽ là nội dung của res/layout/activity_main.xml tệp để bao gồm hai nút -
<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!ứng dụng chúng tôi vừa sửa đổi. Tôi cho rằng bạn đã tạo raAVDtrong 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 hoạt động của dự án của bạn và nhấp vào
Bây giờ để bắt đầu dịch vụ của bạn, hãy nhấp vào Start Servicenút này sẽ bắt đầu dịch vụ và theo lập trình của chúng tôi trong phương thức onStartCommand () , một thông báo Service Started sẽ xuất hiện ở cuối trình mô phỏng như sau:
Để dừng dịch vụ, bạn có thể nhấp vào nút Dừng Dịch vụ.