У меня есть служба, которая работает в отдельном процессе. Он используется для сбора и обработки информации о местоположении. Когда пользователь запрашивает местоположение, я запускаю его в режиме переднего плана.
Когда пользователь выходит из системы, я очищаю данные приложения, во время которых я останавливаю службу и отключаю службу от клиента rpc (по сути, отменяю привязку службы).
Без перезапуска приложения, если я снова войду в систему и попытаюсь запустить службу на переднем плане, она не будет работать в режиме переднего плана (служба уже запущена).
Вещи, которые я уже отметил и попробовал -
- проверил, что сервис запущен. Как ? Я общался между
оба процесса (процесс, выполняющий службу и другой процесс связи) используют rpc. Также местоположение фиксируется службой и отправляется другому процессу (скажем, процессу пользовательского интерфейса), который также работает.
Module(ReactApplicationContext reactContext) { //module constructor called when app starts
reactContext.startService(new Intent(reactContext, BackgroundService.class)); //starts sevice
ThreadManager.getWorkerHandler().post(new Runnable() {
@Override
public void run() {
bsClient = new rpcClient(getName(), Module.this.reactContext, new ComponentName(Module.this.reactContext, BackgroundService.class),Module.this); //rpc client starts service and binds the service.
}
});
}
public void cleanAppData(Callback cb) {
bsClient.disconnect(); //disconnects client (just unbinds service and cancels a timer)
reactContext.stopService(new Intent().setComponent(new ComponentName(reactContext, BackgroundService.class)));
bsClient.connect(); //connects the client again and starts the timer
cb.invoke();
}
/////////////////
rpc client connect function
private void _connect(){
try {
Intent intent = new Intent();
intent.setComponent(mComponentName);
mContext.startService(intent);
mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
catch (Exception ignored){}
}
public void connect(){
if(timer != null) return;
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(isAlive()) return; //checks if the other process is alive or not
cb.onDisconnect();
_connect();
}
}, 0, 1000);
}
public boolean isAlive() {
return serviceMessenger != null && serviceMessenger.getBinder().pingBinder(); //serviceMessenger is an object for rpc used for sending data
}
Поскольку служба запущена, она должна запускаться на переднем плане и отображать уведомление, которого нет.
Последовательность действий:
1. служба запускается, связывается.
2. сервис запущен на переднем плане. (пользователь инициируется при запросе местоположения)
3. если данные приложения очищены (происходит при выходе из системы), служба останавливается и перезапускается.
4. повторить с 1.