2009-10-04 5 views
14

Ich habe einen Broadcast-Empfänger in der Hauptaktivität und den Hintergrunddienst erstellt, der Broadcast Intents sendet. Die Anwendung stürzt jedes Mal, wenn ich versuche, es zu laufen und das Protokoll zeigt die folgende Fehlermeldung:Fehler Broadcast Intent empfangen Problem

10-04 13: 30: 43,218: ERROR/Android Runtime (695): java.lang.RuntimeException: Fehler Empfangen ausgestrahlt Intent { action = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (Extras hat)} in [email protected]

die Rundsendenachricht gesendet von CommunicationService-Klasse in der folgenden Methode:

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

wo

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

in der Haupttätigkeit ist die folgende Sendung reveiver definiert:

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

und in onResume Methode registriert:

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

Und der Manifest-Datei ich ncludes folgendes:

<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> 

ich wirklich, wenn jemand zu schätzen wissen würde erklären könnte, warum das Log die Meldung oben und stürzt die Anwendung anzeigt.

Danke!

Antwort

5

Haben Sie im Debugger Schritt für Schritt herausgefunden, wo genau der Absturz auftritt?

Eine Sache, auf die Sie achten sollten, ist, dass Sie alle Android-Lebenszyklus-Ereignisse außer Kraft setzen, wenn Sie den Konstruktor der Basisklasse bei Bedarf ordnungsgemäß aufrufen.

+58

Vielleicht könnten Sie uns sagen, was das Problem war? – Buffalo

4

Sie haben zwei Intent Filter; Du brauchst nur einen. Wenn Sie die BroadcastReceiver über registerReceiver() registrieren, verwenden Sie nur den IntentFilter, der der zweite Parameter für diesen API-Aufruf ist - fügen Sie auch kein <intent-filter> Element in die <activity> im Manifest ein.

Ich weiß nicht sicher, ob das Ihr Problem ist, aber es hilft sicherlich nicht.

7

Ich löste es durch Hinzufügen intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);, wenn Sie eine neue Aktivität starten.

Wenn nicht von einer Aktivität gestartet, wird intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK" benötigt.

+0

es funktioniert für mich! –

0

Ich denke, Sie müssen die Lebenszyklus-Methode onPause() und onResume() Methode für die Registrierung und Übertragung Broadcast Intent verwenden.

0

Ich bin nicht sicher, dass Sie verstehen können, was ich wegen meines Englisch sagen möchte.

ich glaube, diese Zeile Code Ursache eines Problems ist:

userInfo.setSessionString(sessionString); 

Mein Projekt war falsch, weil ich will:

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

und Sie registrieren zweimal.

0

Ich stellte fest, dass, um sicherzustellen, dass die Absicht von der ursprünglichen Aktivität ausgeführt wurde und Dinge in eine Klasse zu setzen, das gesamte Problem los wurde.

-1

Ok, was für mich gearbeitet wurde die onNotification Methode erklärt wie folgt:

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

Dies ist eine sehr alte Frage, aber ich denke, dass viele Menschen immer noch Antworten für sie werden gesucht. Meine Situation ist dieser sehr ähnlich.

Was ich tun wollte, ist, in der Kindaktivität finish() aufzurufen, wenn bestimmte Ereignisse in der übergeordneten Aktivität auftreten, d. H. Indem die Broadcast-Nachricht von MainActivity an Child Activity gesendet wird.

Im Folgenden finden Sie den Code in MainActivity, wenn das Ereignis aufgetreten ist (zB bei der Netzwerkverbindung unterbrochen etc etc):

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

in den Kinder Aktivität des onResume() Funktion:

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

In die Funktion OnPause() der Kindaktivität:

Innerhalb der untergeordneten Aktivität cl ass:

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

Hoffe, das hilft.