如果设备重新启动后注册,则广播员将被杀死



我有一个小部件,该小部件应在创建广播接收器时启动。此接收器会在发生电池时处理窗口小部件的更新。

这是我的代码:

  • 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);
        }
    }
}

最新更新