Android 安全退出App完美实现

本文主要介绍两种方式退出APP,一种是基于Activity的启动模式singleTask模式实现的,一种是基于全局Activity管理类实现的。强烈推荐第一种方法实现,简单又方便。

  • 基于Activity的启动模式singleTask模式实现
    singleTask是Activity启动模式中的一种,当startActivity时,它先会在当前栈中查询是否存在Activity的实例,如果存在,则将其置于栈顶,并将其之上的所有Activity移出栈。同时调用Activity的onNewIntent方法。可以看出实现安全退出APP很简单,只需要将MainActivity的launchMode改为singleTask,在MainActivity中的onNewintent方法中finish掉当前Activity即可。

说下环境:MainActivity跳转到FirstActivity,FirstActivity跳转到secondActivity,在secondActivity中退出程序。
首先,将MainActivity的launchMode改为singleTask,如下

 <activity
            android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            intent-filter>
        activity>

其次 实现MainActivity中的onNewIntent方法,实现退出APP的逻辑。

   @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        String tag = intent.getStringExtra("EXIT_TAG");
        if (tag != null&& !TextUtils.isEmpty(tag)) {
            if ("SINGLETASK".equals(tag)) {//退出程序
                finish();
            }
        }
    }

这里面的tag用来标识关闭app的,在secondActivity中退出APP调用startActivity的时候需要传入。
现在就看下secondActivity中相关代码

 Intent intent = new Intent(this, MainActivity.class);
                intent.putExtra("EXIT_TAG", "SINGLETASK");
                startActivity(intent);

通过这三步就解决了安全退出APP的问题,现在很多人都在用,你还在等啥。

  • 基于全局Activity管理类实现

说下环境:MainActivity跳转到FirstActivity,FirstActivity跳转到secondActivity,在secondActivity中退出程序。
首先创建一个全局的Activity管理类 ActivityManager,里面有添加Activity,移除Activity,关闭activitys。ActivityManager的单例是用静态内部类实现的。贴下ActivityManager的全部代码

  package com.appexit.util;

import android.app.Activity;

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

/**
 * Author:wang_sir
 * Time:2018/6/7 20:15
 * Description:This is ActivityManager
 */
public class ActivityManager {

    private List activityList = new ArrayList<>();

    private ActivityManager() {
    }

    public static ActivityManager getInstance() {

        return ActivityManagerHolder.Instantce;
    }

    /**
     * 静态内部类获取单例
     */
    static class ActivityManagerHolder {
        public static ActivityManager Instantce = new ActivityManager();

    }

    /**
     * 添加activity
     * @param activity
     */
    public void addActivity(Activity activity){
        if (!activityList.contains(activity)) {
            activityList.add(activity);
        }

    }

    /**
     * 移除activity
     * @param activity
     */
    public void removeActivity(Activity activity){
        if (activityList.contains(activity)) {
            activityList.remove(activity);
        }
    }

    /**
     * 关闭所有的activity,退出应用
     */
    public void finishActivitys(){
        if (activityList != null&&!activityList.isEmpty()) {
            for (Activity activity1 : activityList) {
                activity1.finish();
            }
            activityList.clear();
        }
    }

}

其次是创建一个BaseActivity,所有的Activity都继承这个BaseActivity,在BaseActivity中实现添加Activity和移除Activity的操作,看代码

package com.appexit;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.appexit.util.ActivityManager;

import java.lang.ref.WeakReference;

/**
 * Author:wang_sir
 * Time:2018/6/7 20:11
 * Description:This is BaseActivity
 */
public class BaseActivity extends AppCompatActivity {

    private WeakReference weakReference = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //将activity添加到列表中

        if (weakReference==null) {
            weakReference =  new WeakReference(this);
        }
      ActivityManager.getInstance().addActivity(weakReference.get());

    }



    @Override
    protected void onDestroy() {
        super.onDestroy();
        //将activity从列表中移除
        ActivityManager.getInstance().removeActivity(weakReference.get());
    }




}

这里用到了弱引用,目的防止内存泄漏,因为ActivityManager有Activity的引用。

当需要退出应用的时候直接调用ActivityManager中的关闭Activity的方法即可,看下secondActivity中的相关代码

  ActivityManager.getInstance().finishActivitys();

至此两种安全退出APP的方法总结完了,都挺实用的,个人感觉还是第一种方法好。

Demo地址:https://github.com/DevelopWb/AppExit.git

你可能感兴趣的:(android)