Итак, я пытаюсь запустить службу в фоновом режиме, которая может отправлять некоторые данные приложения на мой сервер. Пока что я пробовал использовать классы AlarmManager, JobScheduler для периодического запуска службы, но это бесполезно поскольку все созданные аварийные сигналы и запланированные задания УДАЛЯЮТСЯ при закрытии приложения (закрытие здесь не означает принудительную остановку). Я огляделся и увидел много вопросов StackOverflow для аналогичных вариантов использования (но более старых версий android) и той же проблемы с очисткой, но ни один конкретный ответ или реализация, которые я нашел, не работают. (Это проблема с последними версиями android?)
Мой вариант использования - загрузка небольших данных (в килобайтах) один или два раза в день из приложения для отслеживания использования приложения.
Поскольку я не могу ожидать, что пользователь будет держать свое приложение открытым весь день ...
- Как добиться этой периодичности, как описано?
UPDATE-1
Согласно ответу @Kabumere и некоторой помощи из android документации разработчиков, я использовал WorkManager и попробовал этот код ниже Ожидаемое поведение (на данный момент) непрерывно повторяющиеся журналы с 20-минутным интервалом (20 минут только для тестирования) независимо от того, было ли приложение закрыто (ie этот 30-минутный интервал между 6 и 7) Фактическое поведение
- приложение находится в фокусе на тестовом устройстве (genymotion android 9)
- 08: 47 onCreate планирует первое задание, и оно запускается
- приложение закрыто, но присутствует в последних
- 09: 02 выполняется второе задание (с интервалом 15 минут)
- приложение теперь закрыто с недавнего
- // дальнейших журналов для 30 минут, задания не запущены
- 09: 36 приложений запущено вручную, ничего не ставится в очередь согласно logi c
- задания продолжаются с 15-минутным интервалом
2020-08-05 08:47:53.260 7746-7746/com.example.workmanagerapi D/debugTag: Scheduling
2020-08-05 08:47:53.655 7746-7802/com.example.workmanagerapi D/debugTag: DOING SOME WORK !!!
2020-08-05 09:02:53.732 7746-8007/com.example.workmanagerapi D/debugTag: DOING SOME WORK !!!
2020-08-05 09:36:47.165 8347-8347/com.example.workmanagerapi D/debugTag: Already Scheduled
2020-08-05 09:36:47.193 8347-8376/com.example.workmanagerapi D/debugTag: DOING SOME WORK !!!
2020-08-05 09:51:47.269 8347-8486/com.example.workmanagerapi D/debugTag: DOING SOME WORK !!!
MainActivity. java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences SP = getSharedPreferences("prefs",MODE_PRIVATE);
SharedPreferences.Editor editor = SP.edit();
boolean enqueue = SP.getBoolean("enqueue", false);
if(enqueue) {
Log.d("debugTag", "Already Scheduled");
}
else {
Log.d("debugTag", "Scheduling");
doWork();
editor.putBoolean("enqueue",true);
editor.apply();
}
}
private void doWork() {
PeriodicWorkRequest.Builder myWorkBuilder = new PeriodicWorkRequest.Builder(MyWorker.class, 1, TimeUnit.MINUTES);
// i read on docs that this time limit will default to (5+15) minutes minimum
PeriodicWorkRequest myWork = myWorkBuilder.build();
WorkManager.getInstance(this).enqueue(myWork);
}
}
MyWorker. java
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
super(context, workerParams);
}
@NonNull
@Override
public Result doWork() {
Log.d("debugTag", "DOING SOME WORK !!!");
return Result.success();
}