jQuery鼠标指针特效

Android 11 自由窗口模式 || 全屏模式启动app

    //未定义
    public static final int WINDOWING_MODE_UNDEFINED = 0;
    //普通全屏窗口
    public static final int WINDOWING_MODE_FULLSCREEN = 1;
    //画中画
    public static final int WINDOWING_MODE_PINNED = 2;
    //分屏主窗口
    public static final int WINDOWING_MODE_SPLIT_SCREEN_PRIMARY = 3;
    //分屏副窗口
    public static final int WINDOWING_MODE_SPLIT_SCREEN_SECONDARY = 4;
    //自由窗口
    public static final int WINDOWING_MODE_FREEFORM = 5;
    
    //自由窗口模式里面,窗口支持放大缩小以及移动位置,原理是不断的更改Task的边界(用Rect表示),
    //然后根据Task的边界来重新缩放Task,从而达到窗口缩放和拖动的作用。
    
    //如何以自由窗口模式启动应用?
    //在ActivityStarter拦截启动APP,以自由窗口模式启动
    frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java
    
    int startActivityInner(...)}{
    	...
    	computeLaunchParams(r, sourceRecord, targetTask);
    	...
    }
    
    private void computeLaunchParams(ActivityRecord r, ActivityRecord sourceRecord,
            Task targetTask) {
        final ActivityStack sourceStack = mSourceStack != null ? mSourceStack
                : mRootWindowContainer.getTopDisplayFocusedStack();
        if (sourceStack != null && sourceStack.inSplitScreenWindowingMode()
                && (mOptions == null
                        || mOptions.getLaunchWindowingMode() == WINDOWING_MODE_UNDEFINED)) {
            int windowingMode =
                    targetTask != null ? targetTask.getWindowingMode() : WINDOWING_MODE_UNDEFINED;
            if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0) {
                if (sourceStack.inSplitScreenPrimaryWindowingMode()) {
                    windowingMode = WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
                } else if (sourceStack.inSplitScreenSecondaryWindowingMode()) {
                    windowingMode = WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
                }
            }

            if (mOptions == null) {
                mOptions = ActivityOptions.makeBasic();
            }
            mOptions.setLaunchWindowingMode(windowingMode);
        }

        mSupervisor.getLaunchParamsController().calculate(targetTask, r.info.windowLayout, r,
                sourceRecord, mOptions, PHASE_BOUNDS, mLaunchParams);
        mPreferredTaskDisplayArea = mLaunchParams.hasPreferredTaskDisplayArea()
                ? mLaunchParams.mPreferredTaskDisplayArea
                : mRootWindowContainer.getDefaultTaskDisplayArea();
        //add text
        mPreferredWindowingMode = 5;//mLaunchParams.mWindowingMode;
        mOptions.setLaunchBounds(new Rect(10,20,30,40));
        mOptions.setLaunchWindowingMode(5);
        //add text
    }


全屏模式启动app,默认隐藏状态栏,导航栏(沉浸式),某些app可能因为这个闪退
[沉浸式](https://blog.csdn.net/qq_32664007/article/details/126279919)

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActivityOptions.setLaunchWindowingMode(int)' on a null object reference

./frameworks/base/core/java/android/app/ActivityThread.java

@Override
    public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,
            String reason) {
  ...
  boolean willBeVisible = !a.mStartedActivity;
        if (!willBeVisible) {
            try {
                willBeVisible = ActivityTaskManager.getService().willActivityBeVisible(
                        a.getActivityToken());
            } catch (RemoteException e) {
                throw e.rethrowFromSystemServer();
            }
        }
        if (r.window == null && !a.mFinished && willBeVisible) {
            r.window = r.activity.getWindow();
            View decor = r.window.getDecorView();
            //add text
            decor.setSystemUiVisibility(
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
            //add text
            ViewManager wm = a.getWindowManager();
            WindowManager.LayoutParams l = r.window.getAttributes();
            a.mDecor = decor;
            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
  ...

ActivityOptions副屏启动-CSDN博客

ActivityOptions - Android中文版 - API参考文档 (apiref.com)

支持多窗口模式 | Android Open Source Project (google.cn)

android freeform模式定制桌面系统_android freeform demo实例-CSDN博客

android framework实战开发之WINDOWING_MODE_FREEFORM自由窗口相关_android_learnframework-华为云开发者联盟 (csdn.net)

posted @ 2024-06-13 19:16  僵小七  阅读(123)  评论(0编辑  收藏  举报