BroadcastReceiver время от времени перестал работать в моем сервисе, почему? - PullRequest
0 голосов
/ 21 апреля 2011

Я сейчас пишу виджет батареи для Android.Но вот проблема, я зарегистрировал два BroadcastReceivers в моем сервисе.Я запускаю свой сервис с помощью метода onEnable () моего AppWidgetProvider и останавливаю его в onDisable ().Служба предназначена для прослушивания обновлений состояния батареи и изменения ориентации и уведомления виджета об обновлении себя путем отправки моего пользовательского намерения в мой AppWidgetProvider.Поскольку и широковещательная рассылка (battery_state_changed и configuration_changed) не может быть принята обычным AppWidgetProvider, а AppWidgetProvider не может зарегистрировать BroadcastReceivers сам по себе.

Все работает правильно в течение дня или двух.Но иногда виджет просто не обновлялся, когда менялось состояние батареи, кажется, что или приемник в моем сервисе не работал, или пользовательское намерение внезапно перестало успешно достигать моего AppWidgetProvider.

AnyИдея, почему это происходит?

package com.carllee.widgets.kittenbatterywidget;

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

public class BatteryStateMoniterService extends Service {
    private static final String TAG = "BatteryStateMoniterService";
    private BatteryStateReceiver batteryStateReceiver;
    private OrientationChangeReceiver orientationChangeReceiver;

    @Override
    public void onCreate() {
        super.onCreate();
        Logger.log(TAG, "onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (batteryStateReceiver == null) {
            this.unregisterReceiver(batteryStateReceiver);
        }
        if (orientationChangeReceiver == null) {
            this.unregisterReceiver(orientationChangeReceiver);
        }
        Logger.log(TAG, "onDestroy");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (batteryStateReceiver == null) {
            registerBatteryStateReceiver();
        }

        if (orientationChangeReceiver == null) {
            registerOrientationChangeReceiver();
        }
        Logger.log(TAG, "onStartCommand");
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private void registerBatteryStateReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_BATTERY_OKAY);
        batteryStateReceiver = new BatteryStateReceiver();
        this.registerReceiver(batteryStateReceiver, filter);
    }

    private void registerOrientationChangeReceiver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
        orientationChangeReceiver = new OrientationChangeReceiver();
        this.registerReceiver(orientationChangeReceiver, filter);
    }

}

1 Ответ

0 голосов
/ 21 апреля 2011

Ну, например, утверждение:

    if (batteryStateReceiver == null) {
        this.unregisterReceiver(batteryStateReceiver);
    }
    if (orientationChangeReceiver == null) {
        this.unregisterReceiver(orientationChangeReceiver);
    }

не имеет никакого смысла. Вы получите NullPointerException каждый раз. Измените == на !=;)

Также см. мой пост о том, как поддерживать фоновые службы.

Пример сложной службы, которая работает в фоновом режиме в течение длительных периодов (по необходимости), которая вызывает startForeground(). Однако он все еще может быть убит системой или пользователем.

...