Periodi c задача завершается, когда приложение останавливается на Android 8+ - PullRequest
0 голосов
/ 02 августа 2020

Всем привет, я пытаюсь реализовать задачу periodi c на Android, но я застрял на некоторых устройствах.

Мне нужно запускать задачу в фоновом режиме каждые 15 или 30 минут. Это хорошо работает на Android до 8.0. Но на 8+ он работает только тогда, когда приложение находится в фоновом режиме или на переднем плане. Когда приложение удаляется из недавних, запланированные задачи уничтожаются на реальных устройствах (Ulefone note 7 (Android 8.1), Tecno LC7 (Android 10), itel A56 (Abdroid 9)), но хорошо работает на эмуляторах (Android 10). Я пробовал несколько способов:

1.Workmanager (работает только когда приложение находится в фоновом или переднем плане)

build.gradle

implementation "androidx.work:work-runtime:2.4.0"

MainActivity

PeriodicWorkRequest periodicSyncDataWork =
                    new PeriodicWorkRequest.Builder(NotificationWorker.class, 15,TimeUnit.MINUTES)
                            .addTag("TAG_SYNC_DATA")
                            .setBackoffCriteria(BackoffPolicy.LINEAR,PeriodicWorkRequest.MIN_BACKOFF_MILLIS, TimeUnit.MILLISECONDS)
                            .build();
WorkManager.getInstance(this).enqueueUniquePeriodicWork(
                    "NOTIFICATION_WORKER",
                    ExistingPeriodicWorkPolicy.REPLACE, //Existing Periodic Work policy
                     periodicSyncDataWork //work request
            );

NotificationWorker

public class NotificationWorker extends Worker {
public NotificationWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) 
{
    super(context, workerParams);
}


@NonNull
@Override
public Result doWork() {
    Log.d("MYWORKER", "LLLLLLLLLLL");
    //My code here
    return Result.success();
}

}

2.JobScheduler (работает только когда приложение находится в фоновом или переднем плане)

ComponentName serviceComponent = new ComponentName(context, NotifJobService.class);
    JobInfo.Builder builder = new JobInfo.Builder(1880, serviceComponent);
    builder.setPersisted(true);
    builder.setPeriodic(16*60*1000, 20*60 *1000);
    JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
    jobScheduler.schedule(builder.build());

3.Alarm Manager (не запускает BroadcastReceiver)

Основной код

Intent intent = new Intent(getApplicationContext(), MyIntentService.class);
    final PendingIntent pIntent = PendingIntent.getBroadcast(this, 100,intent, PendingIntent.FLAG_UPDATE_CURRENT);
    long firstMillis = System.currentTimeMillis();
    AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, AlarmManager.INTERVAL_FIFTEEN_MINUTES, pIntent);

BroadcastReceiver

public class NotificationBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

    Intent in = new Intent(context, MyIntentService.class);
    context.startService(in);
}
}

The IntentService

public class MyIntentService extends IntentService {
    public MyIntentService(String name) {
        super(name);
    }
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d("NotifIntentService", "Starting");
        //My task here
    }
}

Я не могу понять, что я здесь делаю не так. Пожалуйста, помогите

1 Ответ

2 голосов
/ 02 августа 2020

Я зацикливался на одной и той же проблеме в течение нескольких дней и в конце концов обнаружил, что пока нет правильного способа сделать это, кроме как попросить пользователей предоставить некоторые разрешения (автоматический запуск, оптимизация заставки и т. Д. c ..)

, вы можете найти дополнительную информацию здесь: https://dontkillmyapp.com

Этот вопрос задают разными способами, но нет хороших ответов, но здесь вы, вероятно, можете найти некоторые ответы, которые абстрактным будет то, что я вам только что сказал. Диспетчер работы на китайских ПЗУ, таких как Xiaomi и OPPO, при оптимизации батареи увеличивает запланированную задержку работы на несколько часов

...