前言
無論是哪種退出方式,要想徹底的退出進程就得加此段代碼,由于App退出大多數(shù)都只是Activity被finish晃财,而當所有Activity被finish掉后應用將退出痹籍,但是此時進程沒有被完全退出appliciotn交由系統(tǒng)處理(不信的同學可以試試了袁,自定義app有沒有走onCreate方法),或者由于內(nèi)存泄漏而未被finish掉鳍烁,導致第二次進入應用各種煩心異常,反正App癥狀來看就是沒完全死透繁扎,一般情況下我們會使用System.exit(0);
或android.os.Process.killProcess(android.os.Process.myPid());
但是可以觀察發(fā)現(xiàn)幔荒,這兩種退出方式不同手機退出可能皆有不同表現(xiàn),就是有點不友好梳玫。所以用如下代碼由管理器自己殺死進程爹梁。
/**使用此方法需添加權(quán)限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />*/
ActivityManager manager = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE); //獲取應用程序管理器
manager.killBackgroundProcesses(getPackageName()); //強制結(jié)束當前應用程序
-
單進程下
Application里通過生命周期監(jiān)聽往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 添加到最前面提澎,和系統(tǒng)的 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) {
// 先暫停監(jiān)聽(省得同時在2個地方操作列表)
unregisterActivityLifecycleCallbacks(this);
// 彈出的時候從頭開始彈姚垃,和系統(tǒng)的 activity 堆棧保持一致
for (ActivityInfo info : mExistedActivitys) {
if (null == info || null == info.mActivity) {
continue;
}
try {
info.mActivity.finish();
} catch (Exception e) {
e.printStackTrace();
}
}
mExistedActivitys.clear();
// 退出完之后再添加監(jiān)聽
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;
}
}
}
廣播處理
在父類中注冊廣播,封裝常量自殺廣播發(fā)送方法虱朵,子類實現(xiàn)父類莉炉,在super前實現(xiàn)父類的廣播監(jiān)聽方法,收到自殺碴犬,信息就在覆寫的方法中寫入自殺代碼