Tôi đã viết một chương trình Android có: hoạt động chính cho giao diện người dùng và bắt đầu dịch vụ. Dịch vụ kịp thời gọi lại hoạt động giao diện người dùng để cập nhật lượt xem. Nó hoạt động tốt ngoại trừ: nếu hoạt động được đóng (với BACK) và bắt đầu lại, dịch vụ cũng sẽ được bắt đầu lại (Dịch vụ phát tệp âm thanh, do đó có hai âm thanh chồng chéo). Tôi sử dụng bindService với cờ BIND_AUTO_CREATE để bắt đầu và kết nối với dịch vụ. Theo tài liệu, nó sẽ tạo ra dịch vụ chỉ khi nó không tồn tại, nhưng rõ ràng nó bắt đầu một thể hiện khác khi mở lần thứ hai. Tất cả những gì tôi muốn là khi hoạt động được đóng, dịch vụ sẽ tiếp tục chạy và khi hoạt động mở lại, nó có thể kết nối lại với dịch vụ. Điều đó có thể không? Hoặc tôi chỉ hiểu lầm việc sử dụng dịch vụ?Tại sao dịch vụ từ xa bị hủy khi hoạt động chính bị đóng?
Đã thử thêm: Sử dụng ICountService (được mô tả trong .aidl) thay vì CountService trong mục đích bindService. Nó onDestroyed được gọi khi hoạt động được đóng lại.
Dưới đây là mã tạo dịch vụ nếu nó trợ giúp.
ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName c, IBinder b) {
Log.d("TK","Connected");
//binder = (ICountService.Stub) b;
service = ICountService.Stub.asInterface(b);
try {
service.setCallback(new ICountCallback.Stub(){
@Override
public void alert() {
Log.d("TK","alert!");
}
@Override
public void updateTime(final int sec) {
handler.post(new Runnable(){
@Override
public void run() {
indicator.setText(toText(sec));
}
});
}
});
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName c) {
Log.d("TK","Disconnected");
}
};
private void startCountService(){
Intent i = new Intent(ICountService.class.getName());
boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE);
Log.d("TK", "bindService="+ok);
}
Cảm ơn. start/stopService không hoạt động. Tôi đã thử nhiều hơn và thấy rằng dịch vụ này thực sự bị phá hủy khi hoạt động bị đóng (CountService.onDestroy được gọi). Vấn đề bây giờ là: Làm thế nào để ngăn chặn các dịch vụ bị phá hủy? – Reno
@Reno: Sử dụng 'startService()'. Tin hay không, nó hoạt động. – CommonsWare
Cảm ơn. Nó cuối cùng cũng được làm việc. Bây giờ tôi sử dụng như thế này: khi bắt đầu hoạt động, 1) startService, 2) bindService không có BIND_AUTO_CREATE; khi ngừng hoạt động, chỉ cần unbindService, không stopService – Reno