Android 完全退出应用

在做项目的时候会碰到应用无法完全退出的问题,网上搜索了一下,比较流行的是将每个activity加到一个栈里面,退出的时候清空这个栈。下面给出一个完整的类,包含相应的方法,需要用的时候直接调用即可。

在每个activity内实例化一个对象,然后通过addActivity()方法 将每个activity压入到栈内。在需要退出的时候调用exit()方法

大家需要用的时候可以直接拷贝以下代码,修改一下类名即可

比如我要将activity入栈只需要MyApplication.getInstance().addActivity(activity)

 退出直接调用MyApplication.getInstance().exit()或其他方法

public class MyApplication extends Application {
	public List<Fragment> mGetGoldCoinsFragments;
	public long mLoginTime;
	private static MyApplication instance;
	private static final String tag = "myApplication";

	private static Context appContext;

	// 判断Home Activity是否为Stop状态
	private final List<Activity> activityList = new LinkedList<Activity>();

	private long mExitTime;

	public static MyApplication getInstance() {
		if (null == instance) {
			instance = new MyApplication();
		}
		return instance;

	}

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

	/**
	 * 遍历所有的Activity并finish
	 *
	 * @param isDirectExit
	 *            isDirectExit 是否直接退出
	 */
	public void exit(boolean isDirectExit) {
		if ((System.currentTimeMillis() - mExitTime) > 2000) {
			Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
			mExitTime = System.currentTimeMillis();

		} else {
			if (isDirectExit) {

				// 退出其它应用
				for (Activity activity : activityList) {
					Log.i(tag,
							"activity.getPackageName(): "
									+ activity.getPackageName());
					if (!(activity.isFinishing())) {
						activity.finish();
					}
				}
				activityList.clear();

				// 停止日志服务
				Log.d(tag, "stopping log srvice");

				// 判断sdk版本
				int sdkVersion = Integer.parseInt(VERSION.SDK);
				if (sdkVersion >= 8) {
					android.os.Process.killProcess(android.os.Process.myPid());
				} else {
					ActivityManager activityMgr = (ActivityManager) this
							.getSystemService(ACTIVITY_SERVICE);
					activityMgr.restartPackage(getPackageName());
				}
				// 跳转到桌面
				Intent intent = new Intent(Intent.ACTION_MAIN);
				intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intent.addCategory(Intent.CATEGORY_HOME);
				startActivity(intent);
				System.exit(0);

			} else {
				exit();
			}
		}
	}

	/**
	 * 遍历所有的Activity并finish
	 */
	public void exit() {
		if ((System.currentTimeMillis() - mExitTime) > 2000) {
			Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
			mExitTime = System.currentTimeMillis();

		} else {

			// 退出其它应用
			for (Activity activity : activityList) {
				Log.i(tag, "activity.getPackageName(): "
						+ activity.getClassLoader().getClass().getName());
				// if (!(activity.isFinishing())) {
				activity.finish();
				// }
			}
			activityList.clear();

			// 停止日志服务
			Log.d(tag, "stopping log srvice");

			// 判断sdk版本
			int sdkVersion = Integer.parseInt(VERSION.SDK);
			if (sdkVersion >= 8) {
				android.os.Process.killProcess(android.os.Process.myPid());
			} else {
				ActivityManager activityMgr = (ActivityManager) this
						.getSystemService(ACTIVITY_SERVICE);
				activityMgr.restartPackage(getPackageName());
			}

			// 跳转到桌面
			Intent intent = new Intent(Intent.ACTION_MAIN);
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			intent.addCategory(Intent.CATEGORY_HOME);
			startActivity(intent);

			System.exit(0);
		}
	}

	/**
	 * 返回桌面
	 */
	public void backToHome() {

		// 跳转到桌面
		Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		intent.addCategory(Intent.CATEGORY_HOME);
		startActivity(intent);
	}

