Тревоги и задания сбрасываются при закрытии приложения? - PullRequest
1 голос
/ 05 августа 2020

Итак, я пытаюсь запустить службу в фоновом режиме, которая может отправлять некоторые данные приложения на мой сервер. Пока что я пробовал использовать классы AlarmManager, JobScheduler для периодического запуска службы, но это бесполезно поскольку все созданные аварийные сигналы и запланированные задания УДАЛЯЮТСЯ при закрытии приложения (закрытие здесь не означает принудительную остановку). Я огляделся и увидел много вопросов StackOverflow для аналогичных вариантов использования (но более старых версий android) и той же проблемы с очисткой, но ни один конкретный ответ или реализация, которые я нашел, не работают. (Это проблема с последними версиями android?)

Мой вариант использования - загрузка небольших данных (в килобайтах) один или два раза в день из приложения для отслеживания использования приложения.

Поскольку я не могу ожидать, что пользователь будет держать свое приложение открытым весь день ...

  • Как добиться этой периодичности, как описано?

UPDATE-1

Согласно ответу @Kabumere и некоторой помощи из android документации разработчиков, я использовал WorkManager и попробовал этот код ниже Ожидаемое поведение (на данный момент) непрерывно повторяющиеся журналы с 20-минутным интервалом (20 минут только для тестирования) независимо от того, было ли приложение закрыто (ie этот 30-минутный интервал между 6 и 7) Фактическое поведение

  1. приложение находится в фокусе на тестовом устройстве (genymotion android 9)
  2. 08: 47 onCreate планирует первое задание, и оно запускается
  3. приложение закрыто, но присутствует в последних
  4. 09: 02 выполняется второе задание (с интервалом 15 минут)
  5. приложение теперь закрыто с недавнего
  6. // дальнейших журналов для 30 минут, задания не запущены
  7. 09: 36 приложений запущено вручную, ничего не ставится в очередь согласно logi c
  8. задания продолжаются с 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();
    }

1 Ответ

0 голосов
/ 05 августа 2020

Я бы рекомендовал использовать WorkManager API вместо создания службы.

С помощью WorkManager вы можете поставить в очередь PeriodicWorkRequest , который будет выполняться с заданным вами интервалом. его Конструктор Builder (вроде запускается каждые 24 часа). Запланированные задания через WorkManager не должны удаляться при закрытии приложения, они будут автоматически перенесены при различных событиях, таких как перезагрузка устройства, и могут выполняться, даже когда приложение находится в фоновом режиме.

Вы также можете установить Ограничения на запросы WorkRequests, чтобы вы могли указать такие вещи, как «пытаться запустить это задание только при наличии какого-либо подключения к данным» (setRequiredNetworkType(NetworkType.CONNECTED)). Это хорошо для вашего случая использования, когда вам нужно отправить данные, для чего потребуется некоторое соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...