2013-09-21 9 views
6

एक गतिविधि एक परिणाम रिसीवर को तुरंत चालू करती है और रिसीव रिजल्ट पर ओवरराइड करती है। गतिविधि तब एक इरादा सेवा के लिए एक इरादा भेजती है और परिणामस्वरूप रिसीवर को अतिरिक्त के रूप में शामिल करती है। एक बार जब IntentService प्रसंस्करण समाप्त हो जाए तो यह परिणाम संदेश रिसीवर पर वापस भेजता है और इसे रीसीव रिजल्ट में संसाधित करता है।मृत परिणाम का जवाब देने वाले इंटेंट सेवा

समस्या यह है कि यदि उपयोगकर्ता गतिविधि से दूर निकलता है तो परिणाम अभी भी परिणाम रिसीवर पर वापस भेजा जाता है जो सभी प्रकार के मुद्दों का कारण बनता है। क्या इस व्यवहार को रोकने का कोई तरीका नहीं है? मैंने गतिविधि के ऑनस्ट्रोय() में IntentService को रोकने का प्रयास किया है लेकिन परिणाम अभी भी वापस भेजा गया है।

यहाँ एक नमूना गतिविधि

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

है एक नमूना IntentService

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); 
     } 
    } 
} 

उत्तर

12

मैं एक कस्टम ResultReceiver बनाने के रूप में इस करके इस समस्या को हल है।

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

इस के बाद गतिविधि नष्ट कर दिया गया कहीं नहीं खत्म करने के लिए अपने कस्टम ResultReceiver के लिए भेजा गया कोई भी संदेश का कारण होगा :)

+0

अच्छा समाधान:

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); } } } 

तब मेरे गतिविधि में मैं निम्न कार्य करें ! मैंने आपकी गतिविधि के बजाय एक टुकड़े में एक ही दृष्टिकोण का उपयोग किया है – moondroid

संबंधित मुद्दे