前言
无论是哪种退出方式,要想彻底的退出进程就得加此段代码,由于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前实现父类的广播监听方法,收到自杀,信息就在覆写的方法中写入自杀代码
网友评论