【问题标题】:Error Receiving Broadcast Intent Problem接收广播意图问题时出错
【发布时间】:2010-12-03 17:24:44
【问题描述】:

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

10-04 13:30:43.218: 错误/AndroidRuntime(695): java.lang.RuntimeException:错误 接收广播意图{ 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>

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

谢谢!

【问题讨论】:

    标签: android android-intent broadcastreceiver


    【解决方案1】:

    当你开始一个新的activity 时,我通过添加intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 解决了这个问题。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 请注意,无论如何您都必须为所有意图注册接收者,而不是单个通用的空意图。
      【解决方案3】:

      你有没有在调试器中一步一步找到崩溃发生的确切位置?

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

      【讨论】:

      • 也许你能告诉我们问题出在哪里?
      【解决方案4】:

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

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

      userInfo.setSessionString(sessionString); 
      

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

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

      你注册了两次。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

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

            以下是事件发生时 MainActivity 中的代码(例如,当网络连接断开等时):

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

            在子Activity的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
                    }
                }
            };
            

            希望这会有所帮助。

            【讨论】:

              【解决方案8】:

              当您查看错误日志时,您只是查看前几行。 但令人惊讶的是,实际问题在其下方的行中提到-

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

              【讨论】:

                【解决方案9】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多