2012-06-18 8 views
14

Jestem nowy w programowaniu Androida, więc mam pewne ogólne problemy z wyborem najlepszego sposobu zaprojektowania aplikacji.W jaki sposób serwis Android może zaktualizować interfejs użytkownika działania, które zostało uruchomione?

Co chcę zrobić, to w zasadzie odtwarzacz multimedialny. Chcę, aby odtwarzacz multimediów działał w usłudze, ponieważ chcę, aby gra również była odtwarzana, gdy działanie nie jest wyświetlane.

Moje pytanie brzmi: jak mogę zaktualizować interfejs użytkownika na mojej aktywności w zależności od przepływu pracy usługi (na przykład, utwór się zmienia i chcę, aby jego nazwa była wyświetlana)?

Chyba mogę używać lokalnego Broadcast Manager w celu wysłania intencje z moich usług do mojej działalności i wywołać aktualizacji UI (to wydaje się słuszne?)

ALE ... będę chciał zrobić moją usługę trochę rzeczy podczas odtwarzania muzyki (np. zapytanie/aktualizacja DB). Z tego powodu myślałem o uruchomieniu usługi w innym procesie (lub wątku?).

SO .. Przypuszczam, że przy uruchomieniu usługi w innym procesie, nie będę mógł korzystać z lokalnego menedżera transmisji (czy to prawda?).

Mam nadzieję, że wyjaśniłem, jakie są moje wątpliwości ... Czy ktoś może pomóc?

wielkie dzięki!

Odpowiedz

15

Użyj zadania asynchronicznego w usłudze, aby obsłużyć pracę, którą trzeba wykonać w tle. Aby zaktualizować interfejs użytkownika, użyj metody asynchronizacji progressUpdate, aby wysłać transmisję z powrotem do dowolnej zainteresowanej działalności.

Pseudo przykład.

aktywny

onCreate -> StartService i stworzyć nową broadcastReceiver. Upewnij się, że przesłoniłeś metodę onReceive i przetestuj konkretne zamiary.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

    broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(yourActionType)) { 
       //do work here 
      } 
     } 
    }; 

onResume -> zarejestrować jako odbiornik transmisji

IntentFilter filter = new IntentFilter(); 
    filter.addAction(yourActionType); 
    mLocalBroadcastManager.registerReceiver(broadcastReceiver, filter); 

Służby

onCreate -> stworzyć menedżera broadcast.

mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); 

onStartCommand -> Utwórz i wykonaj nowe zadanie asynchroniczne, jeśli to konieczne. (OnStart można nazwać kilka razy)

asynchroniczny Zadanie

doInBackground -> Uruchom cokolwiek tło zadanie trzeba. W tym przypadku odtwarzanie muzyki. Wykonywanie połączeń okresowych publishProgress

onProgressUpdate -> sendBroadcast wskazujący aktualny stan

Intent broadcastIntent = new Intent(yourActionType); 
    broadcastIntent.putExtra(whateverExtraData you need to pass back); 
    mLocalBroadcastManager.sendBroadcast(broadcastIntent); 

onPostExecute -> sendBroadcast zadanie wskazujące kończące się

+0

dzięki.ale co z wiadomościami rozgłoszeniowymi? Czy nie są niewygodne do użycia lokalnie? – super

+0

@super Edytowałem swoją odpowiedź, aby podać przykład wykorzystania lokalnych transmisji. Upewnij się, że masz w swoich bibliotekach android-support-v4.jar, jeśli kierujesz się starą wersją aplikacji. – Mike

+0

wielkie dzięki. Dam ci znać, jak to działa;) – super