Как запустить бесконечный цикл с JobIntentService, пока он работает в фоновом режиме - PullRequest
0 голосов
/ 26 января 2019

Я новичок в использовании класса обслуживания и хочу запустить фоновый сервис, но столкнулся с проблемой из-за фоновых ограничений Android, потому что у меня телефон Oreo API = 27.Так что я изменил код как JobIntentService, но при попытке бесконечного кода Android система принудительно завершает работу службы и снова планирует перезапуск.Но мне нужно, чтобы он работал бесконечно (я знаю о разряде батареи, но это необходимо.)

Мое приложение будет считывать содержимое файла в течение определенного периода времени (например, 5 секунд), и если оно изменилось, оно обновитсядругой файл согласно некоторой логике в myCode, и приложение не имеет класса активности и пользовательского интерфейса.

MyReceiver.java равен

//@RequiresApi(api = Build.VERSION_CODES.O)
//I have logic for check API 26+ and 26-
@Override
public void onReceive(Context context, Intent intent) {
    //intent action filtered but not showed because make it more readable.
    MyService.enqueueWork(context,myIntent); //myIntent is assigned previously code but not showed.
    context.startForegroundService(myIntent);
}

MyService.java равен

@Override
public void onCreate() {
    super.onCreate();
    startForeground(NOTIFICATION_ID, notification); //notification is set previously code but not showed.
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "myService Started!");
    //do infinite loop here but it fails because of time-out.
    while (true){
    //my code
    if(cond)break;
    }
    return super.onStartCommand(intent, flags, startId);

}

ОБНОВЛЕНИЕ: Я обновил myService для запуска обработчика, и теперь он работает, но до сих пор не знаю, как система Android убивает обработчик, и если принудительно убивает, я не знаю, как принудительно перезапустить.

MyService.java обновляется как:

public class MyService extends JobIntentService {
    private Handler=new Handler();
    Runnable runnable=new Runnable() {
        @Override
        public void run() {
           if (a>=Integer.MAX_VALUE-1)
                a=0;
            Log.d(TAG,"RunningHandler_"+ ++a +"_times");
            try {
                Thread.sleep(1000); //1s sleep
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            handler.postDelayed(runnable,0);
        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "myService Started!");
        handler.postDelayed(runnable,0);
        return super.onStartCommand(intent, flags, startId);

    }
}
...