Вечный BroadcastReceiver

1

У меня проблема с приложением, которое я кодирую.
Мне нужно получать ACTION_SCREEN_ON, ACTION_SCREEN_OFF и ACTION_USER_PRESENT намерения каждый раз, когда они транслируются, поэтому мое приложение, конечно, остается в фоновом режиме. В настоящее время мое приложение создано активностью настроек и службой. ScreenReceiver - это BroadcastReceiver, который получает ACTION_SCREEN_ * намерения, а UnlockReceiver получает намерение ACTION_USER_PRESENT. Служба регистрирует и отменяет регистрацию получателей:

public class MainService extends Service {
    ScreenReceiver screenReceiver = null;
    UnlockReceiver unlockReceiver = null;

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

    @Override
    public void onStart(Intent intent, int startId) {
        doStart();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        doStart();

        return START_STICKY;
    }

    public void doStart() {
        if(screenReceiver != null && unlockReceiver != null)
            return;

        IntentFilter filter;

        if(screenReceiver == null) {
            filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_SCREEN_OFF);

            screenReceiver = new ScreenReceiver();
            registerReceiver(screenReceiver, filter);
        }

        if(unlockReceiver == null) {
            filter = new IntentFilter();
            filter.addAction(Intent.ACTION_USER_PRESENT);

            unlockReceiver = new UnlockReceiver();
            registerReceiver(unlockReceiver, filter);
        }
    }

    @Override
    public void onDestroy() {
        if(screenReceiver != null)
            unregisterReceiver(screenReceiver);

        if(unlockReceiver != null)
            unregisterReceiver(unlockReceiver);
    }
}  

Но иногда Android убивает мой сервис, чтобы освободить некоторую ОЗУ, а затем перезапустит его. Время между убийством и респауном обычно составляет около 5 секунд, но иногда этого может быть достаточно, чтобы пропустить некоторые намерения, вызывающие проблемы для пользователей моего приложения. Эти намерения могут быть зарегистрированы только в регистре регистрации, поэтому я не могу зарегистрировать их в манифесте. Как я мог прислушиваться к этим намерениям, не будучи убитым или отсутствующим?

Благодарю!

Теги:

1 ответ

0
Лучший ответ

Как я мог прислушиваться к этим намерениям, не будучи убитым или отсутствующим?

Вы этого не сделаете. Вы переписываете свое приложение, чтобы либо не использовать эти трансляции, либо быть более устойчивыми в случае отсутствия трансляций. В конце концов, это не просто "Android убивает мой сервис, чтобы освободить оперативную память, а затем перезапустил его", но диспетчеры задач и тому подобное могут избавиться от вашего сервиса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню