Я новичок в использовании класса обслуживания и хочу запустить фоновый сервис, но столкнулся с проблемой из-за фоновых ограничений 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);
}
}