美文网首页
我的App完全退出困扰解答

我的App完全退出困扰解答

作者: 清明捉鬼 | 来源:发表于2018-07-10 16:39 被阅读14次
前言

无论是哪种退出方式,要想彻底的退出进程就得加此段代码,由于App退出大多数都只是Activity被finish,而当所有Activity被finish掉后应用将退出,但是此时进程没有被完全退出appliciotn交由系统处理(不信的同学可以试试,自定义app有没有走onCreate方法),或者由于内存泄漏而未被finish掉,导致第二次进入应用各种烦心异常,反正App症状来看就是没完全死透,一般情况下我们会使用System.exit(0);android.os.Process.killProcess(android.os.Process.myPid()); 但是可以观察发现,这两种退出方式不同手机退出可能皆有不同表现,就是有点不友好。所以用如下代码由管理器自己杀死进程。

/**使用此方法需添加权限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />*/
ActivityManager manager = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); //获取应用程序管理器
manager.killBackgroundProcesses(getPackageName()); //强制结束当前应用程序
  • 单进程下
Application里通过生命周期监听往List里添加而进行管理。
package com.biabia.club.testumeng.base;
import android.app.Activity;
import android.app.Application;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import java.util.LinkedList;
/**
 * Created by Administrator on 2018/6/27.
 */
public class TestMyApp extends Application implements Application.ActivityLifecycleCallbacks {
    private LinkedList<ActivityInfo> mExistedActivitys = new LinkedList<ActivityInfo>();
    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
        if (null != mExistedActivitys && null != activity) {
            // 把新的 activity 添加到最前面,和系统的 activity 堆栈保持一致
            mExistedActivitys.offerFirst(new ActivityInfo(activity, ActivityInfo.STATE_CREATE));
        }
    }
    @Override
    public void onActivityStarted(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
    }

    @Override
    public void onActivityPaused(Activity activity) {
    }

    @Override
    public void onActivityStopped(Activity activity) {
    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
    }

    @Override
    public void onActivityDestroyed(Activity activity) {
        if (null != mExistedActivitys && null != activity) {
            ActivityInfo info = findActivityInfo(activity);
            if (null != info) {
                mExistedActivitys.remove(info);
            }
        }
    }

    public void exitAllActivity() {
        if (null != mExistedActivitys) {
            // 先暂停监听(省得同时在2个地方操作列表)
            unregisterActivityLifecycleCallbacks(this);
            // 弹出的时候从头开始弹,和系统的 activity 堆栈保持一致
            for (ActivityInfo info : mExistedActivitys) {
                if (null == info || null == info.mActivity) {
                    continue;
                }
                try {
                    info.mActivity.finish();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            mExistedActivitys.clear();
            // 退出完之后再添加监听
            registerActivityLifecycleCallbacks(this);
        }
    }

    private ActivityInfo findActivityInfo(Activity activity) {
        if (null == activity || null == mExistedActivitys) {
            return null;
        }
        for (ActivityInfo info : mExistedActivitys) {
            if (null == info) {
                continue;
            }
            if (activity.equals(info.mActivity)) {
                return info;
            }
        }
        return null;
    }

    class ActivityInfo {
        private final static int STATE_NONE = 0;
        private final static int STATE_CREATE = 1;
        Activity mActivity;
        int mState;
        ActivityInfo() {
            mActivity = null;
            mState = STATE_NONE;
        }
        ActivityInfo(Activity activity, int state) {
            mActivity = activity;
            mState = state;
        }
    }
}

广播处理
在父类中注册广播,封装常量自杀广播发送方法,子类实现父类,在super前实现父类的广播监听方法,收到自杀,信息就在覆写的方法中写入自杀代码

相关文章

网友评论

      本文标题:我的App完全退出困扰解答

      本文链接:https://www.haomeiwen.com/subject/gsjiyftx.html