2009-10-04 143 views
14

我在主要活動和發送廣播意圖的後臺服務中創建了廣播接收器。應用程序每次我嘗試運行它崩潰和日誌顯示以下錯誤消息:錯誤接收廣播意圖問題

10-04 13:30:43.218: ERROR/AndroidRuntime(695): 了java.lang.RuntimeException:錯誤 接收廣播意圖{ 行動= com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (具有額外)}在 [email protected]

廣播消息從發送CommunicationService類使用以下方法:

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

其中

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

在主活動下面廣播reveiver定義:

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

和的onResume方法註冊:

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

和清單文件一世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> 

我真的很感激,如果有人可以解釋爲什麼日誌顯示上面的信息和應用程序崩潰。

謝謝!

回答

5

您是否已經在調試器中一步一步地找到崩潰的確切位置?

有一點需要注意的是,如果您覆蓋任何Android生命週期事件,並且在必要時正確調用基類的構造函數。

+58

也許你可以告訴我們問題是什麼? – Buffalo 2012-11-02 12:22:08

4

您有兩個Intent過濾器;你只需要一個。如果您通過registerReceiver()註冊BroadcastReceiver,則只能使用該API調用的第二個參數IntentFilter - 不要將<intent-filter>元素放入清單中的<activity>

我不確定這是否是您的問題,但它肯定無濟於事。

7

我在開始一項新活動時通過添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);解決了問題。

如果不是從活動開始,則需要intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK"

+0

它適合我! – 2017-09-17 13:06:10

0

我認爲你必須使用生命週期方法onPause()onResume()註銷和註冊廣播意圖的方法。

0

我不確定你能理解我想說什麼,因爲我的英語。

我覺得這行代碼是一個問題的原因:

userInfo.setSessionString(sessionString); 

我的計劃是錯誤的,因爲我想:

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

和您註冊兩次。

0

我發現,確保意圖是從原來的活動運行,並把東西放到一個班級擺脫了整個問題。

-1

好什麼工作對我來說是聲明onNotification方法如下:

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

這是一個非常古老的問題,但我想很多人仍然會尋找它的答案。我的情況與此相似。

我想要做的是在父活動中發生某些事件時,在子活動中調用finish(),即將廣播消息從MainActivity發送到Child Activity。

以下是在MainActivity(例如,當網絡連接中斷等等等等)的代碼時發生的事件:

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

在孩子活動的的onResume()函數:

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

在孩子活動的OnPause()功能:

unregisterReceiver(m_quitReceiver); 

在孩子活動cl屁股:

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

希望這會有所幫助。