Step 7.LocalWindowManager.removeViewImmediate

这个函数定义在frameworks/base/core/java/android/view/Window.java文件中:

  1. publicabstractclassWindow{
  2. ......
  3. privateclassLocalWindowManagerimplementsWindowManager{
  4. ......
  5. publicfinalvoidremoveViewImmediate(Viewview){
  6. mWindowManager.removeViewImmediate(view);
  7. }
  8. ......
  9. privatefinalWindowManagermWindowManager;
  10. }
  11. ......
  12. }

LocalWindowManager类的成员变量mWindowManager是一个WndowManagerImpl对象,这个函数只是简单地调用WndowManagerImpl类的removeViewImmediate来进一步处理。

Step 8.WndowManagerImpl.removeViewImmediate

这个函数定义在frameworks/base/core/java/android/view/WindowManagerImpl.java文件中:

  1. publicclassWindowManagerImplimplementsWindowManager{
  2. ......
  3. publicvoidremoveViewImmediate(Viewview){
  4. synchronized(this){
  5. intindex=findViewLocked(view,true);
  6. ViewRootroot=mRoots[index];
  7. ......
  8. root.die(true);
  9. ......
  10. }
  11. }
  12. ......
  13. }

这个函数首先是找到这个view所属的ViewRoot对象root,然后调用这个root对象的die函数来销毁它。

Step 9. ViewRoot.die

这个函数定义在frameworks/base/core/java/android/view/ViewRoot.java文件中:

  1. publicfinalclassViewRootextendsHandlerimplementsViewParent,
  2. View.AttachInfo.Callbacks{
  3. ......
  4. publicvoiddie(booleanimmediate){
  5. if(immediate){
  6. doDie();
  7. }else{
  8. ......
  9. }
  10. }
  11. ......
  12. }

上面Step 8传进来的immediate参数为true,因此,这里直接调用doDie函数来进一步处理。

Step 10.ViewRoot.doDie

这个函数定义在frameworks/base/core/java/android/view/ViewRoot.java文件中:

  1. publicfinalclassViewRootextendsHandlerimplementsViewParent,
  2. View.AttachInfo.Callbacks{
  3. ......
  4. voiddoDie(){
  5. ......
  6. synchronized(this){
  7. ......
  8. if(mAdded){
  9. mAdded=false;
  10. dispatchDetachedFromWindow();
  11. }
  12. }
  13. }
  14. ......
  15. }

当我们把Activity窗口中的View添加到一个ViewRoot对象时,就会把它的成员变量mAdded设置为true,这样就表示这个ViewRoot中有View存在,于是,这里就会调用dispatchDetachedFromWindow函数来进一步处理。

Step 11.ViewRoot.ispatchDetachedFromWindow

这个函数定义在frameworks/base/core/java/android/view/ViewRoot.java文件中:

  1. publicfinalclassViewRootextendsHandlerimplementsViewParent,
  2. View.AttachInfo.Callbacks{
  3. ......
  4. voiddispatchDetachedFromWindow(){
  5. ......
  6. if(mInputChannel!=null){
  7. if(mInputQueueCallback!=null){
  8. ......
  9. }else{
  10. InputQueue.unregisterInputChannel(mInputChannel);
  11. }
  12. }
  13. try{
  14. sWindowSession.remove(mWindow);
  15. }catch(RemoteExceptione){
  16. }
  17. ......
  18. }
  19. ......
  20. }

前面在介绍应用程序注册键盘消息接收通道的过程时,在Step 18,我们说到,ViewRoot类中的mInputQueueCallback为null,表示由这个ViewRoot自己来管理键盘输入事件,因此,这里首先会调用InputQueue的unregisterInputChannel函数来注销注册在应用程序这一侧的Client端InputChannel,然后再调用sWindowSession的remove函数来注销注册在InputManager这一侧的Server端InputChannel,这个逻辑是和前面介绍应用程序注册键盘消息接收通道的逻辑相对应的,前面分别注册了这两个InputChannel,现在Activity要销毁了,当然就要把它们注销了。

我们先来看注销注册在应用程序这一侧的Client端InputChannel,然后再回过头来分析注销注册在InputManager这一侧的Server端InputChannel。

Step 12.InputQueue.unregisterInputChannel

这个函数定义在frameworks/base/core/java/android/view/InputQueue.java文件中:

  1. publicfinalclassInputQueue{
  2. ......
  3. publicstaticvoidunregisterInputChannel(InputChannelinputChannel){
  4. ......
  5. synchronized(sLock){
  6. ......
  7. nativeUnregisterInputChannel(inputChannel);
  8. }
  9. }
  10. ......
  11. }

这个函数只是简单地调用本地方法nativeUnregisterInputChannel来执行具体的操作。

Step 13.InputQueue.nativeUnregisterInputChannel
这个函数定义在frameworks/base/core/jni/android_view_InputQueue.cpp文件中:

  1. staticvoidandroid_view_InputQueue_nativeUnregisterInputChannel(JNIEnv*env,jclassclazz,
  2. jobjectinputChannelObj){
  3. status_tstatus=gNativeInputQueue.unregisterInputChannel(env,inputChannelObj);
  4. ......
  5. }

这里调用NativeInputQueue的成员函数unregisterInputChannel来进一步处理。

更多相关文章

  1. 【翻译】(8-补丁1)Android接口定义语言(AIDL)
  2. 【Fragment】 Android(安卓)Fragment生命周期详解(图文)
  3. android之wifi体系架构源码流程分析
  4. android通过程序收起通知栏
  5. Android(安卓)通过继承TextView类自定义字体默认颜色
  6. Android(安卓)ListView(Selector 背景图片 全选 Checkbox等按钮)
  7. Android(安卓)获取设备各种信息以及其它
  8. view measure详解
  9. 自己定义的Tabhost

随机推荐

  1. 【Android开发】高级组件-进度条
  2. 利用Android属性动画实现Banner的原理与
  3. Android2.0游戏开发实战宝典下载
  4. Flutter Android端启动白屏问题的解决
  5. Android(安卓)自定义View(二)仿滴滴大头针
  6. Android-UI屏幕适配全攻略
  7. H5唤起android app,启动关联应用
  8. Android(安卓)RecyclerView 的 网格布局
  9. 微信支付宝支付调用SDK
  10. 也谈Android下一个apk安装多个程序入口图