"Nếu bạn khởi động một Dịch vụ android với Dịch vụ startService(..)
đó sẽ vẫn chạy cho đến khi bạn gọi một cách rõ ràng stopService(..)
. Có hai lý do khiến hệ thống có thể chạy một dịch vụ. Nếu ai đó gọi Context.startService()
thì hệ thống sẽ truy xuất dịch vụ (tạo và gọi onCreate()
phương thức của nó nếu cần thiết) và sau đó gọi onStartCommand(Intent, int, int)
phương thức của nó với các đối số do máy khách cung cấp. Tại thời điểm này, dịch vụ sẽ tiếp tục chạy cho đến khi Context.stopService()
hoặc stopSelf()
được gọi. Lưu ý rằng nhiều lệnh gọi Context.startService()
không lồng nhau (mặc dù chúng dẫn đến nhiều lệnh gọi tương ứng đến onStartCommand()
), vì vậy không cho dù nó được khởi động bao nhiêu lần, một dịch vụ sẽ bị dừng một lần Context.stopService()
hoặc stopSelf()
được gọi; tuy nhiên, các dịch vụ có thể sử dụngstopSelf(int)
phương pháp để đảm bảo dịch vụ không bị dừng cho đến khi các ý định bắt đầu được xử lý.
Khách hàng cũng có thể sử dụng Context.bindService()
để có được kết nối liên tục với một dịch vụ. Điều này cũng tạo ra dịch vụ nếu nó chưa chạy (đang gọi onCreate()
trong khi làm như vậy), nhưng không gọi onStartCommand()
. Máy khách sẽ nhận IBinder
đối tượng mà dịch vụ trả về từ onBind(Intent)
phương thức của nó , cho phép máy khách sau đó thực hiện các cuộc gọi trở lại dịch vụ. Dịch vụ sẽ vẫn hoạt động miễn là kết nối được thiết lập (cho dù khách hàng có giữ lại tham chiếu trên Dịch vụ hay không IBinder
). Thông thường, kết quả IBinder
trả về dành cho một giao diện phức tạp đã được viết bằng AIDL.
Một dịch vụ có thể được khởi động và có các kết nối liên kết với nó. Trong trường hợp này, hệ thống sẽ giữ cho dịch vụ hoạt động miễn là nó được khởi động hoặc có một hoặc nhiều kết nối với nó với Context.BIND_AUTO_CREATE
cờ. Khi cả hai tình huống này đều không xảy ra, onDestroy()
phương thức của Dịch vụ được gọi và dịch vụ sẽ bị chấm dứt hiệu quả. Tất cả quá trình dọn dẹp (dừng luồng, hủy đăng ký bộ thu) phải hoàn tất khi quay trở lại onDestroy()
. "