2009-10-04 99 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 
     } 
    } 
}; 

希望这会有所帮助。