Activity完全退出应用程序

android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C三个Activity,而想在B或C中Activity退出,调用上面的方法,往往会销毁当前的Activity返回上一个Activity。当然也可以逐个返回上一个Activity,直到跳转到入口的Activity,最后退出应用程序。但这样比较麻烦,而且逐个返回的体验并不友好。

我常用的一种方法是自己定义一个类似Activity栈的东西(我用的是LinkedList<Activity>),把每一个Activity执行oncreate()的时候都加入到这个list,当要完全退出的时候就遍历这个list,循环删除。

代码如下:

package com.tarena.exit.model;
import java.util.LinkedList;
import android.app.Activity;
import android.os.Bundle;

public class BaseActivity extends Activity {
	public static LinkedList<Activity> allActivitys = new LinkedList<Activity>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		allActivitys.add(this);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		allActivitys.remove(this);
	}
	public static void finishAll(){
		for (Activity activity : allActivitys) {
			activity.finish();
		}
		allActivitys.clear();
		 //这个主要是用来关闭进程的, 光把所有activity finish的话,进程是不会关闭的
		System.exit(0);  
//		android.os.Process.killProcess(android.os.Process.myPid()); 
	}
}

 以后每写一个Activity就让它extends BaseActivity 即可。如果需要完全退出,调用 BaseActivity.finishAll();即可。

这个写法有个局限。因为java中类是单继承。如果一个Activity需要extends TabActivity ,那它就不能继承BaseActivity了。

下面看另一种方法:原理和之上的方法差不多。

package com.tarena.exit.model;

import java.util.LinkedList;
import java.util.List;

import android.app.Activity;
import android.app.Application;

public class ExitApplication extends Application {
	private List<Activity> activityList = new LinkedList<Activity>();
	private static ExitApplication instance;

	private ExitApplication() {
		// 单例模式中获取唯一的ExitApplication实例
	}
	public static ExitApplication getInstance() {
		if (null == instance) {
			instance = new ExitApplication();
		}
		return instance;
	}

	// 添加Activity到容器中
	public void addActivity(Activity activity) {
		activityList.add(activity);
	}

	public void exit() {
		// 遍历所有Activity并finish()
		for (Activity activity : activityList) {
			activity.finish();
		}
		System.exit(0);
	}
}

 

参考原文:http://www.yoyong.com/archives/199

猜你喜欢

转载自lydia-fly.iteye.com/blog/2007067