2013-09-21 3 views
6

Un'attività crea un'istanza di ResultReceiver e sovrascrive onReceiveResult. L'attività quindi invia un Intent a un IntentService e include il ResultReceiver come extra. Una volta terminata l'elaborazione di IntentService, invia un messaggio al ResultReceiver e lo elabora in onReceiveResult.IntentService che risponde a dead ResultReceiver

Il problema è se l'utente si allontana dall'attività, quindi il risultato viene comunque inviato al ResultReceiver che causa tutti i tipi di problemi. Non c'è un modo per fermare questo comportamento? Ho provato a fermare IntentService nell'attività onDestroy() ma il risultato è ancora stato restituito.

Ecco un esempio di attività

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

Ecco un campione 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); 
     } 
    } 
} 

risposta

12

Ho risolto questo problema creando un ResultReceiver personalizzato come segue.

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

Poi nella mia attività ho effettuare le seguenti operazioni:

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

Questo farà sì che tutti i messaggi inviati al tuo ResultReceiver personalizzato per finire da nessuna parte dopo l'attività, è stato distrutto :)

+0

buona soluzione ! Ho usato lo stesso approccio in un frammento invece che nella tua attività – moondroid