接收广播意图问题时出错

时间:2009-10-04 11:47:37

标签: android android-intent broadcastreceiver

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

  

10-04 13:30:43.218:   ERROR / AndroidRuntime(695):   java.lang.RuntimeException:错误   接收广播意图{   行动= com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE   (有额外的)} in   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>

如果有人能解释为什么Log显示上面的消息并且应用程序崩溃,我将非常感激。

谢谢!

8 个答案:

答案 0 :(得分:9)

我在您开始新的intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);时添加activity解决了这个问题。

如果未从activity启动,则需要intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

答案 1 :(得分:6)

您有两个Intent过滤器;你只需要一个。如果您通过BroadcastReceiver注册registerReceiver(),则只使用作为该API调用的第二个参数的IntentFilter - 不要在{<intent-filter>元素中添加<activity>元素清单中的1}}。

我不确定这是不是你的问题,但肯定没有帮助。

答案 2 :(得分:4)

您是否已经在调试器中一步一步找到发生崩溃的确切位置?

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

答案 3 :(得分:0)

我认为您必须使用生命周期方法onPause()onResume()方法取消注册并注册广播意图。

答案 4 :(得分:0)

由于我的英语,我不确定你能理解我想说的话。

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

userInfo.setSessionString(sessionString); 

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

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

你注册了两次。

答案 5 :(得分:0)

我发现确保意图是从原始活动中运行并将事物放入一个类中解决了整个问题。

答案 6 :(得分:0)

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

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

以下是事件发生时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
        }
    }
};

希望这有帮助。

答案 7 :(得分:-1)

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

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