您的位置:首页 > 移动开发 > Android开发

Android 退出应用程序

2016-11-10 17:49 302 查看
如何干净彻底地退出Android应用程序,如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity?

搜索了一下,有以下一些

1. 任务管理器方法(ActivityManager)

首先要说明该方法运行在Android 1.5 API Level为3以上才可以,

系统会将,该包下的,所有进程,服务,全部杀掉

ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());


要注意加上权限

<uses-permission android:name="android.permission.RESTART_PACKAGES\"></uses-permission>


2. Dalvik VM的本地方法

android.os.Process.killProcess(android.os.Process.myPid())    //获取PID


System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出


killProcess( )需要添加权限

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


3.一种比较流行的Android退出方法

使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,容易理解、易于操作。

我的代码就是使用第三种方法,通过创建一个 Activity界面管理工具类实现的。

package com.demo.android.model;

import android.app.Activity;

import com.demo.util.LogUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* Activity界面管理工具
*/
public final class ActivityManager {
private static List<Activity> activities = new ArrayList<Activity>();// 普通Activity

/**
* 添加普通Activity
*
* @param activity
*/
public static void addActivity(Activity activity) {
if (activities.contains(activity)) {
removeActivity(activity);
}
activities.add(activity);
LogUtils.debug("ActivityManager--enter", activity.getClass().getSimpleName());
}

/**
* 删除普通Activity
*
* @param activity
*/
public static void removeActivity(Activity activity) {
activities.remove(activity);
LogUtils.debug("ActivityManager--exit", activity.getClass().getSimpleName());
}

/**
* 结束普通Activity的栈顶的元素
*
*/
public static void getTopActivityAndFinish() {
Activity top = activities.get(activities.size() - 1);
removeActivity(top);
top.finish();
}

public static boolean isActivityTop(String name){
Activity top = activities.get(activities.size() - 1);
return top.getClass().getSimpleName().equals(name);
}

/**
* 结束当前之外的Activity
*/
public static void finishNotTopActivity(Activity top) {
Iterator<Activity> iterator = activities.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
if (top != activity) {
iterator.remove();
activity.finish();
}
}
}

/**
* 结束所有activity
*/
public static void finishAllActivity() {
Iterator<Activity> iterator = activities.iterator();
while (iterator.hasNext()) {
Activity activity = iterator.next();
iterator.remove();
activity.finish();
}
}

public static void backToActivity(String toActivity) {
List<Activity> needRemove = new ArrayList<Activity>();
for (int i = activities.size() - 1; i < activities.size(); i--) {
if (i >= 0) {
Activity activity = activities.get(i);
if (toActivity.equals(activity.getClass().getSimpleName())) {
break;
}
needRemove.add(activity);
// removeActivity(activity);
// activity.finish();
}
}
activities.removeAll(needRemove);
// finish后对象销毁,确保上一步准确执行还是提出来做
for (Activity activity : needRemove) {
activity.finish();
}
}
}


在BaseActivity中添加

public class BaseActivity extends AnActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.addActivity(this);

.....
}
}
@Override
protected void onDestroy() {
....
ActivityManager.removeActivity(this);
super.onDestroy();
}


在点击退出程序的时候,执行

ActivityManager.finishAllActivity();


其他的关闭Activity方法网上相关的说明

finish():结束当前Activity,不会立即释放内存。遵循android内存管理机制。

exit():结束当前组件如Activity,并立即释放当前Activity所占资源。

killProcess():结束当前组件如Activity,并立即释放当前Activity所占资源。

restartPackage():结束整个App,包括service等其它Activity组件。

特别注意:

除了finish()方法可以调用Activity的生命周期方法如onStop()、onDestroy(),其余三种退出App均不会调用Activity的生命周期方法。除非,在调用这几个方法之前或者之后主动调用Activity的生命周期方法。如:

System.exit(int);

onDestroy();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: