我有一个小部件,该小部件应在创建广播接收器时启动。此接收器会在发生电池时处理窗口小部件的更新。
这是我的代码:
-
AppWidgetProvider代码:
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { broadcastReceiver = new BatteryInfo(); IntentFilter mIntentFilter = new IntentFilter(); mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); context.getApplicationContext().registerReceiver(broadcastReceiver, mIntentFilter); }
-
Broadcastreceiver代码
public class BatteryInfo extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { // some actions... } }
添加窗口小部件后正确起作用。窗口小部件的update被调用,然后在电池状态发生变化时接收器被调用。
重新启动设备后开始问题。设备恢复打开后,几秒钟的小部件重新开始自身,再次称为widget的onupdate,然后将接收器称为两次并立即死亡。此后出现在logcat中:
1950-3391/? I/ActivityManager: Process [my process name] (pid 7752) has died: cch+4CEM
1950-2013/? W/BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.ACTION_POWER_DISCONNECTED flg=0x4000010 (has extras) } to [my process name]/.BatteryInfo
1950-2013/? W/BroadcastQueue: Background execution not allowed: receiving Intent { act=android.intent.action.ACTION_POWER_CONNECTED flg=0x4000010 (has extras) } to [my process name]/.BatteryInfo
重新启动后窗口小部件被重新引入,为什么要重要?只要小部件在屏幕上,我才能确保接收器保持活力?
您是否忘记了Unregister
您的BroadCastReceiver
?请检查,如果您没有Unregistered
您的broadcastReciever
,请检查。
这是可以预期的。
重新装置设备后,所有侦听器将被删除,您应该再次注册它们。在这种情况下,您需要收听boot_complete Events再次注册广播。类似:
androidmanifest.xml:
<manifest>
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<application>
...
<!-- UPDATE YOUR BatteryInfo RECEIVER WITH the INFO BELOW -->
<receiver
...
android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
android:exported="true">
<intent-filter>
...
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
Powdateinfo.java
public class BatteryInfo extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("android.intent.action.BOOT_COMPLETED".equals(action) {
Log.v("BatteryInfo", "Boot completed. Registering to battery info events");
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
context.getApplicationContext().registerReceiver(this, intentFilter);
} else if() {
Log.v("BatteryInfo", "Battery event");
// Some Actions
} else {
Log.e("BatteryInfo", "Action not expected: " + action);
}
}
}