Служба работает, но не запускается в режиме переднего плана - PullRequest
0 голосов
/ 09 июня 2019

У меня есть служба, которая работает в отдельном процессе. Он используется для сбора и обработки информации о местоположении. Когда пользователь запрашивает местоположение, я запускаю его в режиме переднего плана.

Когда пользователь выходит из системы, я очищаю данные приложения, во время которых я останавливаю службу и отключаю службу от клиента 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.

...