多activity中退出整个程序,例如从A->B->C->D,这时我须要从D直接退出程序。android
网上资料:{
finish()和system(0)都只能退出单个activity。杀进程等的等方式都不行~~~
解决问题:
咱们知道Android的窗口类提供了历史栈,咱们能够经过stack的原理来巧妙的实现,这里咱们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的全部Activity。
在D中使用下面的代码:
Intent intent = new Intent();
intent.setClass(D.this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent);
finish();关掉本身
在A中加入代码:
Overrideide
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stubthis
super.onNewIntent(intent);spa
//退出.net
if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {xml
finish();进程
}ci
}get
A的Manifest.xml配置成android:launchMode="singleTop"it
原理总结:
通常A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程当中会把栈中B,C,都清理掉。由于A是android:launchMode="singleTop"
不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,而后把A finish()掉。
栈中A,B,C,D所有被清理。因此整个程序退出了。
诗帆我的补充:
1.能够把A设置成不可见的Acitivity(方法见下面),而后在它的onCreate方法里跳转到“真正”的载入界面
就能够实如今D中点退出程序按钮时看上去当即退出程序的效果
2.A必须是程序启动的第一个Activity才能起到这种当即退出的效果,由于Intent.FLAG_ACTIVITY_CLEAR_TOP只会把目标Activity的“上面”的Activity清理掉,而若是目标Activity的“下面”还有Activity(换句话说,目标Activity不在栈底),则finish后只会到他下面的那个Activity,而不是当即退出的效果了
3.不可见Activity
在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:
android:theme=”@android :style/Theme.NoDisplay”
这样一来,当这个Activity启动的时候,就不会显示出界面了。