2012-03-29 67 views
3

我有一个服务,它也是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); 
     .... 
    } 

感谢

+0

每次运行doInBackground时,进程都会死亡? – Orest 2012-03-29 14:15:49

+0

不,有时只有。 – 2012-03-30 15:03:25

回答

1

我觉得你混合两件事情。 Android不允许阻塞UI线程,如果有的话,它会杀死你的应用程序。除非你将阻塞处理和循环放入AsyncTask的后台进程中。

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

+0

有没有办法找出服务被杀的原因? – 2012-03-30 12:16:28

+0

@IakovDavydov也许如果你得到一个设备日志 – Adrian 2012-03-30 12:55:51

+0

小碎片在问题中提出。但是在那个时候我没有看到与我的服务有关的任何事情。 – 2012-03-30 15:04:22

相关问题