美文网首页
WindowManager与ViewRootImpl之间的关联

WindowManager与ViewRootImpl之间的关联

作者: tigerzhao | 来源:发表于2021-07-06 17:05 被阅读0次

    源码基于Android9.0r3。9.0和8.0的代码在此处有不同,略微复杂了
    涉及到的类有ActivityThread,Activity,ViewRootImpl,

    在startActivity流程中会调用到realStartActivityLocked这个方法,此方法中有段代码:

    /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java
    
    final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
                boolean andResume, boolean checkConfig) throws RemoteException {
                    // Create activity launch transaction.
                    // 使用类似于事物的方式,创建一个任务提交,此处于8.0不同,8.0没有这么复杂,直接就是代码跳转
                    final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
                            r.appToken);
                  // 此处加入一个启动Activity的LaunchActivityItem
                    clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                            System.identityHashCode(r), r.info,
                            // TODO: Have this take the merged configuration instead of separate global
                            // and override configs.
                            mergedConfiguration.getGlobalConfiguration(),
                            mergedConfiguration.getOverrideConfiguration(), r.compat,
                            r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                            r.persistentState, results, newIntents, mService.isNextTransitionForward(),
                            profilerInfo));
    
                    // Set desired final state.
                    // 设置一个Activity的状态,在执行完上面的CallBack之后更新Activity的状态
                    final ActivityLifecycleItem lifecycleItem;
                    if (andResume) {
                        lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
                    } else {
                        lifecycleItem = PauseActivityItem.obtain();
                    }
                    clientTransaction.setLifecycleStateRequest(lifecycleItem);
    
                    // Schedule transaction.
                    // 执行这个任务
                    mService.getLifecycleManager().scheduleTransaction(clientTransaction);
    }
    

    ActivityServiceManager的getLifecycleManager方法返回的是ClientLifecycleManager,在此类中scheduleTransaction代码如下

    /frameworks/base/services/core/java/com/android/server/am/ClientLifecycleManager.java
    
        void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            final IApplicationThread client = transaction.getClient();
            transaction.schedule();
            if (!(client instanceof Binder)) {
                // If client is not an instance of Binder - it's a remote call and at this point it is
                // safe to recycle the object. All objects used for local calls will be recycled after
                // the transaction is executed on client in ActivityThread.
                transaction.recycle();
            }
        }
    

    来看ClientTransaction类中schedule方法的实现

    /frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
    
        public void schedule() throws RemoteException {
            mClient.scheduleTransaction(this);
        }
    

    而mClient就是IApplicationThread

    /frameworks/base/core/java/android/app/servertransaction/ClientTransaction.java
    
        /** Target client. */
        private IApplicationThread mClient;
    

    而IApplicationThread的实现类就在ActivityThread类中

    /frameworks/base/core/java/android/app/ActivityThread.java
    
            @Override
            public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
                ActivityThread.this.scheduleTransaction(transaction);
            }
    

    ActivityThread继承了ClientTransactionHandler,在ClientTransactionHandler类中实现了scheduleTransaction方法

    /frameworks/base/core/java/android/app/ClientTransactionHandler.java
    
        /** Prepare and schedule transaction for execution. */
        void scheduleTransaction(ClientTransaction transaction) {
            transaction.preExecute(this);
            sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
        }
    
    
    abstract void sendMessage(int what, Object obj);
    

    而sendMessage是个抽象方法,具体的实现在子类ActicityThread里面

    /frameworks/base/core/java/android/app/ActivityThread.java
    
    
                    case EXECUTE_TRANSACTION:
                        final ClientTransaction transaction = (ClientTransaction) msg.obj;
                        mTransactionExecutor.execute(transaction);
                        if (isSystem()) {
                            // Client transactions inside system process are recycled on the client side
                            // instead of ClientLifecycleManager to avoid being cleared before this
                            // message is handled.
                            transaction.recycle();
                        }
                        // TODO(lifecycler): Recycle locally scheduled transactions.
                        break;
    
    
        // An executor that performs multi-step transactions.
        private final TransactionExecutor mTransactionExecutor = new TransactionExecutor(this);
    

    TransactionExecutor中execute方法的实现

    /frameworks/base/core/java/android/app/servertransaction/TransactionExecutor.java
    
        public void execute(ClientTransaction transaction) {
            final IBinder token = transaction.getActivityToken();
            log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);
    
            executeCallbacks(transaction);
    
            executeLifecycleState(transaction);
            mPendingActions.clear();
            log("End resolving transaction");
        }
    
    

    到这一步真正执行了开头realStartActivityLocked设置的CallBack和ActivityLifecycleItem

    而此处的ActivityLifecycleItem是ResumeActivityItem,ResumeActivityItem里面要执行的代码如下:

    /frameworks/base/core/java/android/app/servertransaction/ResumeActivityItem.java
    
        @Override
        public void execute(ClientTransactionHandler client, IBinder token,
                PendingTransactionActions pendingActions) {
            Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
            client.handleResumeActivity(token, true /* finalStateRequest */, mIsForward,
                    "RESUME_ACTIVITY");
            Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
        }
    

    client对应的是ActivityThread,调用了ActivityThread类的handleResumeActivity将decor加入到了ViewManager中

      r.window = r.activity.getWindow();
      View decor = r.window.getDecorView();
      decor.setVisibility(View.INVISIBLE);
      ViewManager wm = a.getWindowManager();
    
    if (a.mVisibleFromClient) {
                if (!a.mWindowAdded) {
                    a.mWindowAdded = true;
                    wm.addView(decor, l);
                } else {
                    a.onWindowAttributesChanged(l);
                }
            }
    

    ViewManager是个接口,具体的实现类是WindowManagerImpl,addView方法的代码如下:

    
    /frameworks/base/core/java/android/view/WindowManagerImpl.java
    
    private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
    
        @Override
        public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
            applyDefaultToken(params);
            mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
        }
    

    WindowManagerGlobal是一个单例类,在一个进程中只存在一份,其初始化在Activity启动流程handleLaunchActivity方法中,
    WindowManagerGlobal的addView方法如下

    /frameworks/base/core/java/android/view/WindowManagerGlobal.java
    
    ...
            ViewRootImpl root;
            View panelParentView = null;
    ...
                root = new ViewRootImpl(view.getContext(), display);
    
                view.setLayoutParams(wparams);
    
                mViews.add(view);
                mRoots.add(root);
                mParams.add(wparams);
    ...
    
    

    至此WindowManager与ViewRootImpl就关联上了

    在startActivity流程中会执行到ActivityThread类中的performLaunchActivity方法,此方法中相关的代码如下:

    /frameworks/base/core/java/android/app/ActivityThread.java
    private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ...
                   Window window = null;
                    if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
                        window = r.mPendingRemoveWindow;
                        r.mPendingRemoveWindow = null;
                        r.mPendingRemoveWindowManager = null;
                    }
                    appContext.setOuterContext(activity);
                    activity.attach(appContext, this, getInstrumentation(), r.token,
                            r.ident, app, r.intent, r.activityInfo, title, r.parent,
                            r.embeddedID, r.lastNonConfigurationInstances, config,
                            r.referrer, r.voiceInteractor, window, r.configCallback);
    ...
    }
    

    给Window对象赋值,并调用Activity的attach方法将Window和Activity关联了起来。
    Window是一个抽象类,而其唯一的实现类就是android.view.PhoneWindow。

    接下来看Activity类中attach方法的实现:

        final void attach(Context context, ActivityThread aThread,
                Instrumentation instr, IBinder token, int ident,
                Application application, Intent intent, ActivityInfo info,
                CharSequence title, Activity parent, String id,
                NonConfigurationInstances lastNonConfigurationInstances,
                Configuration config, String referrer, IVoiceInteractor voiceInteractor,
                Window window, ActivityConfigCallback activityConfigCallback) {
    ...
    mWindow = new PhoneWindow(this, window, activityConfigCallback);
    ...
     mWindow.setWindowManager(
                    (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                    mToken, mComponent.flattenToString(),
                    (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
    
    }
    

    通过调用PhoneWindow类的setWindowManager方法将window注册到WindowManager中

    相关文章

      网友评论

          本文标题:WindowManager与ViewRootImpl之间的关联

          本文链接:https://www.haomeiwen.com/subject/xndevhtx.html