接收广播意图出错问题

23

我在主活动中创建了一个广播接收器和一个后台服务,该服务正在发送广播意图。每次尝试运行应用程序时,应用程序都会崩溃,并且日志显示以下错误消息:

 

10-04 13:30:43.218:   ERROR / AndroidRuntime(695):   java.lang.RuntimeException:Error   接收广播意图{   action = com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE   (有额外内容)}在   com.client.gaitlink.GaitLink $LoginStatusReceiver @ 431690e8

广播消息是从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"
在主活动中定义了以下广播接收器:
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);

清单文件包括以下内容:

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

如果有人能够解释为什么日志记录了上面的消息并且应用程序崩溃,我将不胜感激。

谢谢!

10个回答

11

当你启动一个新的activity时,通过添加 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 来解决此问题。

如果不是从activity启动,则需要添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


7
你有两个Intent过滤器,只需要一个。如果你通过registerReceiver()注册BroadcastReceiver,则只需使用该API调用的第二个参数IntentFilter,不要在清单文件中的<activity>元素中还添加<intent-filter>元素。
我无法确定那是否是你的问题,但这种做法肯定无助于解决问题。

请注意,您必须为所有意图注册接收器,而不是单个通用的空意图。 - pw2

6

你是否已经逐步使用调试器找到了崩溃发生的确切位置?

需要注意的一点是,如果你正在覆盖任何Android生命周期事件,那么在必要时正确调用基类的构造函数。


97
你能告诉我们问题出在哪里吗? - Buffalo

5
当你查看错误日志时,你只看到最前面的几行内容。但是令人惊讶的是,实际问题可能在它下面的行中提到。
Fatal Error : Main
error receiving broadcast...bla bla bla  <- you are just looking here only
at x.y.z.....
at x.y.z......
at x.y.z.....
at x.y.z......
caused by : ........................... <- but actual problem is here!
at x.y.z.....
at x.y.z......
at x.y.z.....
at x.y.z......

0

这是一个非常古老的问题,但我认为仍有许多人在寻找答案。我的情况与此类似。

我想做的是,在父活动中通过发送广播消息从MainActivity到Child Activity,当某些事件发生时在子活动中调用 finish()。

以下是当事件发生(例如网络连接断开等)时 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);

在子活动类中:

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

希望这能有所帮助。

0

我发现确保意图从原始活动运行并将事物放入一个类中可以消除整个问题。


0

可能是因为您不断地注册BroadcastReceiver的缘故。我之前也犯过这个错误,导致返回了这个错误。请确保BroadcastReceiver只注册一次。


0

我不确定你能否理解我的意思,因为我的英语不太好。

我认为这行代码是问题的原因:

userInfo.setSessionString(sessionString); 

我的项目出错了,因为我想要:

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

而且你注册了两次。


0
我认为你需要使用生命周期方法 onPause()onResume() 来注销和注册广播意图。

-5

好的,对我有效的方法是将onNotification方法声明如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接