У меня проблема с приложением, которое я кодирую.
Мне нужно получать 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 секунд, но иногда этого может быть достаточно, чтобы пропустить некоторые намерения, вызывающие проблемы для пользователей моего приложения. Эти намерения могут быть зарегистрированы только в регистре регистрации, поэтому я не могу зарегистрировать их в манифесте. Как я мог прислушиваться к этим намерениям, не будучи убитым или отсутствующим?
Благодарю!
Как я мог прислушиваться к этим намерениям, не будучи убитым или отсутствующим?
Вы этого не сделаете. Вы переписываете свое приложение, чтобы либо не использовать эти трансляции, либо быть более устойчивыми в случае отсутствия трансляций. В конце концов, это не просто "Android убивает мой сервис, чтобы освободить оперативную память, а затем перезапустил его", но диспетчеры задач и тому подобное могут избавиться от вашего сервиса.