2009-10-04 13 views
14

Utworzono odbiornik rozgłoszeniowy w głównym działaniu i usłudze w tle, która wysyła intencje transmisji. Aplikacja wywala za każdym razem staram się go uruchomić, a dziennik wyświetla się następujący komunikat o błędzie:Błąd Odbieranie emisji intencji Problem

10-04: 13: 30: 43.218: błąd/Android Runtime (695): java.lang.RuntimeException: Błąd odbioru nadawane Intent { action = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (posiada dodatki)} w [email protected]

komunikat jest wysyłany z transmisji Klasa CommunicationService w następującej metodzie:

private void announceLoginStatus(){ 
    Intent intent = new Intent(LOGIN_STATUS_UPDATE); 
    intent.putExtra(SERVER_MESSAGE, mServerResponseMessage); 
    intent.putExtra(SESSION_STRING, mSessionString); 
    sendBroadcast(intent); 
} 

gdzie

String LOGIN_STATUS_UPDATE = "com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" 

w głównej działalności następujące broadcast reveiver jest zdefiniowana:

public class LoginStatusReceiver extends BroadcastReceiver { 

     public void onReceive(Context context, Intent intent) { 
      String serverMessage = intent.getStringExtra(CommunicationService.SERVER_MESSAGE); 
      String sessionString = intent.getStringExtra(CommunicationService.SESSION_STRING); 

      userInfo.setSessionString(sessionString); 
      saveSettings(); 
     } 
    } 

i zarejestrowany w metodzie onResume:

 IntentFilter loginStatusFilter; 
     loginStatusFilter = new IntentFilter(CommunicationService.LOGIN_STATUS_UPDATE); 
     loginStatusReceiver = new LoginStatusReceiver(); 
     registerReceiver(loginStatusReceiver, loginStatusFilter); 

a pliku manifestu ja ncludes:

<activity android:name=".GaitLink" 
       android:label="@string/app_name"> 
     <intent-filter> 
      ... 
      <action android:name="com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE" /> 
     </intent-filter> 
    </activity> 

Byłbym wdzięczny, gdyby ktoś mógł wyjaśnić, dlaczego Dziennik wyświetla powyższy komunikat, a aplikacja ulega awarii.

Dzięki!

Odpowiedz

5

Czy poszedłeś krok po kroku w debugerze, aby znaleźć dokładnie miejsce, w którym nastąpiła awaria?

Jedną z rzeczy, na które należy zwrócić uwagę, jest to, czy nadpisujesz zdarzenia cyklu życia systemu Android, które prawidłowo wywołują konstruktor klasy podstawowej, gdy jest to konieczne.

+58

Może mógłbyś nam powiedzieć, na czym polegał problem? – Buffalo

4

Masz dwa filtry: Intent; potrzebujesz tylko jednego. Jeśli zarejestrujesz BroadcastReceiver przez registerReceiver(), używaj tylko IntentFilter, który jest drugim parametrem dla tej funkcji API - nie umieszczaj też w manifeście elementu <intent-filter> w <activity>.

Nie wiem na pewno, czy to jest twój problem, ale z pewnością nie pomaga.

7

Rozwiązałem go, dodając intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); po rozpoczęciu nowej aktywności.

Jeśli nie został uruchomiony z działania, potrzebna jest nazwa intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK".

+0

to działa dla mnie! –

0

Myślę, że musisz użyć metody cyklu życia onPause() i onResume() Metoda wyrejestrowania i zarejestrowania zamiaru transmisji.

0

Nie jestem pewien, czy potrafisz zrozumieć, co chcę powiedzieć, z powodu mojego angielskiego.

Myślę, że ta linia kodu jest przyczyną problemu:

userInfo.setSessionString(sessionString); 

Mój projekt był zły, bo chcę:

int i = Integer.parseint(intent.getExtars("9")); 

i zarejestrować się dwa razy.

0

Znalazłem, że upewniając się, że intencja została uruchomiona z pierwotnej działalności i umieszczenie rzeczy w jednej klasie pozbyło się całego problemu.

-1

Ok co pracował dla mnie było deklarowania metody onNotification następująco:

window.onNotification = function(event) { 
    alert('onNotification called!'); 
}; 
0

Jest to bardzo stare pytanie, ale myślę, że wiele osób nadal będzie poszukiwanie odpowiedzi na nią. Moja sytuacja jest podobna do tej.

Co chciałem zrobić, to wywołać metodę finish() w działaniu podrzędnym, gdy pewne zdarzenia występują w aktywności nadrzędnej, tj. Przez wysłanie wiadomości z MainActivity do aktywności dziecka.

Poniżej kod w główną działalność w momencie wystąpienia zdarzenia (na przykład, gdy połączenie zostanie uszkodzony itp itd)

Intent intent = new Intent("ACTIVITY_FINISH"); 
    intent.putExtra("FinishMsg","ACTIVITY_FINISH: Network broken."); 
    sendBroadcast(intent); 

w aktywności podrzędnego OnResume() Zastosowanie:

IntentFilter quitFilter = new IntentFilter(); 
    quitFilter.addAction("ACTIVITY_FINISH"); 
    registerReceiver(m_quitReceiver, quitFilter); 

W funkcja OnPause() funkcji aktywności dziecka:

unregisterReceiver(m_quitReceiver); 

W ramach działalności dla dzieci cl tyłek:

BroadcastReceiver m_quitReceiver = new BroadcastReceiver() 
{ 
    public void onReceive(Context context, final Intent intent) 
    { 
     if (intent.getAction().equalsIgnoreCase("ACTIVITY_FINISH")) 
     { 
      Log.d("INFO", intent.getExtras().getString("FinishMsg")); 
      finish(); // do here whatever you want 
     } 
    } 
}; 

Mam nadzieję, że to pomoże.

Powiązane problemy