android bringAppToTop

此文版權屬於作者所有,任何人、媒體或者網站轉載、借用都必須徵得作者本人同意!

//

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();
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章