一次性关闭所有的activity

本文总结了在Android中关闭所有Activity的多种方法,包括System.exit(0)、restartPackage、killBackgroundProcesses等,同时介绍了通过ActivityInstance单例、发送广播、递归退出等策略,以及利用Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK关闭栈内所有Activity的技巧。这些方法在不同场景下有不同的效果和适用性。
摘要由CSDN通过智能技术生成

看到很多关于应用退出的问题,今天在这里为大家简单总结一下,如果说的不对还望大家见谅。

方法一:System.exit(0) 和Android.os.Process.killProcess(android.os.Process.myPid()),我想很多人都尝试过,当关 闭多个Activity的时候这两个方法根本不起作用,原因当然和Activity的堆栈管理有关。

方法二:restartPackage,这种方法会终止一切和这个程序包关联的,所有共享同一uid的process被kill,所有   的activity会被removed所有创建的服务会停止,还会发一个广播 Intent.ACTION_PACKAGE_RESTARTED 。众所周知这个方法已经过时,2.2就不起作用了

   ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);   manager.restartPackage(getPackageName());

<uses-permissionandroid:name=”android.permission.RESTART_PACKAGES”/>

方法三:这个方法是2.2以后取代restartPackage的方法。但是google给的只是一个空壳,这个方法依然不起作用。

activityManager.killBackgroundProcesses(packageName);

<uses-permission android:name=”android.permission.KILL_BACKGROUND_PROCESSES”/>

方法四:创建一个ActivityInstance单例模式来统一管理Activity的退出。这是一个很鸡肋的方法,因为它确实有用,但又这么写又有点浪费。

具体做法就是写一个ActivityInstance单例,在每一个activity启动的时候都调用它的ActivityInstance.addActivity(this);方法,当退出应用时,调用ActivityInstance.exit();方法。

public void exit(){                               

for(Activity at:activityList){                 

at.finish();      

}   

System.exit(0);

}

方法五:发送广播退出。在需要结束应用时,发送一个特定的广播,每个Activity收到广播后关闭。如果不闲麻烦可以这样做,个人来讲还没有方法四好。
方法六:递归退出,在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
方法七:退出的时候跳转回HOME,一种假的退出方法,但可以退出,该方法只是回到HOME页而将本身应用虚假退出。

  1.     Intent startMain = new Intent(Intent.ACTION_MAIN);
                     startMain.addCategory(Intent.CATEGORY_HOME);
                     startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                     startActivity(startMain);
                     System.exit(0);

方法八: activityManager.forceStopPackage(PackageName);看到forceStop是不是感觉还挺熟悉的,我们系统设置里面关闭应用就是调用的这个方法。这个方法可以完全关闭应用程序而且只要一个包名。
不过这个方法是系统隐藏的,我们写应用的时候在ActivityManager里是找不到这个方法的。这就涉及到了调用系统隐藏API的方法。下面是通过反射机制来获取该方法。

ActivityManager sd = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
Method method= Class.forName("android.app.ActivityManager")
	.getMethod("forceStopPackage", String.class);
	method.invoke(sd,packName)
 

补充:其实Android有自己的内存管理机制并不需要我们完全退出本身应用,当用户按退出键的时候用户回到HOME或其他相关界面即可。在没有特殊要求的时候虚假退出就可以。(此方法需要手机root,并不实用)

方法九:可以利用清理历史栈的方法,来巧妙关闭所有activity,首先用一个设置为不可见的activity A来启动程序,这个activity A的作用只是用来垫栈底,只有启动和退出程序才会用到这个activity,而你需要退出的时候,只需要跳转至这个activity A ,并让A finish自己就可以实现关闭所有的activity。

Intent intent = new Intent();
intent.setClass(B.this, A.class); //B为你按退出按钮所在的activity
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TASK); //最关键是这句
startActivity(intent);



Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK使得处于栈底的A发挥推土机的作用,从最底层把栈里所有的activity都清理掉,再在自己的oncreate方法加一句finish结束自己,即可实现退出。不放心的话,可以在A的ondestroy方法中加上system.exit(0) ,连跳转过程中的线程也可以终止的。
至于如何初始化这个activity A ,决定程序是启动还是退出,随便弄一个static类型布尔变量控制一下就可以了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值