BroadcastReceiver будет убит при регистрации после перезагрузки устройства - PullRequest
0 голосов
/ 07 марта 2019

У меня есть виджет, который должен запускать приемник вещания при его создании. Этот приемник обрабатывает обновление виджета при смене батареи.

Это мой код:

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

Это работает правильно после добавления виджета. Вызывается onUpdate виджета, затем вызывается приемник при изменении состояния батареи.

Проблема начинается после перезагрузки устройства. После того, как устройство снова включено, через несколько секунд виджет повторно инициализирует себя, снова вызывается 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

Почему это важно, если виджет был переинициализирован после перезагрузки? Как я могу гарантировать, что мой приемник остается живым, пока виджет на экране?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Ожидается.

После перезагрузки устройства все слушатели будут удалены, и вам необходимо зарегистрировать их снова. В этом случае вам необходимо прослушать события BOOT_COMPLETE, чтобы снова зарегистрировать свою трансляцию. Что-то вроде:

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>

BatteryInfo.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);
        }
    }
}
0 голосов
/ 07 марта 2019

Вы забыли Unregister свой BroadCastReceiver? пожалуйста, проверьте, и если у вас нет Unregistered вашего broadcastReciever, чем это сделать.

...