2010-10-01 9 views
21

Mam klasyczne zadanie, ale nie mogę znaleźć przykładów, jak to zrobić.W jaki sposób usługa zwraca wynik do działania

Chcę coś pobrać. No cóż, zadzwonię do serwisu internetowego i otrzymam odpowiedź ... ale to prawie to samo.

W tym celu uruchamiam usługę, która uruchamia wątek wykonujący zadanie.

Teraz chciałbym wykorzystać dane, które otrzymałem w działaniu, które uruchomiło usługę.

(zakładam, że począwszy od innej działalności obsługiwać pracę wyświetlając wynik byłby prosty)

mój problem jest w jaki sposób usługa zawiadomić aktywności (ten, który je rozpoczął lub inny) czegoś?

Wszelkie wskazówki do przykładów są bardzo doceniane.

Pozdrowienia

+0

można wykorzystywać lokalny odbiornik do transmisji to sprawdzić ten prosty przykład lokalnej audycji tutaj http://wiki.workassis.com/Android-local-broadcast-receiver/ –

Odpowiedz

36

Według dokumentacji google, jeśli aktywny i usługi są w tej samej aplikacji, za pomocą LocalBroadcastManager jest preferowane nad sendBroadcast (intent), ponieważ informacje przesyłane nie przechodzi przez system, co eliminuje ryzyko przechwycenia. http://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html

Jest dość łatwy w użyciu.

W swojej działalności, tworzenie BroadcastReceiver i dynamicznie dodać słuchacza w metodzie onResume():

private BroadcastReceiver BReceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //put here whaterver you want your activity to do with the intent received 
    }   
}; 

protected void onResume(){ 
super.onResume(); 
LocalBroadcastManager.getInstance(this).registerReceiver(bReceiver, new IntentFilter("message")); 
} 

protected void onPause(){ 
super.onPause(); 
LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver); 
} 

A w swojej służbie, masz instancję LocalBroadcastManager i użyć go do wysłania intencji. I zazwyczaj umieścić go w jego własnej metody tak:

private void sendBroadcast (boolean success){ 
    Intent intent = new Intent ("message"); //put the same message as in the filter you used in the activity when registering the receiver 
    intent.putExtra("success", success); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 
+0

Jest to o wiele bardziej pomocne niż zaakceptowana odpowiedź pod względem kodu nadającego się do pracy. –

+0

To powinna być zaakceptowana odpowiedź. –

4

Jeśli trzeba powrócić różne typy danych, takie jak klasy zdefiniowanej przez użytkownika, można spróbować bindService i oddzwanianie. W ten sposób można uniknąć interfejsu obsługującego działkę niż sendBroadcast.

Proszę zobacz przykład w moim poście:

https://stackoverflow.com/a/22549709/2782538

i więcej, jeśli używasz IntentService, można zajrzeć do ResultReceiver. Szczegóły i próbki można znaleźć w tym poście:

Android: restful API service

Nadzieję, że to pomaga.

+0

Świetny przykład dla pojęcia 'bindService()', poprawnie implementującego koncepcję. – Eido95

Powiązane problemy