//通过context获取系统服务,得到ActivityManager
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
//获取当前运行中的TaskInfo
//获取的是一个List集合,也就是说当前系统中的task有多个
//关于该方法的参数,我从源码看了下,是指返回集合的最大可能条目数,实际返回数可能
//小于这个数目,取决于用户启动了几个task
List<ActivityManager.RunningTaskInfo> tasks = manager.getRunningTasks(1);
ComponetName baseActivity = tasks.get(0).baskActivity;
Intent intent = new Intent();
intent.setComponent(baseActivity);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("exit", "1");
content.startActivity(intent);
在应用程序的每个Activity中的onNewIntent()函数中接收intent参数并判断退出
String exit = intent.getStringExtra("exit");
if(exit != null && exit.equals("1")){
finish();
}
这里主要利用Task找到处于栈底的Activity。再利用Intent.FLAG_ACTIVITY_CLEAR_TOP标志清空task栈中除栈底以外的activity.
注意加上权限:<uses-permission android:name=”android.permission.GET_TASKS”/>
如果应用程序中包含多个Task就去遍历依次退出吧。
还有个思路:利用startActivityForResult依次调用task栈中的baseActivity或topActivity。每次创建后结束掉它
资料:
startActivityForResult与startActivity的不同之处在于:
1, startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2, startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,页面会跳转到下一个Activity,
而当这个Activity被关闭以后(this.finish()),程序会自动跳转会第一个Activity,并调用前一个Activity的onActivityResult( )方法。
android中使用startActivityForResult回传数据(转):
http://www.cnblogs.com/leon19870907/articles/2010701.html
//task栈底的Activity
ComponentName baseActivity = task.baseActivity;
//task栈顶的Activity
ComponentName topActivity = task.topActivity;
注意:
多语言切换等情况时,当我们去调用处于栈底的等不可见的Activity时,系统会调用onCreate(),再调用onNewIntent()
利用广播的方法退出:当程序crash后,一些Activity会接收不到广播而无法退出