最近做一个即时通讯项目,在做退出功能的时候,才发现自己不知不觉纠结了半天时间,查找各种资料,使出各种招,没有使程序完全退出,要么Service还在后台跑着,要么只是退出当前Activity,也是醉了.
如果想退出Android程序,找到了一些方法:
- Dalvik VM的本地方法:
android.os.Process.killProcess(android.os.Process.myPid()) //获取PID
System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出 - 任务管理器方法:
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
或者killBackgroudProcesses(getPackageName())
系统会将,该包下的 ,所有进程,服务,全部杀掉,就可以杀干净了,要注意加上 权限。 - 根据Activity堆栈原理,自动清除Activity堆栈再退出;
Intent intent = new Intent();
intent.setClass(Android123.this, CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //或者其他Flag
startActivity(intent);
以上方法都几乎对完全退出没什么效果~
收集了一下真正可以实现完全退出的方法:
- 通过Application保存所有运行着的Activity
public class ExitManager extends Application{
private List<Activity> activityList=new LinkedList<Activity>();
private static ExitManager instance;
private ExitManager(){
}
public static ExitManager getInstance(){
if (instance==null) {
instance=new ExitManager();
}
return instance;
}
public void addActivity(Activity activity){
activityList.add(activity);
}
public void exit(){
for(Activity activity:activityList){
if(!activity.isFinishing()){
activity.finish();
}
}
int id=android.os.Process.myPid();
if(id!=0){
android.os.Process
.killProcess(id);
}
}
}
其次要在每个Activity的onCreate方法中加入如下代码:
ExitManager.getInstance().addActivity(this);
也就是将每个Activity加入到Activity容器中。最后,在实现退出应用程序的地方加入如下代码:
ExitManager.getInstance().exit();
- 给所有Activity和Service组件发一个消息,组件收到消息后结束自己。
给所有Activity和Service组件发一个消息方式有很多,就不罗嗦了,
现成的例子:使用观察者模式完美实现android程序退出
在经过一番摸索后,发现我的程序中要想做退出太简单了:因为我的退出按钮位于设置页面SetUpActivity,设置页面的只有一个父层页面MainActivity,我直接在点击事件中给后台Service法以个广播,Service收到后StopSelf(),接着设置回调结果,finis掉SetActivity自己。MainActivity收到回调结果后finis掉自己。自此程序结束。
以上两种方式,虽然理解起来很好,而且很有效。但是总觉得很挫。我估计谷歌在设计Android的时候压根就不想为app做退出方面的考虑,在他们看来,退出功能是没有必要的~。个人觉得Android没有退出功能也不是什么严重的问题.不过人们还是倾向于适应一个有”退出“功能的APP.
最后, 我们知道Android的activity是堆栈式的,一层一层的堆叠。在设计的时候,退出功能最好放置在浅层,所有的Activity和service的存活状态都了如指掌,都在点击退出的时候,我们只需要通知关闭父层级少数个Activity和后台Service就可以做到所谓的“完全退出”。