У меня есть необходимость запустить постоянную службу, которая выполняет некоторые задачи каждый х час. Я реализовал это следующим образом:
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;
}
}
Теперь проблема в том, что работа выполняется только в первый раз, а затем ничего.