【问题标题】:Getting fatal exception during intent.action.BATTERY_CHANGED在 intent.action.BATTERY_CHANGED 期间出现致命异常
【发布时间】:2013-01-21 12:20:54
【问题描述】:

我制作了一个简单的应用来查看设备的电池电量。 我使用此代码:

private void setProperImageByBatteryLevel() {

    BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            context.unregisterReceiver(this);
            int rawlevel = intent.getIntExtra("level", -1);
            int scale = intent.getIntExtra("scale", -1);
            int level = -1;
            if (rawlevel >= 0 && scale > 0) {
                level = (rawlevel * 100) / scale;
            }
            if (DEBUG) {
                Log.i(TAG, "Charge: " + Integer.toString(level) + "%");
            }
            if (level > 80) {
                batteryImg.setImageResource(R.drawable.bat100);
            } else if (level > 60) {
                batteryImg.setImageResource(R.drawable.bat80);
            } else if (level > 40) {
                batteryImg.setImageResource(R.drawable.bat60);
            } else if (level > 20) {
                batteryImg.setImageResource(R.drawable.bat40);
            } else if (level > 0) {
                batteryImg.setImageResource(R.drawable.bat20);
            }
        }
    };
    IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    activity.registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}

它工作正常,但有时我得到以下异常:(大约 10/1 次)

01-21 13:16:56.617: E/AndroidRuntime(7810): FATAL EXCEPTION: main
01-21 13:16:56.617: E/AndroidRuntime(7810): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in hu.trendency.activitimap.widgets.Battery$2@4053e3b8
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.os.Handler.handleCallback(Handler.java:587)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.os.Looper.loop(Looper.java:123)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.app.ActivityThread.main(ActivityThread.java:3687)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at java.lang.reflect.Method.invokeNative(Native Method)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at java.lang.reflect.Method.invoke(Method.java:507)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at dalvik.system.NativeStart.main(Native Method)
01-21 13:16:56.617: E/AndroidRuntime(7810): Caused by: java.lang.IllegalArgumentException: Receiver not registered: hu.trendency.activitimap.widgets.Battery$2@4053e3b8
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:610)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:919)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at hu.trendency.activitimap.widgets.Battery$2.onReceive(Battery.java:92)
01-21 13:16:56.617: E/AndroidRuntime(7810):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)
01-21 13:16:56.617: E/AndroidRuntime(7810):     ... 9 more

有人看到问题了吗?

编辑:

我改变了你告诉我的方式,现在我得到了这个:

01-23 14:43:40.205: E/AndroidRuntime(27064): FATAL EXCEPTION: main
01-23 14:43:40.205: E/AndroidRuntime(27064): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.BATTERY_CHANGED flg=0x60000000 (has extras) } in hu.trendency.activitimap.widgets.Battery$2@40534080
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:722)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.os.Handler.handleCallback(Handler.java:587)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.os.Looper.loop(Looper.java:123)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.app.ActivityThread.main(ActivityThread.java:3687)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at java.lang.reflect.Method.invokeNative(Native Method)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at java.lang.reflect.Method.invoke(Method.java:507)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at dalvik.system.NativeStart.main(Native Method)
01-23 14:43:40.205: E/AndroidRuntime(27064): Caused by: java.lang.IllegalArgumentException: Receiver not registered: hu.trendency.activitimap.widgets.Battery$2@40534080
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:610)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:919)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at hu.trendency.activitimap.widgets.Battery$2.onReceive(Battery.java:93)
01-23 14:43:40.205: E/AndroidRuntime(27064):    at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:709)

【问题讨论】:

  • 不要在自身内部注册广播寄存器。在清单或活动中将其放入您的问题是 java.lang.IllegalArgumentException: Receiver not registered: hu.trendency.activitimap.widgets.Battery$2@4053e3b8

标签: android android-intent


【解决方案1】:

改变

context.unregisterReceiver(this);

activity.unregisterReceiver(this);

因为您在onReceive() 中获得的上下文可能与您最初用于注册接收者的上下文相同,也可能不同。

您还可以使用 try/catch 块包围对 unregisterReceiver() 的调用,然后捕获并忽略 IllegalArgumentException

【讨论】:

  • 另一个例外,也许我应该重新开始。
  • 嗯,您需要跟踪您在哪里注册接收器,以便您可以适当地取消注册它。要么这样,要么在注销时捕获并忽略所有异常。
  • 根据您的编辑,它会在unregisterReceiver() 中抛出IllegalArgumentException,但即使我建议您这样做,您显然也没有注意到这一点。请发布您的更新代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
相关资源
最近更新 更多