	/**
	 * 从容器中删除Activity
	 *
	 * @param activity
	 */
	public void removeActivity(Activity activity) {
		activityList.remove(activity);
	}

	/**
	 * 清除所有Activity
	 */
	public void removeAllActivity() {
		// 退出其它应用
		for (Activity activity : activityList) {
			Log.i(tag, "activity.getPackageName(): "
					+ activity.getClassLoader().getClass().getName());
			// if (!(activity.isFinishing())) {
			activity.finish();
			// }
		}
		activityList.clear();
	}

	/**
	 * 判断容器中是否存在这个Activity
	 *
	 * @param activity
	 * @return
	 */
	public boolean isActivityContain(Activity activity) {
		return activityList.contains(activity);
	}

	@Override
	public void onCreate() {
		super.onCreate();
		appContext = getApplicationContext();
	}

}

Android 完全退出应用

时间: 2024-10-29 02:44:01

Android 完全退出应用的相关文章

一、 Android完全退出应用程序

在Android中,如果想退出Android程序,一般都是调用finish().System.exit(0).android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,这是因为调用finish().System.exit(0).android.os.Process.killProcess(android.os.Process.myPid())只能杀死当前的act

android 完全退出实现

实现方法是在application中定义一个集合存储所有的Activity对象,在Activity创建时添加进集合中,在程序退出时,finish掉所有的Activity即可. 步骤如下: 1.自定义Application,MyApplication.java代码如下: 1 public class MyApplication extends Application{ 2 private static ArrayList<Activity> activityList; 3 private sta

Android中退出多个Activity的两个经典方法

这里介绍两种方法:一种把每个activity记住,然后逐一干掉:另一种思路是使用广播. 方法一.用list保存activity实例,然后逐一干掉 上代码: import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.Dial

android 安全退出应用程序的几种方法

android 安全退出应用程序的几种方法 正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程.android.os.Process.killProcess(android.os.Process.myPid())通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空 第二种方法:终止当前正在运行的Java虚拟机,导致程序终止System.exit(0)

Android程序退出方法

app退出方法记录: 1.exit System.exit(0); 如果参数为0,表示正常退出:不为0,则表示异常结束程序. 如果首个activity中使用,关闭app程序:否则是返回首个activity效果. 该方法只关闭activity,不会关闭服务. 2.Pid int pid = android.os.Process.myPid(); //获取当前应用程序的PID android.os.Process.killProcess(pid); //杀死当前进程 这种方法退出应用,是会保留某些后

Android 怎么退出整个应用程序?

我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者直接按home键直接返回,其实这两种操作都没有关闭当前应用程序,没有释放系统资源.有时跳转的activity较多时,还需要多次按返回键,这样感觉一点都不爽. 后面添加了一个菜单返回功能键,这个方法也只能用system.exit(0)来关闭当前活动的Activity,附代码:public boolean onCreateOptionsMenu(Menu menu){ su

android style 退出动画 解决退出动画无效问题

在AndroidMenifest.xml文件里面的Activity声明中,增加自己的Theme声明,如下: <activity android:name=".MyOrderListServiceActivity" android:theme="@style/MyTheme" > 在values的style.xml文件里 声明 一个style,起名为MyTheme,注意这里面有我自定义的东西,涉及到动画的声明,就只有 <item name="

【转】android 完全退出应用程序

原文网址:http://www.yoyong.com/archives/199 android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效.如果有A,B,C三个Activity,而想在B或C中Activity退出,调用上面的方法,往往会销毁当前的Activity返回上一个Activity.当然也可以逐个返

android 完美退出应用程序。

http://www.2cto.com/kf/201402/276808.html Android 程序在点击回退键时,如果只有一个activity,调用finish()方法就能退出界面,如果有多个界面,在调用该方法时,只会销毁当前的activity,显示栈顶的其它activity,换言之,就是无法退出整个应用程序.下面是一种快速的退出整个应用的方法代码: private void showTips() { AlertDialog alertDialog = new AlertDialog.Bu