您的位置:首页 > 移动开发 > Android开发

Android 应用进程生命周期及static的生命周期引发的问题及解决思路

2015-05-19 15:25 218 查看
这两天正在做一个既有Service又有前台进程APP的程序,遇到如下奇怪问题:

1. 时常出现DeadObjectException异常。

2. 前台进程在通过Service完成耗时任务后,进行UI更新,比如设置button的背景色,Clickable状态等。但这个时候,偶尔可以更新成功,偶尔不成功。

对于问题1,网上的信息都提到是因为Service挂掉了,所以前台APP持有的是已经die的binder代理。但是,我通过ADT的Device view中,看到Service进程一直存在。

对于问题2,搜遍整个网络,都没有人遇到过类似问题。

在百思不得其解的情况下,突然发现了一个规律:

    每次用手机缩小界面的情况下,删除前台APP之后,再重启APP,上述两个问题都未出现。但通过Back键退出前台APP的时候,就会必现上述问题。

通过ADT的Device view发现,通过缩略界面删除APP时,进程将被杀掉。通过BACK键时,进程不会杀掉。

通过上述分析,初步得出结论,可能和资源释放有关系。因为通过ADT 的Device View可以看到很多线程还在继续运行。

大家都知道,Android APP的所有资源都是放在进程中的,APP退出时,有哪些资源不会释放呢?我猜测,所有Class等全局资源不会释放,这样下次重启APP时,速度会很快。

通过验证,发现所有static资源也不会释放。我的问题就出在这里,每次用户按BACK键后,没有释放静态资源,特别是和Sevice绑定相关的资源。这些资源应该在每次和Service建立连接的时候,重新初始化。

通过资源释放后,上述两个问题都没有出现了。

上述问题,实际关联到以下几个知识点:

1. 用户按BACK键,前台APP的进程不会退出,相关的全局资源不会释放,用户需要自己释放。

2. 由于进程没有退出,所有static等放在全局数据区的内容也不会释放。在用户打开app的时候,需要考虑是否需要重新初始化,在BACK的时候,是否需要Clean.

3. 在手机缩略界面删除APP, 是会把整个APP给杀死,不会调用onDestroy方法。这个问题倒不是很大。大不了重新来过。

4. ADT工具的使用。如附件。在运行的情况下,可以再ADT Device View中attach进程。通过点击Update Threads,然后就可以再Thread View中查看线程情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