进程已经死亡/计划重新启动崩溃的服务

时间:2012-03-29 13:26:43

标签: android service crash

我有一个也是LocationListener的服务。在新的位置事件时,它会执行一些需要时间的网络资源;这就是为什么它被实现为AsyncTask。

我经常在登录真实设备时看到:

03-29 17:02:20.847 D/dalvikvm(  235): GC_FOR_ALLOC freed 961K, 29% free 10234K/14215K, paused 26ms
03-29 17:02:20.855 I/DemoService(  555): DiyScheduer.onStart
03-29 17:02:20.855 I/ggheart (  555): onStart
03-29 17:02:21.097 V/PhoneStatusBar(  235): setLightsOn(true)
03-29 17:02:21.121 W/IInputConnectionWrapper(11244): showStatusIcon on inactive InputConnection
03-29 17:02:21.277 I/ActivityManager(  161): Process android.process.media (pid 11298) has died.
03-29 17:02:22.058 I/ActivityManager(  161): Process com.idavydov.myapp (pid 11051) has died.
03-29 17:02:22.066 I/WindowManager(  161): WIN DEATH: Window{41b05850 com.idavydov.myapp/com.idavydov.myapp.MyActivity paused=false}
03-29 17:02:22.074 W/ActivityManager(  161): Scheduling restart of crashed service com.idavydov.myapp/.MyService in 5000ms

通常在加载一些大型应用程序后会发生。

这种记忆力低的原因是什么?在那种情况下,为什么日志中没有这种消息?

P.S。在另一个问题中,我看到解释的原因是任务需要花费太多时间。但我已将下面的代码添加到我的AsyncTask中,无法在模拟器中重现崩溃。

    protected Boolean doInBackground(...) {
        ...
        long time = System.currentTimeMillis();
        while (System.currentTimeMillis() - time < 11 * 1000);
        ....
    }

由于

1 个答案:

答案 0 :(得分:1)

我认为你混合了两件事。 Android不允许阻止UI线程,如果是这样,它会杀死你的应用程序。除非你把阻塞处理和循环放到AsyncTask的后台进程中。

除此之外,当内存不足或者识别出你的应用对用户没有影响时,android会在没有任何警告的情况下终止你的应用。 如果您希望自己的应用停留更长时间,则需要一个粘性服务和良好的应用生命周期管理。