完全退出Android应用程序的四种方法

来源:互联网 发布:usb3.0端口 编辑:程序博客网 时间:2024/05/01 14:39

退出形式:

   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();

}

0 0
原创粉丝点击