android10 activitythread如何将viewrootimpl 绑定到Activity的Window
时间: 2024-06-04 22:13:59 浏览: 76
在Android 10中,ActivityThread在创建Activity时会调用attach方法来将Activity的Window与ViewRootImpl进行绑定。具体步骤如下:
1. ActivityThread会创建一个ViewRootImpl对象,并将Activity的Window作为参数传递给它。
2. ViewRootImpl会调用Window的getDecorView方法来获取该Activity的根视图。
3. ViewRootImpl会将根视图添加到自己的视图层级中,并调用Window的setContentView方法将根视图设置为该Activity的内容视图。
4. ViewRootImpl会将自己与Activity的Window进行绑定,以便能够正确地处理触摸事件、绘制等操作。
总之,Android 10中的ActivityThread通过创建ViewRootImpl对象并将Activity的Window与之绑定来实现将ViewRootImpl与Activity的Window关联起来,从而能够正确地处理UI事件和操作。
相关问题
activitythread如何将viewrootimpl 绑定到Activity的Window
在ActivityThread的performLaunchActivity方法中,会创建一个PhoneWindow对象作为Activity的Window对象,并将其设置为Activity的mWindow成员变量。然后,通过调用PhoneWindow的getDecorView方法获取DecorView对象,再通过DecorView的getViewRootImpl方法获取ViewRootImpl对象。最后,将ViewRootImpl对象设置给Activity的mWindow对象的mDecor成员变量,完成ViewRootImpl和Activity的Window的绑定。具体代码如下:
```
Window window = activity.getWindow();
View decorView = window.getDecorView();
ViewRootImpl viewRootImpl = decorView.getViewRootImpl();
window.setWindowControllerCallback(viewRootImpl);
```
其中,window.setWindowControllerCallback方法会将ViewRootImpl对象设置为Window的回调对象,从而实现ViewRootImpl和Activity的Window的绑定。
android.os.BadParcelableException: ClassNotFoundException when unmarshalling: at android.os.Parcel.readParcelableCreator(Parcel.java:3364) at android.os.Parcel.readParcelable(Parcel.java:3272) at android.view.InsetsSourceControl.<init>(InsetsSourceControl.java:71) at android.view.InsetsSourceControl$1.createFromParcel(InsetsSourceControl.java:116) at android.view.InsetsSourceControl$1.createFromParcel(InsetsSourceControl.java:114) at android.os.Parcel.readTypedObject(Parcel.java:3119) at android.os.Parcel.readTypedArray(Parcel.java:3089) at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:1739) at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:7702) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2816) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2133) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8439) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1089) at android.view.Choreographer.doCallbacks(Choreographer.java:907) at android.view.Choreographer.doFrame(Choreographer.java:842) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1074) at android.os.Handler.handleCallback(Handler.java:967) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:243) at android.app.ActivityThread.main(ActivityThread.java:8021) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:591) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1164)
这是一个 Android 应用程序崩溃的错误日志,错误信息为 BadParcelableException,意味着在反序列化过程中,找不到对应的类。具体来说,这个错误发生在读取一个 Parcelable 对象时,系统无法找到该对象的类定义。在这个错误日志中,出现了很多 Android 系统的类,比如 InsetsSourceControl 和 ViewRootImpl 等,但具体哪个 Parcelable 对象出现了问题需要进一步排查。可能的原因包括:对象所在的类没有正确实现 Parcelable 接口,或者对象的类定义在系统中不存在。
阅读全文