Các service trong Android là một thành phần đặc biệt tạo điều kiện cho ứng dụng chạy ở chế độ nền để thực hiện các tác vụ hoạt động lâu dài.
Mục đích chính của service là đảm bảo rằng ứng dụng vẫn hoạt động trong nền để người dùng có thể vận hành nhiều ứng dụng cùng một lúc.
Giao diện người dùng không được mong muốn đối với các service android vì nó được thiết kế để vận hành các quy trình chạy lâu dài mà không có bất kỳ sự can thiệp nào của người dùng.
Một service có thể chạy liên tục trong nền ngay cả khi ứng dụng đó bị đóng hoặc người dùng chuyển sang ứng dụng khác. Hơn nữa, các thành phần ứng dụng có thể tự liên kết với service để thực hiện giao tiếp giữa các quá trình (IPC).
Các bài viết liên quan:
Có một sự khác biệt lớn giữa các service Android và các threads, không được nhầm lẫn giữa hai service này. Threads là một tính năng được cung cấp bởi Hệ điều hành để cho phép người dùng thực hiện các hoạt động ở chế độ nền. Mặc dù service là một thành phần android thực hiện một hoạt động lâu dài mà người dùng có thể không biết vì nó không có giao diện người dùng.
Ví dụ: phần mềm nghe nhạc
Các loại Android service
1. Foreground Services:
Các services thông báo cho người dùng về các hoạt động đang diễn ra của nó được gọi là services Foreground. Người dùng có thể tương tác với services bằng các thông báo được cung cấp về tác vụ đang diễn ra. Chẳng hạn như khi tải xuống tệp, người dùng có thể theo dõi tiến trình tải xuống và cũng có thể tạm dừng và tiếp tục quá trình.
2. Background Services:
Các Background services nền không yêu cầu bất kỳ sự can thiệp nào của người dùng. Các services này không thông báo cho người dùng về các tác vụ nền đang diễn ra và người dùng cũng không thể truy cập chúng. Quá trình như lên lịch đồng bộ hóa dữ liệu hoặc lưu trữ dữ liệu thuộc services này.
3. Bound Services:
Loại services android này cho phép các thành phần của ứng dụng như hoạt động tự ràng buộc với nó. Các services bound thực hiện công việc của nó miễn là có ứng dụng liên kết với nó. Nhiều thành phần được phép tự liên kết với một services tại một thời điểm. Để liên kết một thành phần ứng dụng với một phương thức service bindService () được sử dụng.
Vòng đời của các services Android
Trong android, các services có 2 con đường khả thi để hoàn thành vòng đời của nó là Bắt đầu và Bị ràng buộc.
1. Started services (services không bị ràng buộc):
Bằng cách đi theo đường dẫn này, một services sẽ bắt đầu khi một thành phần ứng dụng gọi phương thức startService (). Sau khi được khởi tạo, services có thể chạy liên tục trong nền ngay cả khi thành phần bị phá hủy, nguyên nhân gây ra sự khởi động của services. Hai tùy chọn có sẵn để ngừng thực thi services:
Bằng cách gọi phương thức stopService (), services có thể tự dừng bằng cách sử dụng phương thức stopSelf ().
2. Bounded services:
Nó có thể được coi như một máy chủ trong giao diện máy khách-máy chủ. Bằng cách đi theo đường dẫn này, các thành phần ứng dụng android có thể gửi yêu cầu đến services và có thể tìm nạp kết quả. Một services được gọi là bị bound khi một thành phần ứng dụng tự liên kết với một services bằng cách gọi phương thức bindService (). Để ngừng thực thi services này, tất cả các thành phần phải tự hủy liên kết khỏi services bằng cách sử dụng phương thức unbindService ().
Các nguyên tắc cơ bản của các services Android
Một services do người dùng định nghĩa có thể được tạo thông qua một lớp bình thường đang mở rộng class services. Hơn nữa, để thực hiện các hoạt động của services trên các ứng dụng, có một số phương thức gọi lại cần được ghi đè. Sau đây là một số phương pháp quan trọng của services Android:
onStartCommand ()
Android services gọi phương thức này khi một thành phần (ví dụ: activity) yêu cầu bắt đầu một services bằng startService (). Sau khi services được bắt đầu, nó có thể bị dừng một cách bằng cách sử dụng các phương thức stopService () hoặc stopSelf ().
onBind ()
Phương thức này là bắt buộc để triển khai trong android services và được gọi bất cứ khi nào một thành phần ứng dụng gọi phương thức bindService() để ràng buộc chính nó với một services. Giao diện người dùng cũng được cung cấp để giao tiếp với services một cách hiệu quả bằng cách trả về một đối tượng IBinder. Nếu ràng buộc của services không được yêu cầu thì phương thức phải trả về null.
onUnbind ()
Hệ thống Android gọi phương thức này khi tất cả các client bị ngắt kết nối khỏi một interface service cụ thể.
onRebind ()
Sau khi tất cả các máy khách bị ngắt kết nối khỏi interface cụ thể của services và cần kết nối services với các máy khách mới, hệ thống gọi phương thức này.
onCreate ()
Bất cứ khi nào một services được tạo bằng cách sử dụng onStartCommand () hoặc onBind (), hệ thống android gọi phương thức này. Phương pháp này là cần thiết để thực hiện thiết lập một lần.
onDestroy ()
Khi một services không còn được sử dụng, hệ thống sẽ gọi phương thức này ngay trước khi services bị hủy như một cuộc gọi dọn dẹp cuối cùng. services phải triển khai phương pháp này để dọn dẹp tài nguyên như người nghe đã đăng ký, luồng, máy thu, v.v.
Ví dụ về các Android Services
Phát nhạc trong background là một ví dụ rất phổ biến về các services trong Android. Kể từ khi người dùng khởi động services, nhạc sẽ liên tục phát trong nền ngay cả khi người dùng chuyển sang ứng dụng khác. Người dùng phải dừng services một cách rõ ràng để tạm dừng nhạc. Dưới đây là quá trình thực hiện từng bước hoàn chỉnh của services android này bằng cách sử dụng một số phương pháp gọi lại.
Bước 1: Tạo một New project
- Nhấp vào File, sau đó nhấp vào NEW=> New project.
- Chọn Empty activity
- Chọn ngôn ngữ là Java / Kotlin
- Chọn SDK tối thiểu theo nhu cầu của bạn.
Bước 2: Sửa đổi tập tin string.xml
Tất cả các String value được sử dụng trong activity được liệt kê trong tệp này.
<resources>
<string name=”app_name”>Services_In_Android</string>
<string name=”heading”>Services In Android</string>
<string name=”startButtonText”>Start the Service</string>
<string name=”stopButtonText”>Stop the Service</string>
</resources>
Bước 3: Làm việc với tập tin activity_main.xml
Mở tệp activity_main.xml và thêm 2 Button trong đó sẽ bắt đầu và dừng services. Dưới đây là code để thiết kế một activity layout thích hợp.
<?xml version=”1.0″ encoding=”utf-8″?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background=”#168BC34A”
tools:context=”.MainActivity”>
<LinearLayout
android:id=”@+id/linearLayoutID”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_centerVertical=”true”
android:orientation=”vertical”
app:layout_constraintBottom_toBottomOf=”parent”
app:layout_constraintEnd_toEndOf=”parent”
app:layout_constraintStart_toStartOf=”parent”
app:layout_constraintTop_toTopOf=”parent”
app:layout_constraintVertical_bias=”1.0″
tools:ignore=”MissingConstraints”>
<TextView
android:id=”@+id/textView1″
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_marginBottom=”170dp”
android:fontFamily=”@font/roboto”
android:text=”@string/heading”
android:textAlignment=”center”
android:textAppearance=”@style/TextAppearance.AppCompat.Large”
android:textColor=”@android:color/holo_green_dark”
android:textSize=”36sp”
android:textStyle=”bold” />
<Button
android:id=”@+id/startButton”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:layout_marginStart=”20dp”
android:layout_marginTop=”10dp”
android:layout_marginEnd=”20dp”
android:layout_marginBottom=”20dp”
android:background=”#4CAF50″
android:fontFamily=”@font/roboto”
android:text=”@string/startButtonText”
android:textAlignment=”center”
android:textAppearance=”@style/TextAppearance.AppCompat.Display1″
android:textColor=”#FFFFFF”
android:textStyle=”bold” />
<Button
android:id=”@+id/stopButton”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:layout_marginStart=”20dp”
android:layout_marginTop=”10dp”
android:layout_marginEnd=”20dp”
android:layout_marginBottom=”20dp”
android:background=”#4CAF50″
android:fontFamily=”@font/roboto”
android:text=”@string/stopButtonText”
android:textAlignment=”center”
android:textAppearance=”@style/TextAppearance.AppCompat.Display1″
android:textColor=”#FFFFFF”
android:textStyle=”bold” />
<ImageView
android:id=”@+id/imageView”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:layout_marginTop=”80dp”
app:srcCompat=”@drawable/banner” />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Bước 4: Tạo class services tùy chỉnh
Một Class services tùy chỉnh sẽ được tạo trong cùng một thư mục nơi lớp MainActivity cư trú và lớp này sẽ extend Service class. Các phương thức callback được sử dụng để init và destroy các services. Để phát nhạc, đối tượng MediaPlayer được sử dụng. Dưới đây là code.
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.provider.Settings;
import androidx.annotation.Nullable;
public class NewService extends Service {
// declaring object of MediaPlayer
private MediaPlayer player;
@Override
// execution of service will start
// on calling this method
public int onStartCommand(Intent intent, int flags, int startId) {
// creating a media player which
// will play the audio of Default
// ringtone in android device
player = MediaPlayer.create( this, Settings.System.DEFAULT_RINGTONE_URI );
// providing the boolean
// value as true to play
// the audio on loop
player.setLooping( true );
// starting the process
player.start();
// returns the status
// of the program
return START_STICKY;
}
@Override
// execution of the service will
// stop on calling this method
public void onDestroy() {
super.onDestroy();
// stopping the process
player.stop();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Bước 5: Làm việc với tập tin MainActivity
Bây giờ, các đối tượng Button sẽ được khai báo và quá trình thực hiện khi nhấp vào các nút này sẽ được định nghĩa trong lớp MainActivity. Dưới đây là mã để thực hiện bước này.
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
// declaring objects of Button class
private Button start, stop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
// assigning ID of startButton
// to the object start
start = (Button) findViewById( R.id.startButton );
// assigning ID of stopButton
// to the object stop
stop = (Button) findViewById( R.id.stopButton );
// declaring listeners for the
// buttons to make them respond
// correctly according to the process
start.setOnClickListener( this );
stop.setOnClickListener( this );
}
public void onClick(View view) {
// process to be performed
// if start button is clicked
if(view == start){
// starting the service
startService(new Intent( this, NewService.class ) );
}
// process to be performed
// if stop button is clicked
else if (view == stop){
// stopping the service
stopService(new Intent( this, NewService.class ) );
}
}
}
Bước 6: Sửa đổi tệp AndroidManifest.xml
Để thực hiện thành công các services trên bất kỳ thiết bị Android nào, cần phải định nghĩa services đã tạo trong tệp AndroidManifest.xml. Services không thể thực hiện nhiệm vụ của nó nếu nó không được khai báo trong tập tin này. Services name được đề cập bên trong application tag .
<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.example.services_in_android”>
<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>
<meta-data
android:name=”preloaded_fonts”
android:resource=”@array/preloaded_fonts” />
<service android:name=”.NewService”/>
</application>
</manifest>