Started Service
B1. Tạo 1 class kế thừa Service()
class MyStartedService : Service()
B2. Implement các phương thức của class cha
override fun onBind(intent: Intent?): IBinder? {
TODO("Not yet implemented")
}
B3. Gọi các phương thức thuộc vòng đời Service()
override fun onCreate() {
super.onCreate()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
}
B4. Khai báo Service() trong manifest()
<service android:name=".MyStartedService"/>
B5. Trong file thực thi Service:
-Tạo 1 intent đến class ở bước 1 và gọi phương thức startService(). Sau đó truyền intent mới tạo vào startService(). Lúc này Service bắt đầu được khởi tạo chạy vào onCreate() -> onStartCommand(). Vì Service() chỉ khởi tạo 1 lần duy nhất khi chưa vị huỷ. Nên khi tao startService() liên tiếp thì vòng đời của Service() sẽ luôn ở onStartCommand()
-Vì startedService không tự mình kết thúc nên phải có phương thức stopService(). Ta cũng tạo 1 intent đến Service() muốn kết thúc. ta gọi phương thức stopService() và truyền intent vào lúc nào vòng đời của của service sẽ vào onDestroy() và kết thúc. Vì đã huỷ Service() nên khi ta stopService() 1 lần nữa sẽ không có gì xảy ra vì lúc này service không hề tồn tại
p/s : Chưa được setup gì thì service sẽ hoạt động trên main thread
WorkManager
* Tổng quan
- Service là một Application Component có thể hoạt động lâu dài dưới background. Nó không cung cấp giao diện người dùng. Service có thể chạy ngay cả khi người dùng chuyển sang ứng dụng khác. Một Service có thể thực các tác vụ thao tác mạng, chơi nhạc, thực hiện IO tệp, ....
* Phân loại: Có 3 loại service
-Foreground service : Là có Service mà người dùng có thể dễ dàng nhìn thấy, Khi service hoạt động nó bắt buộc phải gửi một notification để người dùng nhìn thấy. Notification này không thể bị xoá chỉ khi Service bị dừng hoạt bị xoá khỏi foregroung ví dụ người trình phát nhạc, ...
-Background service: Là loại Service mà người dùng không thể nhìn thấy nó hoạt động bên dưới backgroung,
-Bound Service: Một service được gọi là Bound Service khi thành phần của ứng dụng ràng buộc với nó bởi bindService() . Một Bound servie cung cấp giao diện Client-Server cho phép các thành phần tương tác với nó gửi yêu cầu nhận kết quả. Bound service chỉ chạy khi có một thành phần dàng buộc với nó, và có nhiều đồng thời ràng buộc với bound service, khi all các thành phần huỷ ràng buộc buộc với bound service lúc nó mới bị huỷ
* Độ ưu tiên của 3 service
Hệ thống android buộc dừng một service khi bộ nhớ ít và khôi phục tài nguyên hệ thống cho Activity đang sử dụng. Bound service được ràng buộc với Activity nên nó rất khó bị giết,
Bound > foreground > background
- Điều gì sẽ xảy ra với service khi hệ thống đủ bộ nhớ, phụ thuộc vào giá trị trả về của hàm onStartCommand()
* Hàm onStartCommand()
- START_NOT_STICKY : Service sẽ không được khởi động lại khi hệ thống đủ bộ nhớ
- START_STICKY : Service sẽ được tạo lại, nhưng sẽ không tạo lại intent lúc nó bị giết mà sẽ tạo intent = null. Lúc này kết quả tính toán trước đó đều bị mất đi
- START_REDELIVER_INTENT: Service sẽ được tạo lại, đồng thời khôi phục lại intent mới nhất mà serivce nhận được, lúc này công việc trước khi bị giết sẽ tiếp tục được thực hiện
- START_STICKY_COMPATIBILITY : cũng sẽ tạo lại service nhưng điều này không chắc chắn thành công 100%
* Vòng đời của Service
- Để tạo được 1 Service class phải kế thừa Service() hoặc lớp con của Service() ví dụ như IntentService()
- onStartCommand() : Hệ thống sẽ gọi phương thức này khi các thành phần của Application gọi đến Service bằng câu lệnh startService(). Khi phương thức này được thực hiện service sẽ khởi chạy trong background vô thời hạn, dừng lại chỉ khi một thành phần của application gọi stopService() hoặc chính service gọi stopSelf(). Khi nào tao chỉ muốn ràng buộc một thành phần với service thì ta không cần thêm hàm onStartCommand()
- onBind(): Hệ thống sẽ gọi hàm này khi một thành phần của ứng dụng gọi service bằng câu lệnh bindService(). Khi bạn triển khai phương thức này bạn phải trả về một giao diện để client có thể giao tiếp với Service thông qua một đối tượng IBinder do Service trả về. Khi bạn kế thừa Service() thì bạn luôn luôn phỉa overrite phương thức onBind(), nếu không sử dụng onBind() ta return null cho hàm
- onCreate(): hệ thống sẽ gọi phương thức này khi Service được khởi tạo, nó chỉ chạy một lần duy nhất trước khi onBind() và onStartCommand() được gọi, Nếu Service đã chạy phương thức này sẽ không được gọi1 lần nào nữa
- onDestroy(): Hệ thống gọi phương thức này khi Service không được sử dụng nữa và dã bị huỷ, Bạn cũng nên giải phóng tài nguyên như các Threads, listennet hay Recevers ở đây, Dây là phương thưc được gọi cuối cũng của Service()
Nhận xét
Đăng nhận xét