У меня планшет в API 19, и когда я убиваю приложение (вручную в диспетчере задач), служба перезапускается. Однако в моем телефоне (API 29) он не работает с тем же кодом, я не знаю почему!
Вот служба (я сделал ее очень простой для примера здесь! Это просто исполняемый файл, который запускается каждые 5 секунд и пишет «IN» в log.i):
public class ServiceAlarm extends Service {
private final LocalBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder
{
public ServiceAlarm getService()
{
return ServiceAlarm.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("CheckLo", "Destroyed");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
AsyncTask.execute(new Runnable() {
@Override
public void run()
{
RunnableTask();
}
});
return android.app.Service.START_STICKY;
}
@Override
public void onTaskRemoved(Intent rootIntent){
stopSelf();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
Log.i("CheckLo", "onTaskRemoved");
PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000,
restartServicePendingIntent);
super.onTaskRemoved(rootIntent);
}
private void RunnableTask()
{
Thread welcomeThread = new Thread() {
@Override
public void run() {
try {
super.run();
sleep(5000); //Delay of 5 seconds
} catch (Exception e) {
} finally {
Log.i("TEST", "IN");
RunnableTask(); //recall the function
}
}
};
welcomeThread.start();
}
}
И вот как я называю службу из своей деятельности
if (!isMyServiceRunning(ServiceAlarm.class))
{
Intent intent = new Intent(this, ServiceAlarm.class); //start service thats talks to all of the ESP
startService(intent);
}
private boolean isMyServiceRunning(Class<?> serviceClass) { //check if service is already running so it doesnt run twice
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
Log.i("CheckLo", "Service running");
return true;
}
}
Log.i("CheckLo", "Service not running");
return false;
}
Я настаиваю, она работает на API 19, а не на 29. Мне нужен сервис, который будет запустить, даже если приложение закрыто, убито, ...