【Android源码 栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。
网学会员整理了Android源码 -你真的有必要退出吗——再说Android程序的退出功能 - 技术总结的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
搞
Android开发有一段时间了相信很多从Windows开发过来的
Android程序员都习惯性地会跟我一样遇到过同一个问题如何彻底退出程序这里说下我自己的经验并不权威仅供参考。
一开始我也上网到处找退出的资料网上这方面的文章也是很多总结下来退出
Android程序的方法大概有以下几种 1.直接调System.exit0或直接用
android.os.Process.killProcess 2.调用ActivityManager.restartPackage或killBackgroudProcesses 3.搞个Activity堆栈列表把所有Activity通过继承基类或调用函数的方式记录下来退出时逐一finish 4.故意制造致命错误然后利用错误强制退出 5.搞一个singleTop的根Activity通过它自动清除Activity堆栈再退出 6.调用隐藏的ActivityManager.forceStopPackage方法 不过这些方法经过试验基本上都不完美要不就是退不干净要不就是只支持2.2以下旧版要不就是要求ROOT权限。
其中System.exit0和
android.os.Process.killProcess能结束当前Activity有时候能结束当前Activity和上一个Activity但再多的话基本上就不行了。
相对比较完美的就是自己做Activity堆栈列表来释放了有一段时间我也采用了这一方法觉得不错问题好像是解决了不过解决得相当难受自己做Activity堆栈意味着每个Activity都要继承同一个父类。
我一边调试程序一边咒骂谷歌你乍就不能提供个好用的退出接口 好景不长没多久我发现程序只把Activity结束了但程序并没有退出后台还有几个线程在跑退出后过了好久还会提示出错真是气死人不偿命。
我想要求程序退出前等待线程一下吧结果发现那几个线程并非是我自己创建的而是用了第三方的一个地图组件在后台下载数据。
最后我出了个毛招把Thread.UncaughtExceptionHandler接管把错误截了不显示。
原来我们只是把Activity界面结束了但界面结束后只要有线程在跑程序其实仍在运行可谓马照跑舞照跳。
Activity关闭后只是界面消失了其它该有的东西完全是照常进行如果线程中有网络请求则还是照样占用CPU和带宽。
继续研究发现一个有趣的现象程序退出后再次启动程序发现用public static声明的全局变量居然没变。
什么意思呢举个例子如果你的MainActivity中有一个全局静态变量public static int c默认值为0程序第一次启动你在onCreate里设置它加1即执行c1或c然后你关闭程序马上再次启动程序这时c的值仍为1并没有清为0执行c1之后它会变成2然后你不停地打开关闭程序就会发现c值在不停地增加。
接着很自然就会再研究
Android的Application因为据说Application在程序中是比较唯一的适合放置全局变量。
我在程序中创建并使用了自己的Application类然后同样在里面放全局静态变量进行赋值测试结果照旧——程序关闭再启动时系统并未清除全局变量。
于是我在Application的onCreate中写启动日志它还有个onTerminate事件不过实践并看完帮助后才知道那个是假的结果发现onCreate其实只在第一次启动时调用第二次启动时并没有重新创建Application。
意思是什么呢悲哀呀我们的程序根本就没退出。
原来我们Activity关闭后程序并没有结束我们的结束程序其实只是演给自己看本质上程序压根就没退出程序就一直在后台除非你用具有ROOT权限的任务管理器结束否则它永远不会主动退出。
当然了我以上试验都是在内存充足的情况下进行。
程序虽然不会主动退出但内存清理时系统还是会被退出的。
由于谷歌没提供退出的功能因此很明显谷歌就是要我们知道你不必主动退出程序我会在需要时帮你退出。
对于习惯退出的PC程序员来说这真是没天理啊凭啥我退出了你还要占着宝贵的内存甚至说不定还占着其它资源。
我一开始也很不理解不过后来一想其实内存占着也无所谓只要不占CPU内存平时空着也是浪费的反正也不耗电当下一次加载时还能提速而内存不足时也能自动清理问题不大吧。
不能全退就不全退呗死不了。
后来又发生了一件事让我对
Android的Activity和内存机制又有不同的看法了。
我同事有一台电信送的手机配置很差只有几百M内存在上面跑我的程序发现一个怪异的现象我在程序里逐次打开了三个包含编辑框的ActivityA、B和C并且这三个Activity里都输入了不同的内容当前显示的是C然后我按HOME键打个电话再用任务管理器切换回程序这时程序显示的确实是原来的Activity C但上面编辑框的内容却消失了再返回到B、A发现B、A的编辑内容也消失了也就是说A、B、C的界面堆栈顺序还在但界面的状态却丢失了。
世上哪有这么神奇的事仔细一调试就知道了原来在按HOME键打完电话回到程序时程序的Activity的onCreate被再次调用程序等于是重新创建了Activity C。
继续研究发现原来不仅仅是Activity C其它两个Activity A和B也是重新创建了。
继续再研究发现其实连Application都重新创建了所有全局变量已经清空。
这正是我原来想要的退出效果在我不需要的时候它出来了够讽剌的。
至此真相大白原来在按HOME键打电话时由于内存不足系统自动把我的程序结束了结束前它会记录Activity堆栈会调用Activity的onSaveInstanceState和Application的onLowMemory让程序有机会保存数据当再次回到程序时系统会自动重新创建Application然后按堆栈顺序先恢复Activity C但这时A和B可能还没恢复这就是说我们平时以为Activity A和B在C后面的假设真的很假其实并不存在存在的只是一个堆栈信息除了顶级Activity所有界面和全局变量都已经清空。
了解了这些之后我发现之前做的退出什么的都是浮云了相反我们搞退出不但没好处还会造成不应有的混乱。
这种情况下我们自己搞堆栈做程序退出真是没有任何意义。
最后我只好投降了我的程序只搞假退出再也不管真正退出了。
我在ROOT Activity退出时会做个标记下次进来时会自动重新清理和设置一些全局变量这就算重启程序了。
想真的退出程序等谷歌的新API看有没退出接口再说吧目前来说我觉得真的没必要。
顺便说一下程序崩溃有一段时间我想利用崩溃机制退出程序最后发现崩溃机制跟System.exit0和
android.os.Process.killProcess一样只能结束当前Activity同时可能会引起当前或上一个Activity的重新创建触发onCreate事件但不能清掉整个程序也只好放弃。
上一篇:
android系统培训资料1025
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计