2012-03-16 27 views
5

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! 
        } 
     } 
} 

Trả lời

8

tôi đã nhận nó bây giờ. Giải pháp là lời kêu gọi rõ ràng startService(serviceIntent); trước khi bạn liên kết với các dịch vụ sử dụng getApplicationContext().bindService(serviceIntent,mTestServiceConnection, Context.BIND_AUTO_CREATE);

Lý do: Khi bạn bắt đầu một dịch vụ với bindService(), nó trở thành một dịch vụ ràng buộc một

chạy chỉ chừng một ứng dụng khác thành phần bị ràng buộc với nó.

Nếu bạn bắt đầu một dịch vụ với startService() nó có thể

có thể chạy trong nền vô thời hạn,

Vì vậy, nếu bạn có ví dụ một progessbar trên giao diện người dùng và bạn muốn nó tiếp tục cập nhật nó, bạn nên khởi động Dịch vụ của bạn, và ràng buộc và hủy bỏ nó trong onResume()/onPause(). Nhưng hãy cẩn thận: Vì bạn đã bắt đầu Dịch vụ theo cách thủ công, Bạn cũng nên dừng dịch vụ theo cách thủ công. Cách đơn giản nhất để thực hiện việc này là gọi stopSelf() sau khi Dịch vụ thực hiện công việc.

Linh hồn này bao gồm ràng buộc thích hợp từ Hoạt động với ví dụ: thanh tiến trình cho cùng một Dịch vụ ngay cả sau khi hoạt động bị hủy hoặc sau khi thay đổi định hướng.

+0

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

Các vấn đề liên quan