2015-01-06 16 views
9

Przeszukałem sieć, aby znaleźć tę odpowiedź. Ale nie znaleziono wyników. Przepraszam, że jestem bardzo początkującym użytkownikiem w Java & programowaniu Androida.Co się stanie, gdy moja aktywność zostanie zniszczona, gdy używam IntentService z ResultReceiver

Chciałbym opracować na moje pytanie więcej. Powiedzmy, że moja aktywność rozpoczęła IntentService i działa niezależnie w tle. Usługa jest "zasubskrybowana" do wywołania zwrotnego ResultReceiver, aby zaktualizować interfejs aktywności. A w trakcie wykonywania długiego procesu usługa zostaje zniszczona. Co się stanie, jeśli usługa wyśle ​​odpowiedź lub aktualizację postępu w działaniu za pośrednictwem ResultReceiver?

Przyczyna, jak wiem, ResultReceiver musi mieć odniesienie do działania.

W moim projekcie muszę utworzyć aplikację do przesyłania wiadomości wideo. Kiedy użytkownik przechwyci wideo, przekaże dane do usługi, a usługa wykona przesyłanie, a także zapisanie niektórych informacji do bazy danych, a jednocześnie będzie publikować aktualizację postępu w interfejsie aktywności za pośrednictwem funkcji ResultReceiver.

Użytkownik może zakończyć lub zabić działanie według własnego uznania. Ale kiedy wracają do aplikacji/działania, jeśli wysyłanie/pobieranie nadal trwa, musi pokazać obecny postęp.

Początkowo myślę o Asynctask, ale ma również podobny problem, o którym wspomniałem. Potrzebuje odniesienia do aktywności dzwoniącego.

Czy mogę spełnić wymóg, o którym wspomniałem? Przepraszamy za długi post. Mam nadzieję, że ktoś może mnie oświecić, a jeszcze lepiej mieć fragment kodu. Bardzo dziękuję :)

Edycja: Krótko mówiąc, czy istnieje sposób dynamicznego powiązania nowo utworzonej działalności z działającą usługą IntentService, aby usługa mogła wysłać aktualizację postępu do właściwego działania?

+1

Mam ten sam problem tutaj. Czy znalazłeś jakieś rozwiązanie, aby przezwyciężyć ten problem? –

+0

Mam ten sam problem – has19

Odpowiedz

2

Użyj funkcji BroadcastReceiver dla swojej aktywności i zarejestruj/wyrejestruj ją odpowiednio w onResume() i onPause(). Możesz użyć numeru IntentFilter, aby odsłuchać numer Intent od urządzenia IntentService.

w twojej IntentService utwórz wartość działania dla IntentFilter i wysłać transmisję z tego działania, gdy chcesz zaktualizować:

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

w twojej 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); 
    } 
Powiązane problemy