Android 退出应用程序

如何干净彻底地退出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();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值