退出形式:
1) 菜单->退出
2) 按back键,提示再按一次退出
3) 按back,弹出退出提示对话框
4) 按back直接退出
Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(),接下来显示的是A。在B中如何关闭整个Android应用程序呢?
1. Dalvik VM的本地方法
android.os.Process.killProcess(android.os.Process.myPid()) //获取PID
System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出
注意:只能销毁当前Activity,并不能实现效果
2. 任务管理器方法
首先要说明该方法运行在Android 1.5 APILevel为3以上才可以,同时需要权限
ActivityManageram = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
系统会将该包下的所有进程服务全部杀掉,就可以杀干净了,要注意加上
<uses-permissionandroid:name="android.permission.RESTART_PACKAGES"/>
3. 根据Activity的生命周期
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标 志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。
在A窗口中使用下面的代码调用B窗口
Intent intent = newIntent();
intent.setClass(Android123.this,CWJ.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
startActivity(intent);
接下来在B窗口中需要退出时直接使用finish方法即可全部退出。
4.使用单例模式的Activity栈管理所有Activity
自定义一个Actiivty栈,道理同上,不过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:
publicclass ScreenManager {
private static Stack<Activity> activityStack;
private static ScreenManager instance;
//私有化构造方法
private ScreenManager(){ }
//获取单例
public static ScreenManager getScreenManager(){
if(instance==null){
instance=new ScreenManager();
}
return instance;
}
//退出栈顶Activity
public void popActivity(Activity activity){
if(activity!=null){
activity.finish();
activityStack.remove(activity);
activity=null;
}
}
//获得当前栈顶Activity
public Activity currentActivity(){
Activity activity=activityStack.lastElement();
return activity;
}
//将当前Activity推入栈中
public void pushActivity(Activity activity){
if(activityStack==null){
activityStack=new Stack<Activity>();
}
activityStack.add(activity);
}
//退出栈中所有Activity
public void popAllActivityExceptOne(Class cls){
while(true){
Activity activity=currentActivity();
if(activity==null){
break;
}
if(activity.getClass().equals(cls) ){
break;
}
popActivity(activity);
}
}
}
5、使用singleTask加载模式
以下是第一种方法,通过在清单中配置activity的加载模式singleTask
使用singletask 栈中单实例 例子:a启动b,b启动c,在c的menu菜单中点击退出项,关闭所有activity。
在a的清单配置中添加加载模式为singletask,c的menu菜单的点击事件是启动a。在a中重写方法onNewIntent(),里面关闭a页面,并且结束进程。
1.@Override
2.protected voidonNewIntent(Intent intent)
3.{//加载了singletask后,返回来的时候直接进入onNewIntent()方法,不会再进入onCreate();
4.super.onNewIntent(intent);
5.finish();
6.Process.killProcess(Process.myPid());//所有activity关闭后,结束进程
7.}
6、与第4种方式类似,定义一个基类管理Activity
在application里面创建一个全局容器arraylist<activity>,写两个方法,在容器里加addActivity()和finishActivity();
publicclass Myapplication extends Application {
publicstatic ArrayList<Activity> activities = new ArrayList<Activity>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
publicstatic void finishActivity() {
for(int i = 0; i < activities.size(); i++) {
activities.get(i).finish();
}
Process.killProcess(Process.myPid()); //所有activity关闭后,结束进程
}
}
创建一个基类BaseActivity,写方法getApplication(),(作用是减少代码重复)让每一个activity都继承它。
publicclass BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_base);
//该Myapplication要在清单文件中指定
Myapplicationapp = (Myapplication) getApplication();
app.addActivity(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.base,menu);
returntrue;
}
}
退出形式的代码如下:
//第一种形式:点击菜单退出项,关闭所有activity,结束进程
@Override
publicboolean onOptionsItemSelected(MenuItem item) {
Myapplicationapp = (Myapplication) getApplication();
app.finishActivity();
returnsuper.onOptionsItemSelected(item);
}
//第二种形式:两次点击返回键,第一次弹出toast,提示再按一次退出。间隔超过5秒,就失效
int pressbacktimes = 0;
@Override
public void onBackPressed() {
pressBackNum ++;
if(1 == pressBackNum){
Toast.makeText(MainActivity.this,R.string.exit,Toast.LENGTH_SHORT).show();
new Handler().postDelayed(newRunnable() {
@Override
public void run() {
//两秒后归零
pressBackNum = 0;
}
},2000);
}else if(2 == pressBackNum){
myapplication.finishAllActivity();
}
}
//第三种形式:MainActivity里面点击返回键,弹出对话框,是否退出
@Override
public void onBackPressed() {
newAlertDialog.Builder(this)
.setTitle("title")
.setMessage("是否退出")
.setNegativeButton("取消",null)
.setPositiveButton("确定", newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Myapplicationapp = (Myapplication) getApplication();
app.finishActivity();
}
}).create().show();
}