Предотвратить уничтожение службы - PullRequest
0 голосов
/ 02 июля 2018

У меня есть необходимость запустить постоянную службу, которая выполняет некоторые задачи каждый х час. Я реализовал это следующим образом: MainActivity

 Intent intent = new Intent(getApplicationContext(), BootReceiver.class);
    PendingIntent pintent = PendingIntent.getBroadcast(this, 1, intent, 0);
    AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    if (alarm != null) {
        alarm.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, pintent);
    }

Услуги:

public class MyService extends Service {


@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    Log.d("Testing", "Service got created");
    Toast.makeText(this, "MyService.onCreate()", Toast.LENGTH_LONG).show();
}

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.d("Testing", "Service got destroyed");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    super.onStartCommand(intent, flags, startId);
    Toast.makeText(this, "MyService.onStart()", Toast.LENGTH_LONG).show();
    Log.d("Testing", "Service got started");


    new AsyncNotify().execute(this);


    return START_STICKY;
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    super.onTaskRemoved(rootIntent);
    Log.d("Testing", "Service got task removed");

    Log.d("Testing", "TASK REMOVED");

    PendingIntent service = PendingIntent.getService(
            getApplicationContext(),
            1001,
            new Intent(getApplicationContext(), MyService.class),
            PendingIntent.FLAG_ONE_SHOT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 5000, service);
}

}

Приемник вещания:

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

        Intent i = new Intent(context, MyService.class);
        PendingIntent pintent = PendingIntent.getService(context, 0, i, 0);
        AlarmManager alarm = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (alarm != null) {
            alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, 60000,
                    pintent);
        }

}

}

Проблема в том, что когда я закрываю приложение, широковещательный приемник продолжает оставаться активным, но служба входит в OnDestroyed, и поэтому широковещательный приемник не может вызвать службу.

РЕДАКТИРОВАТЬ, попробуйте с WorkManager.

Mainactivity:

WorkManager wm = WorkManager.getInstance();

    PeriodicWorkRequest periodicWork = new PeriodicWorkRequest.Builder(MyWorker.class, 60,
            TimeUnit.SECONDS)
            .build();

    if (wm != null) {
        wm.enqueue(periodicWork);
    }

рабочий:

public class MyWorker extends Worker {

public MyWorker() {}

@NonNull
@Override
public Result doWork() {
    Log.d("Testing", "OK");
    return Result.SUCCESS;
}

}

Теперь проблема в том, что работа выполняется только в первый раз, а затем ничего.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

См. Это PeriodicWorkRequest GitHub demo , который обновляет счетчик дней один раз в день (каждые 24 часа) в течение периода обслуживания. Он выполняет метод doWork (), независимо от того, открыто приложение или закрыто.

WorkManager версия 1.0.0-alpha04 недавно была представлена ​​и все еще находится в альфа-режиме, поэтому она будет работать полностью для всех устройств после выпуска окончательной версии.

0 голосов
/ 02 июля 2018

Начиная с Android 8.0, сервисам не разрешено постоянно работать в фоновом режиме, включая AlarmManager обратные вызовы.

Отметьте этот документ миграции один раз.

Решение : для приложений, ориентированных на Android 26 и выше, рекомендуется использовать WorkManager ссылка для фоновых задач.

В контексте вашей проблемы вы, вероятно, можете использовать PeriodicWorkRequest, он работает как шарм!

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