2013-09-21 19 views
6

Một hoạt động khởi tạo một ResultReceiver và ghi đè lênReceiveResult. Hoạt động này sau đó gửi Intent đến IntentService và bao gồm ResultReceiver như một phần bổ sung. Khi IntentService kết thúc quá trình xử lý, nó sẽ gửi một thông điệp trở lại ResultReceiver và xử lý nó trong onReceiveResult.IntentService trả lời cho người nhận kết quả chết

Vấn đề là nếu người dùng điều hướng khỏi Hoạt động thì kết quả vẫn được gửi lại cho Trình phân tích kết quả gây ra tất cả các loại vấn đề. Không có cách nào để ngăn chặn hành vi này? Tôi đã thử dừng IntentService trong onDestroy của hoạt động() nhưng kết quả vẫn được gửi trở lại.

Đây là một Hoạt động mẫu

public class Foo extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent i = new Intent(this, SampleIntentService.class); 
     i.putExtra("receiver", mReceiver); 
     startService(i); 
    } 

    @Override 
    public void onDestroy() { 
     stopService(new Intent(this, SampleIntentService.class)); 
     mReceiver = null; 
     super.onDestroy(); 
    } 

    ResultReceiver mReceiver = new ResultReceiver(new Handler()) { 
     @Override 
     protected void onReceiveResult(int resultCode, Bundle resultData) { 
      // Handle response from IntentService here 
     } 
    }; 
} 

Đây là một IntentService mẫu

public class SampleIntentService extends IntentService { 
    public SampleIntentService() { 
     super(SampleIntentService.class.getName()); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    ResultReceiver rec = intent.getParcelableExtra("receiver"); 
     if (rec != null) { 
      rec.send(200, null); 
     } 
    } 
} 

Trả lời

12

tôi giải quyết vấn đề này bằng cách tạo ra một ResultReceiver tùy chỉnh như sau.

public class SampleResultReceiver extends ResultReceiver { 
    private Receiver mReceiver; 

    public SampleResultReceiver(Handler handler) { 
     super(handler); 
    } 

    public void setReceiver(Receiver receiver) { 
     mReceiver = receiver; 
    } 

    public interface Receiver { 
     void onReceiveResult(int resultCode, Bundle resultData); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     if (mReceiver != null) { 
      mReceiver.onReceiveResult(resultCode, resultData); 
     } 
    } 
} 

Sau đó, trong Hoạt động của tôi, tôi làm như sau:

public class Foo extends Activity implements Receiver { 
    private SampleResultReceiver mReceiver; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mReceiver = new SampleResultReceiver(new Handler()); 
     mReceiver.setReceiver(this); 

     Intent i = new Intent(this, SampleIntentService.class); 
     i.putExtra("receiver", mReceiver); 
     startService(i); 
    } 

    @Override 
    public void onDestroy() { 
     if (mReceiver != null) { 
      mReceiver.setReceiver(null); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    protected void onReceiveResult(int resultCode, Bundle resultData) { 
     // Handle response from IntentService here 
    } 
} 

Điều này sẽ gây ra bất kỳ thông điệp gửi đến ResultReceiver tùy chỉnh của bạn để kết thúc đâu sau khi hoạt động đã bị phá hủy :)

+0

giải pháp tốt ! Tôi đã sử dụng cùng một cách tiếp cận trong Phân đoạn thay vì Hoạt động của bạn – moondroid

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