package com.morgoo.droidplugin.am;
import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.Build;
import com.morgoo.droidplugin.pm.PluginManager;
import com.morgoo.helper.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 正在运行的Activity列表
* Created by zhangyong6 on 2015/10/20.
*/
public class RunningActivities {
private static final String TAG = RunningActivities.class.getSimpleName();
private static Map<Activity, RunningActivityRecord> mRunningActivityList = new HashMap<>();
private static Map<Integer, RunningActivityRecord> mRunningSingleStandardActivityList = new HashMap<>();
private static Map<Integer, RunningActivityRecord> mRunningSingleTopActivityList = new HashMap<>();
private static Map<Integer, RunningActivityRecord> mRunningSingleTaskActivityList = new HashMap<>();
private static Map<Integer, RunningActivityRecord> mRunningSingleInstanceActivityList = new HashMap<>();
public static void onActivtyOnNewIntent(Activity activity, ActivityInfo targetInfo, ActivityInfo stubInfo, Intent intent) {
//TODO
}
private static class RunningActivityRecord {
private final Activity activity;
private final ActivityInfo targetActivityInfo;
private final ActivityInfo stubActivityInfo;
private int index = 0;
private RunningActivityRecord(Activity activity, ActivityInfo targetActivityInfo, ActivityInfo stubActivityInfo, int index) {
this.activity = activity;
this.targetActivityInfo = targetActivityInfo;
this.stubActivityInfo = stubActivityInfo;
this.index = index;
}
}
public static void onActivtyCreate(Activity activity, ActivityInfo targetActivityInfo, ActivityInfo stubActivityInfo) {
synchronized (mRunningActivityList) {
RunningActivityRecord value = new RunningActivityRecord(activity, targetActivityInfo, stubActivityInfo, findMaxIndex() + 1);
mRunningActivityList.put(activity, value);
if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_MULTIPLE) {
mRunningSingleStandardActivityList.put(value.index, value);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
mRunningSingleTopActivityList.put(value.index, value);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
mRunningSingleTaskActivityList.put(value.index, value);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
mRunningSingleInstanceActivityList.put(value.index, value);
}
}
}
public static void onActivtyDestory(Activity activity) {
synchronized (mRunningActivityList) {
RunningActivityRecord value = mRunningActivityList.remove(activity);
if (value != null) {
ActivityInfo targetActivityInfo = value.targetActivityInfo;
if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_MULTIPLE) {
mRunningSingleStandardActivityList.remove(value.index);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
mRunningSingleTopActivityList.remove(value.index);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
mRunningSingleTaskActivityList.remove(value.index);
} else if (targetActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
mRunningSingleInstanceActivityList.remove(value.index);
}
}
}
}
//在启动一个Activity时调用
public static void beforeStartActivity() {
synchronized (mRunningActivityList) {
for (RunningActivityRecord record : mRunningActivityList.values()) {
if (record.stubActivityInfo.launchMode == ActivityInfo.LAUNCH_MULTIPLE) {
continue;
} else if (record.stubActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) {
doFinshIt(mRunningSingleTopActivityList);
} else if (record.stubActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
doFinshIt(mRunningSingleTopActivityList);
} else if (record.stubActivityInfo.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
doFinshIt(mRunningSingleTopActivityList);
}
}
}
}
private static final Comparator<RunningActivityRecord> sRunningActivityRecordComparator = new Comparator<RunningActivityRecord>() {
@Override
public int compare(RunningActivityRecord lhs, RunningActivityRecord rhs) {
if (lhs != null && rhs != null) {
if (lhs.index > rhs.index) {
return 1;
} else if (lhs.index < rhs.index) {
return -1;
} else {
return 0;
}
} else if (lhs != null && rhs == null) {
return 1;
} else if (lhs == null && rhs != null) {
return -1;
} else {
return 0;
}
}
};
private static void doFinshIt(Map<Integer, RunningActivityRecord> runningActivityList) {
if (runningActivityList != null && runningActivityList.size() >= PluginManager.STUB_NO_ACTIVITY_MAX_NUM - 1) {
List<RunningActivityRecord> activitys = new ArrayList<>(runningActivityList.size());
activitys.addAll(runningActivityList.values());
Collections.sort(activitys, sRunningActivityRecordComparator);
RunningActivityRecord record = activitys.get(0);
if (record.activity != null && !record.activity.isFinishing()) {
record.activity.finish();
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
// record.activity.finishAndRemoveTask();
// record.activity.releaseInstance();
// } else {
// record.activity.finish();
// }
//
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// record.activity.finishAffinity();
// }
// Log.d(TAG, "ZYActivity.finish stub=%s target=%s", record.stubActivityInfo, record.targetActivityInfo);
}
}
}
private static int findMaxIndex() {
int max = 0;
synchronized (mRunningActivityList) {
for (RunningActivityRecord record : mRunningActivityList.values()) {
if (max < record.index) {
max = record.index;
}
}
}
return max;
}
}