2013-01-21 64 views
1

我做了一个简单的应用程序,监视设备的电池电量。 我用这个代码:intent.action.BATTERY_CHANGED期间发生致命异常

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 [email protected] 
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: [email protected] 
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 [email protected] 
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: [email protected] 
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) 
+0

不要在其内部注册广播寄存器。要么把它在清单或活动你的问题是java.lang.IllegalArgumentException:收件人未注册:[email protected] – 2013-01-21 12:25:45

+0

可以参考http://stackoverflow.com/questions/6165070/receiver-没有注册异常错误.. – user1969053

回答

3

变化

context.unregisterReceiver(this); 

activity.unregisterReceiver(this); 

因为上下文,你获得onReceive()可能会或可能不是您用于首先注册接收器的上下文。

您也可以使用try/catch块环绕对unregisterReceiver()的调用,并捕获并忽略IllegalArgumentException

+0

我试着两个,让我们看到错误消失:) –

+0

另一个例外,也许我应该开始它。 –

+0

那么,您需要跟踪您注册接收器的位置,以便您可以正确取消注册。要么是这样,要么只是在注销时忽略和忽略所有异常。 –

相关问题