为什么onServiceDisconnected在应用程序崩溃时没有被调用?

时间:2014-04-16 23:07:51

标签: android service crash unhandled-exception serviceconnection

我有常规Android 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()中所做的事情) 。但我应该从哪里取消通知?如果应用程序崩溃,还要断开服务?

1 个答案:

答案 0 :(得分:2)

当应用程序崩溃时,或者即使活动从服务中解除绑定,我也从未见过onServiceDisconnected(...)。我认为只有在服务因绑定活动没有动作而死亡的情况下才会被调用,可能是因为操作系统决定将其杀死以节省内存。我不知道如何故意导致这种情况发生。你可以尝试为你的服务添加一个故意的崩溃,看看会发生什么,但我认为只要整个应用程序崩溃,除非服务在自己的进程中运行。

我有类似的需要确保在应用程序崩溃或被杀死时发生一些事情,因为许多设备上的蓝牙非常不稳定,如果应用程序崩溃时蓝牙套接字打开,则适配器可以留在状态,在重新启动手机或平板电脑之前,它无法再连接到同一设备/ uuid。我发现,当应用程序崩溃时,也不会调用服务onDestroy(),除非服务在其自己的进程中运行。如果您决定采用该路由,请注意该服务将继承其自己的Application类副本,因此如果您已将其扩展为保存全局数据,则该服务将拥有自己的所有副本。