Một lần nữa là một câu hỏi về LocalServices. Làm cách nào để (lại) liên kết với một Dịch vụ hiện có, sau onDestroy()?ràng buộc để chạy Dịch vụ (sau khi kết thúc())/callback Handler
Sự cố: Tôi đang ràng buộc với Dịch vụ và Bắt đầu dịch vụ từ Hoạt động. Tôi đang đăng đối tượng Runnable cho Binder, để gọi lại (cập nhật thanh tiến trình) trên giao diện người dùng. Khi tôi đóng Hoạt động này, HĐH có thể kết thúc vòng đời và hủy Hoạt động, gọi onDestroy(), phải không? Tôi mô phỏng này, gọi kết thúc() trong onPause() phương pháp. Vì vậy, khi tôi khởi động lại Hoạt động, làm thế nào để tôi liên kết với Dịch vụ CÙNG một lần nữa? Tôi nghĩ rằng dịch vụ là Singelton, nhưng khi tôi đang cố gắng để ràng buộc lại, tôi nhận được một tài liệu tham khảo binder. Vì vậy, binder.callbackHandler.post(binder.progressHandler);
vẫn có tham chiếu đến trình kết dính cũ/callback/progressHandler, chứ không phải tài liệu mới của tôi. Ngay cả Constructor của Dịch vụ cũng được gọi lại!
Có giải pháp nào để có thanh tiến trình, được cập nhật bằng đối tượng gọi lại từ dịch vụ (hoạt động) hay không. Đóng/onDestroy() hoạt động. Quay lại và tiếp tục thanh tiến trình?
Mã của tôi là khá lớn, nhưng tái tạo các Szenario:
public class MyService extends Service {
private final LocalBinder binder = new LocalBinder();
public class LocalBinder extends Binder implements TestRunServiceBinder {
private Handler callbackHandler;
private ServiceStartActivity.RunOnServiceProgress onProgress;
@Override
public void setActivityCallbackHandler(Handler messageHandler) {
callbackHandler = messageHandler;
}
@Override
public void setServiceProgressHandler(RunOnServiceProgress runnable) {
onProgress = runnable;
}
public void doSomething(){
_doSomething();
};
private void _doSomething(){
while(...){
//do this a couple of times (could take up to 10min)
binder.callbackHandler.post(binder.progressHandler);
wait()
}
}
}
_
public class ServiceStartActivity{
private final Handler messageHandler = new Handler();
private ServiceConnection mTestServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
testRunBinder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
testRunBinder = (TestRunServiceBinder) service;
testRunBinder.setActivityCallbackHandler(messageHandler);
testRunBinder.setServiceProgressHandler(new RunOnServiceProgress());
}
};
@Override
protected void onStart() {
super.onStart();
// bind to the Service
final Intent serviceIntent = new Intent(ServiceStartActivity.this,
MyService.class);
getApplicationContext().bindService(serviceIntent,
mTestServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
getApplicationContext().unbindService(mTestServiceConnection);
}
public class RunOnServiceProgress implements Runnable {
@Override
public void run() {
//do something on the UI!
}
}
}
làm việc cho tôi. Chỉ cần nhớ rằng nếu bạn sử dụng getApplicationContext() khi ràng buộc, sử dụng nó một lần nữa khi unbinding. – fersarr