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中查看线程情况。
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中查看线程情况。
相关文章推荐
- android messager跨应用进程之pacelable遇到问题解决方案汇总
- 彻底解决Android 应用方法数不能超过65K的问题
- Android应用稳定性优化--快速点击产生异常的解决思路
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- 基于xposed实现android注册系统服务,解决跨进程共享数据问题
- 记录关于android广播(无序)接收不到的问题解决思路
- Android开发更改应用图标无效的问题 最终解决办法
- Error: Not found; no service started.问题解决 | android studio调试能安装应用成功但无法启动
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- EventBus 和RxLifecycle 一起使用所引发的问题及解决办法 -java.lang.NoClassDefFoundError: android/os/PersistableBundle
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- Android如何解决多次fork进程的问题
- android proguard使用心得和遇到的若干问题以及解决思路
- 关于网上解决Android4.x系统设置字体大小导致应用布局混乱引起的问题
- Android 解决不同进程发送KeyEvent 的问题
- Android 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚
- 解决crond引发大量sendmail、postdrop进程问题
- Android 解决不同进程发送KeyEvent 的问题