Перезапуск службы, когда приложение убито, не работает на API> 19 - PullRequest
0 голосов
/ 20 марта 2020

У меня планшет в 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. Мне нужен сервис, который будет запустить, даже если приложение закрыто, убито, ...

...