Почему onServiceDisconnected не вызывается при сбоях приложения?

У меня обычный Андроид ServiceConnection:

Я переопределяю метод onServiceDisconnected() следующим образом:

private ServiceConnection myConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        System.out.println("MyTag why are you not getting called");
    }
};

и служба привязана и запускается нормально. я намеренно вылетаю из приложения через некоторое время после подключения службы; однако onServiceDisconnected никогда не вызывается - почему? согласно документации, это должно вызываться всякий раз, когда приложение вылетает ...

то, что я пытаюсь достичь, это следующее:

предположим, что пользователь просто убивает процесс / или случайно попадает в аварию, я хочу, чтобы произошли определенные вещи (например, ... отмена уведомления ... что я сейчас делаю в onStop () активности). но откуда мне отменить уведомление? ну и отключить службу, если приложение вылетело?


person David T.    schedule 16.04.2014    source источник
comment
Думаю, это то, что вы ищете.   -  person Dariush Malek    schedule 17.04.2014


Ответы (1)


Я никогда не видел, чтобы onServiceDisconnected(...) вызывалась при сбое приложения или даже когда действие отвязывается от службы. Я думаю, что он вызывается только в том случае, если служба умирает, хотя связанное действие не выполняется, возможно, потому, что ОС решила убить ее, чтобы сохранить память. Я не знаю, как это сделать намеренно. Вы можете попробовать добавить преднамеренный сбой к своей службе и посмотреть, что произойдет, но я думаю, что это приведет к сбою всего вашего приложения, если служба не работает в собственном процессе.

У меня была аналогичная потребность убедиться, что некоторые вещи произойдут, если приложение выйдет из строя или будет убито, потому что Bluetooth на многих устройствах очень нестабилен, и если гнездо Bluetooth открыто при сбое приложения, адаптер можно оставить в таком состоянии, в котором он невозможно снова подключиться к тому же устройству / uuid, пока телефон или планшет не будет перезагружен. Я обнаружил, что onDestroy() службы также не вызывается при сбое приложения, если только служба не запущена в собственном процессе. Если вы решите пойти по этому пути, остерегайтесь того факта, что служба унаследует свою собственную копию вашего класса Application, поэтому, если вы расширили ее для хранения глобальных данных, служба будет иметь все свои копии.

person Kevin Krumwiede    schedule 16.04.2014
comment
да ... видите, проблема в том, что во всех вызовах onStop () то, что я хочу, не происходит, когда приложение вылетает - person David T.; 17.04.2014