Одно из моих приложений делает что-то очень похожее. Для того, чтобы разбудить службы после определенного периода я рекомендую postDelayed()
Есть поле обработчика:
private final Handler handler = new Handler();
и курсы повышения Runnable
private final Runnable refresher = new Runnable() {
public void run() {
// some action
}
};
Вы можете запустить свои уведомления в работоспособной.
На строительство услуг, а также после каждого начала выполнения его следующим образом:
handler.postDelayed(refresher, /* some delay in ms*/);
В onDestroy()
удалить сообщение
handler.removeCallbacks(refresher);
Чтобы запустить службу во время загрузки вам нужно авто стартер. Это идет в манифесте
<receiver android:name="com.example.ServiceAutoStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
и ServiceAutoStarter
выглядит следующим образом:
public class ServiceAutoStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, UpdateService.class));
}
}
Остановка OS от убийства сервиса сложно. Также ваше приложение может иметь RuntimeException
и сбой, или ваша логика может остановиться.
В моем случае это помогло всегда обновлять сервис на экране с помощью BroadcastReceiver
. Поэтому, если цепочка обновлений застопорилась, она будет воскрешена, поскольку пользователь использует свой телефон.
В службе:
private BroadcastReceiver screenOnReceiver;
В вашей службе onCreate()
screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Some action
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
Тогда разрегистрировать свой сервис на onDestroy()
с
unregisterReceiver(screenOnReceiver);
Я обычно как ваши ответы, но этот ... не так много. :-(Например, вы предлагаете, чтобы служба регистрировала приемник, чтобы воскресить себя после его убийства. Получатель будет убит вместе с сервисом, поэтому это не должно иметь никакого эффекта. Более того, вся концепция вечного служения ужасна на Android и является причиной, по которой пользователи борются с убийцами задач или экраном Running Services в приложении «Настройки». Очень мало случаев, когда требуется действительно вечный сервис - в большинстве случаев достаточно «AlarmManager». – CommonsWare
Спасибо, CWare, я, вероятно, должен был сделать более ясным, что Resurrector должен защитить от сбоя логики и многих вещей, которые могут остановить цепочку событий, которые разбудили службу, поскольку то, что приписывается системе, закрывающей службу, часто может быть чем-то другим . Я рассмотрю подход диспетчера будильника, я смутно помню, как это пытались сделать некоторое время назад и не смог заставить его работать. –