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

在开发Android服务和前台进程应用时遇到DeadObjectException异常及UI更新问题。问题出现在Service与前台进程交互时,有时UI无法更新。研究发现,问题与进程生命周期和static变量有关。当通过BACK键退出应用时,进程并未被杀死,static资源未得到释放。解决方案是确保在与Service建立连接时重新初始化static资源。此外,了解Android中BACK键不会导致进程退出,而缩小界面删除APP则会彻底杀死进程。使用ADT Device View有助于监控进程和线程状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天正在做一个既有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中查看线程情况。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值