Android將後臺應用喚起到前臺,喚醒APP;

包名啓動即可:

Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
context.startActivity(intent);

只針對於從通知欄喚醒應用,無需啓動新的Activity ;

如果在後臺是無法喚醒的,Android8.0對後臺啓動做了限制;https://developer.android.google.cn/about/versions/oreo/background?hl=zh_cn

走的彎路:

    /**
     * 喚醒APP
     * @param context
     */
   public static void rouseApp(Context context) {
       if (BaseApplication.get().getTopActivity() != null) {
           Intent intent = new Intent(context, BaseApplication.get().getTopActivity().getClass());
           intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
           context.startActivity(intent);
       }else {
           Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
           context.startActivity(intent);
       }
   }
public class BaseApplication extends Application {
    

    private static Stack<Activity> activityStack;
    private static BaseApplication instance;

    public static BaseApplication get() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        
        initActivityStack();
    }

    /**
     * 獲取當前APP中Activity正在顯示的數量
     * 可用於判斷APP處於前臺還是後臺
     *
     * @return
     */
    public static Integer getActivityStackCount() {
        return mActivityCount;
    }

    private static int mActivityCount = 0;

    private void initActivityStack() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                addActivity(activity);
            }

            @Override
            public void onActivityStarted(Activity activity) {
                mActivityCount++;
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                mActivityCount--;
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {
                finishActivity(activity);
            }
        });
    }


    /**
     * 添加Activity到堆棧
     */
    public void addActivity(Activity activity) {
        if (activityStack == null) {
            activityStack = new Stack<>();
        }
        activityStack.add(activity);
    }

    public Activity getActivity(Class<?> cls) {
        if (activityStack == null)
            return null;
        if (activityStack.isEmpty())
            return null;
        for (Activity activity : activityStack) {
            if (activity.getClass().equals(cls)) {
                return activity;
            }
        }
        return null;
    }

    /**
     * 移除指定的Activity
     */
    public void finishActivity(Activity activity) {
        if (activity != null) {
            activityStack.remove(activity);
            activity = null;
        }
    }

    /**
     * 結束指定類名的Activity
     */
    public void finishActivity(Class<?>... clses) {
        for (Class<?> cls : clses) {
            Iterator<Activity> iterator = activityStack.iterator();
            while (iterator.hasNext()) {
                Activity activity = iterator.next();
                if (activity.getClass().equals(cls)) {
                    iterator.remove();
                    activity.finish();
                }
            }
        }
    }

    /**
     * 結束除參數外的所有activity
     *
     * @param clses
     */
    public void finishAllOther(Class<?>... clses) {
        Iterator<Activity> iterator = activityStack.iterator();
        while (iterator.hasNext()) {
            Activity activity = iterator.next();
            final Class actCls = activity.getClass();
            boolean finish = true;
            for (Class<?> cls : clses) {
                if (null == cls)
                    continue;
                if (actCls.equals(cls)) {
                    finish = false;
                    break;
                }
            }
            if (finish) {
                iterator.remove();
                activity.finish();
            }
        }
    }

    /**
     * 結束所有Activity
     */
    public void finishAllActivity() {
        Iterator<Activity> iterator = activityStack.iterator();
        while (iterator.hasNext()) {
            Activity activity = iterator.next();
            iterator.remove();
            activity.finish();
        }
    }

    public void finishiTopActivity() {
        final int size = activityStack.size();
        if (size > 1) {
            activityStack.get(size - 1).finish();
        }
    }

    public Activity getTopActivity() {
        if (activityStack.isEmpty())
            return null;
        final int size = activityStack.size();
        if (size >= 1) {
            return activityStack.get(size - 1);
        } else {
            return null;
        }
    }

    /**
     * 判斷某Activity是否在棧中
     *
     * @param cls
     * @return
     */
    public boolean isExist(Class<?> cls) {
        if (activityStack == null)
            return false;
        if (activityStack.isEmpty())
            return false;
        for (Activity activity : activityStack) {
            if (activity.getClass().equals(cls)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 退出應用程序
     */
    public void AppExit() {
        finishAllActivity();
    }
}

 

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