19

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

10-04 13:30:43.218: ERROR/AndroidRuntime(695): java.lang.RuntimeException: 在 com.client 中接收广播 Intent { action=com.client.gaitlink.CommunicationService.action.LOGIN_STATUS_UPDATE (有附加功能)时出错。 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>

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

谢谢!

4

8 回答 8

10

我通过intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);在您开始新的activity.

如果不是从 , 开始activityintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);则需要。

于 2010-12-27T09:26:32.547 回答
7

你有两个Intent过滤器;你只需要一个。如果您注册BroadcastReceivervia registerReceiver(),请仅使用该IntentFilterAPI 调用的第二个参数 - 不要在清单<intent-filter>中的 中添加元素。<activity>

我不确定这是否是您的问题,但这肯定无济于事。

于 2009-10-04T12:12:32.963 回答
5

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

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

于 2009-10-04T11:55:38.340 回答
0

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

于 2012-06-05T11:18:32.797 回答
0

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

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

userInfo.setSessionString(sessionString); 

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

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

你注册了两次。

于 2012-08-03T00:52:06.550 回答
0

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

于 2014-01-13T04:52:14.923 回答
0

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

我想要做的是在父活动中发生某些事件时在子活动中调用完成(),即通过将广播消息从 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
        }
    }
};

希望这可以帮助。

于 2016-03-10T16:39:23.837 回答
-5

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

    window.onNotification = function(event) {
    alert('onNotification called!');
};
于 2015-08-07T15:01:35.010 回答