此文版權屬於作者所有,任何人、媒體或者網站轉載、借用都必須徵得作者本人同意!
//
public class SystemUtil {
private static final String TAG = LogStrategy.PRE + "SystemUtil";
private static class AppState {
static enum State {
UNACTIVITE, FG, BG;
@Override
public String toString() {
switch (this) {
case BG:
return "background";
case FG:
return "front";
case UNACTIVITE:
return "unactivite";
default:
return "";
}
}
}
State mState = State.UNACTIVITE;
RunningTaskInfo mRunningTaskInfo;
@Override
public String toString() {
return "state: " + mState + (mRunningTaskInfo == null
? ", runningTaskInfo is null" : ", topActivity "
+ mRunningTaskInfo.topActivity.toShortString());
}
}
private static AppState getRunningState() {
Context context = Util.applicationContext();
AppState appState = new AppState();
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (am == null)
|| (Build.VERSION.SDK_INT >= 21 && !iAmActivity_after21ApiLevel(context, am)))
return appState;
List<RunningTaskInfo> runningTaskInfos = am.getRunningTasks(300);
if (runningTaskInfos == null)
return appState;
int index = 0;
for (RunningTaskInfo runningTaskInfo : runningTaskInfos) {
ComponentName cn = runningTaskInfo.topActivity;
ComponentName bn = runningTaskInfo.baseActivity;
if (cn != null && bn != null) {
String cnPackageName = cn.getPackageName();
String bnPackageName = bn.getPackageName();
if (Util.isNotEmpty(cnPackageName) && Util.isNotEmpty(bnPackageName)) {
if (cnPackageName.equals(context.getPackageName())
&& bnPackageName.equals(context.getPackageName())) {
if (index == 0)
appState.mState = AppState.State.FG;
else
appState.mState = AppState.State.BG;
appState.mRunningTaskInfo = runningTaskInfo;
break;
}
}
index++;
}
}
return appState;
}
private static boolean iAmActivity_after21ApiLevel(Context context, ActivityManager am) {
try {
@SuppressWarnings("unchecked")
List<Object> appTasks = Util.call(List.class, am, "getAppTasks", null, null);
if (appTasks != null && appTasks.size() > 0) {
ActivityManager.RecentTaskInfo info = null;
for (Object appTask : appTasks) {
info = Util.call(ActivityManager.RecentTaskInfo.class, appTask, "getTaskInfo",
null, null);
if (info == null
|| !info.baseIntent.getComponent().getPackageName()
.equals(context.getPackageName())) {
continue;
}
if (info.id != -1)
return true;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
/**
* manifest need to define:
* <uses-permission android:name="android.permission.REORDER_TASKS" />
*/
private static boolean bringAppToTopUseActivityManager(AppState appState) {
try {
Context ctx = Util.applicationContext();
ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
if (am != null) {
am.moveTaskToFront(appState.mRunningTaskInfo.id,
ActivityManager.MOVE_TASK_WITH_HOME);
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
public static void bringAppToTop() {
AppState appState = getRunningState();
if (appState.mState != AppState.State.BG || appState.mRunningTaskInfo == null
|| appState.mRunningTaskInfo.topActivity == null)
return;
if (LogStrategy.ENABLE)
Log.i(TAG, "try to bringAppToTop - "
+ appState.mRunningTaskInfo.topActivity.toShortString());
if (bringAppToTopUseActivityManager(appState))
return;
try {
Context ctx = Util.applicationContext();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.setComponent(appState.mRunningTaskInfo.topActivity);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
ctx.startActivity(intent);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}