Service
(dịch vụ) là một ứng dụng chạy ngầm bên dưới hệ điều hành thực hiện các công việc riêng biệt, một Service
không có giao diện để tương tác với người dùng. Một ứng dụng có thể khởi tạo một đối tượng Service
và chạy, đối tượng Service
chạy liên tục ngay cả khi người dùng chuyển đổi sang ứng dụng khác, Service
cũng có thể được “gắn” với một ứng dụng và trao đổi qua lại với ứng dụng đó. Thường thì chúng ta dùng Service
để thực hiện các công việc như mở/truyền dữ liệu/đóng kết nối mạng, mở nhạc, đọc/ghi file…
Tuy nhiên bạn cần hiểu là Service
không phải là luồng (Thread),
tức là nó không phải là một tiến trình chạy song song với ứng dụng đã gọi nó, Service chỉ đơn giản là một đối tượng chạy ngầm dưới hệ điều hành, nói là chạy ngầm bởi vì chúng ta không thấy nó bằng mắt vì nó không có giao diện người dùng (UI). Tóm lại bạn có thể hiểu Service
là một Activity
nhưng không có file layout để tương tác với người dùng như Activity.
Service có 2 loại:
- Started
Service
loại này được tạo ra từ phương thứcstartService()
của một đối tượngActivity.
Khi đã được tạo ra thì đối tượngService
này có thể chạy vô thời hạn, ngay cả khi đối tượng đã tạo ra nó bị hủy. Thông thường thìService
sẽ thực hiện một công việc đơn lẻ nào đó rồi tự hủy chứ không trả kết quả nào về cho đối tượng đã gọi nó cả. Chẳng hạn nhưService
dùng để tải file/ upload file…- Bound
Service
loại này sẽ được “gắn” dính vào một đối tượng nào đó bằng phương thứcbindService().
Các đối tượngService
này cung cấp các phương thức để đối tượng đã được gắn vào nó có thể giao tiếp với đối tượngService
đó.Bound Service
chỉ chạy khi có ít nhất một đối tượng được gắn vào nó, nếu không có đối tượng nào được gắn vào nó thì nó sẽ bị hủy.
Ví dụ
Chúng ta tạo một project mới có sử dụng Service
được tạo ra từ lớp android.app.Service.
Trong file layout chính chúng ta thiết kế như sau:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center"> <Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="stopNewService" android:text="Stop Service"/> <Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="23dp" android:onClick="startNewService" android:text="Start Service" /> </LinearLayout>
Giao diện chính chỉ gồm 2 Button
để tạo và hủy một Service.
Tiếp theo là lớp MainActivity:
package com.phocode; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.view.Menu; import android.view.View; public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void startNewService(View view) { startService(new Intent(this, NewService.class)); } public void stopNewService(View view) { stopService(new Intent(this, NewService.class)); } }
Trong lớp MainActivity,
chúng ta tạo một Service
bằng cách gọi phương thức startService(),
tham số của phương thức này là một đối tượng Intent.
Chúng ta hủy Service
bằng cách gọi phương thức stopService(),
phương thức này cũng nhận một đối tượng Intent.
Các đối tượng Intent
này tham chiếu tới đối tượng Service
mà chúng ta sẽ định nghĩa sau đây:
package com.phocode; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.widget.Toast; public class NewService extends Service { public NewService() {} @Override public IBinder onBind(Intent intent) { throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { Toast.makeText(this, "Service created", Toast.LENGTH_SHORT).show(); } @Override public void onStart(Intent intent, int startID) { Toast.makeText(this, "Service started", Toast.LENGTH_SHORT).show(); } @Override public void onDestroy() { Toast.makeText(this, "Service destroyed", Toast.LENGTH_SHORT).show(); } }
Một đối tượng Service
sẽ kế thừa từ lớp android.app.Service,
và phải override các phương thức onCreate(), onStart()
và onDestroy().
Ở đây chúng ta chỉ in ra các câu thông báo Toast
đơn giản.