Я нахожусь в процессе создания приложения, которое подобно встроенному приложению SMS.
В чем я нуждаюсь:
Что я попробовал:
- выполнение регулярного рейса, который работал просто великолепно до Android, уничтожает сервис
- использование AlarmManager для создания 5 минимальных вызовов интервала к сервису. Но я не смог сделать эту работу.
Одно из моих приложений делает что-то очень похожее. Чтобы разбудить службу по истечении заданного периода, я рекомендую postDelayed ()
Иметь поле обработчика:
private final Handler handler = new Handler();
и средство обновления Runnable
private final Runnable refresher = new Runnable() {
public void run() {
// some action
}
};
. Вы можете запускать свои уведомления в runnable.
При создании службы и после каждого выполнения запускайте ее следующим образом:
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));
}
}
Остановить ОС от отключения службы сложно. Также у вашего приложения может быть 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);
служба, которая всегда выполняется в фоновом режиме
Это невозможно в любом реальном смысле этого слова, как вы обнаружили. Это также плохой дизайн .
каждые 5 мин. служба проверяет текущее местоположение устройства и вызывает веб-службу
Используйте AlarmManager
.
с помощью AlarmManager установите 5 мин. интервальный вызов сервисной службы. Но я не смог выполнить эту работу.
Вот пример проекта , показывающий, как его использовать, а также использование WakefulIntentService
, чтобы вы не спали, пытаясь выполнить всю работу веб-службы.
Если у вас по-прежнему возникают проблемы, задайте новый вопрос о конкретных вещах, с которыми вы сталкиваетесь в AlarmManager
, которые вызывают у вас горе.