2015-01-06 12 views
9

Ho cercato attraverso la rete per trovare questa risposta. Ma nessun risultato trovato. Scusate se sono un principiante in Java & Programmazione Android.Cosa accade quando la mia attività viene distrutta quando utilizzo IntentService con ResultReceiver

Vorrei approfondire la mia domanda. Diciamo che la mia attività ha avviato un IntentService ed è in esecuzione in modo indipendente in background. Il servizio è "sottoscritto" al callback di ResultReceiver per aggiornare l'interfaccia utente dell'attività. E durante il servizio sta eseguendo il processo di lunga durata, l'attività viene distrutta. Quindi cosa succederà se il servizio invierà una risposta o un aggiornamento di avanzamento all'attività tramite ResultReceiver?

Causa come noto, il ResultReceiver deve avere un riferimento dell'attività.

Nel mio progetto mi viene richiesto di sviluppare un'app di messaggistica video. Che quando l'utente ha catturato il video, passerà i dati al servizio e il servizio eseguirà il caricamento oltre a salvare alcune informazioni in db .. mentre continua a postare l'aggiornamento sullo stato dell'interfaccia utente di Activity tramite ResultReceiver.

L'utente può chiudere o interrompere l'attività come preferisce. Ma quando tornano all'app/Activity, se il caricamento/download è ancora in corso, è necessario mostrare l'avanzamento corrente ..

Inizialmente penso ad Asynctask, ma ha anche problemi simili come ho detto. Ha bisogno di un riferimento dell'attività del chiamante.

C'è un posto dove posso raggiungere il requisito che ho menzionato? Ci scusiamo per il lungo post. Spero che qualcuno possa illuminarmi un po 'ed è ancora meglio avere qualche frammento di codice. Modifica: In breve, esiste un modo per associare dinamicamente un'attività appena creata a un IntentService in esecuzione in modo che il servizio possa inviare l'aggiornamento di avanzamento all'attività corretta?

+1

ho avuto lo stesso problema Qui. Hai trovato qualche soluzione per superare questo problema? –

+0

anch'io ho lo stesso problema – has19

risposta

2

Utilizzare un BroadcastReceiver sull'attività e registrarlo/annullarlo in onResume() e onPause() rispettivamente. È possibile utilizzare IntentFilter per ascoltare uno Intent dal proprio IntentService.

Nella tua IntentService, creare un valore d'azione per la IntentFilter e inviare una trasmissione con quella azione quando si desidera aggiornare:

public static final String ACTION = "com.example.yourapp.action.ACTION_TAG"; 

private void handleResult() { 
    if (BuildConfig.DEBUG) { 
     Log.v(TAG, "handleResult"); 
    } 

    // Broadcast result 
    Intent intent = new Intent(ACTION); 
    intent.putExtra("your_extra", someValue); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

Nel vostro Activity:

private BroadcastReceiver mYourReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (BuildConfig.DEBUG) { 
       Log.v(TAG, "onReceive"); 
      } 



      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
       // Update with content from bundle 
      } 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 

     if (BuildConfig.DEBUG) { 
      Log.v(TAG, "onResume"); 
     } 

     // Register broadcast receiver 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mYourReceiver, new IntentFilter(YourIntentService.ACTION)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (BuildConfig.DEBUG) { 
      Log.v(TAG, "onPause"); 
     } 

     // Unregister broadcast receiver 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mYourReceiver); 
    } 
Problemi correlati