【移动应用开发技术】浅谈Android应用的退出_第1页
【移动应用开发技术】浅谈Android应用的退出_第2页
【移动应用开发技术】浅谈Android应用的退出_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】浅谈Android应用的退出

最近在做公司的Android项目,在和用户交流需求时,对方提出:菜单中务必有“退出程序”一项。理由很简单,我要用别的程序,你老占着我内存干嘛。说实话,我是不想做这个的。但这肯定跟客户解释不通,只好硬着头皮做。既然做了,当然不能给个空方法了事。下面先给出解决方案,最后讨论下为什么不愿意退出,仅作个人观点,欢迎各位指点。思路关于Android的退出,网络上的方法很多,总结起来大概有以下几种:使用java.lang.System类的exit(intcode)方法;更暴力的,使用android.os.Process.killProcess(myPid());使用系统服务ActivityManager,killBackgroudProcesses();习惯异常编程的可能会喜欢制造FATALERROR,利用Android强制退出;一些更为熟悉反射机制的,强制调用forceStopPackage()方法;自行维护一个Activity集合,在退出的时候逐一finish掉它们。这些方法各有利弊,简单分析如下:直接的System.exit()方法:这会清理当前进程占用的所有资源,结束运行的线程并杀死当前进程,但在应用占用资源比较多的时候会出现短暂黑屏现象,影响用户体验。注意,如果我们的Service指定了android:process,即运行在其他线程,使用System.exit()是不会干掉这些新进程的。killProcess()/killBackgroundProcess()方法,很明显地,强行中止进程而不允许其保存必要的状态信息,这是不符合Android设计的,并且即使在传统桌面应用,也不推荐吧?使用反射机制的淫才,我就不想吐槽了,分明Google做API的时候已经隐藏掉了,你非要挖出来调用,为什么呐?显示自己看过源码?自行维护一个Activity集合的方法看似比较温和和可信,但是弊端也很明显:a.每次启动一个Activity必须调用一次工具类,否则将导致程序留下一些让用户莫名其妙的Activity;b.这种方法只维护了Activity,但如果程序启动了长时间执行的后台线程,这些线程将一直运行,成为名副其实的精灵线程;c.与System.exit()一样的,对于远程进程没有处理。解决方案综合以上各类方法的优缺点,我最后决定采用自行维护一个Activity集合的方式。packagemon.os;

importjava.util.ArrayList;

importandroid.app.Activity;

/**

*@authorFlyingcat

*@create2014-3-11

*@version1.0

*/

publicclassExitAppManager{

privatestaticArrayList<Activity>activities;//①

privatestaticfinalvoidcheck(){//②

if(activities==null){

activities=newArrayList<Activity>();

}

}

publicstaticfinalvoidrecord(Activityact){//③

check();

activities.add(act);

}

publicstaticfinalvoidexit(){

for(inti=0;i<activities.size();i++){//④

activities.get(i).finish();

}

activities=null;

System.exit(0);//⑤

}

}几点注释:很多类似的实现使用了单例模式,但我比较懒,不愿意增加一个额外的单例变量,使用static来替代了。①这里声明保存Activity的ArrayList集合,之所以使用List而不是Stack,是因为按照FIFO原则清理Activity时会最后清理当前Activity,不至于让用户看到频繁的Activity退出动画。②这里使用了一个额外的方法进行检查,这是和最后的null处理方法对应的。在某些情形下,如果用户频繁开关应用,可能造成类还没有被卸载就再次运行,静态的List未被重新初始化。总之,这样是为了增加健壮性。③这个方法用于记录Activity,很显然,每个Activity启动时都应该调用这个方法。④逐个销毁Activity,这个没什么好解释的。⑤这里还是使用了System.exit(0)。因为实际上前面已经解释过了,exit(0)的方法其实清理得还是比较干净的,加上这一句可以避免因为疏忽忘记添加Activity导致的bug。而且比较占用资源的Activity已经被清理完毕,这里主要是清理线程和服务的工作。执行这行代码后,程序就关闭了。但是,如果有远程进程还需要关闭,就需要增加额外的代码了,这里不再赘述。个人看法:为什么不用退出?首先,这些内存并没有被浪费。Android使用Linux内核,采用了类似于Linux的内存管理机制,将当前空闲的物理内存用于存储可能再次使用的进程。Android在官方文档中已经给出了说明:这样的设计是为了下次打开这个程序时启动速度更快。作为一个程序员,应该理解和支持Android这一优秀的特性,而不是违背这个思想去设计程序。其次,驻留在内存的后台程序并不总会增加耗电量。不活动的后台进程只是在内存中保留了一些信息,但并不进行任何计算(被“暂停”掉了),不占用CPU,也就可以视为不耗电。既然这样,我们也没有必要继续杀死程序来省电。但是,有一些应用后台操作确实是要耗电的,这是因为它们启动了Service或后台线程,执行了额外的计算操作。再次,系统已有应对内存紧缺的解

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论