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. C语言函数以及函数的使用
  2. android intent.setType指定浏览本地多种类型的文件
  3. Android 通过继承TextView类自定义字体默认颜色
  4. 自己定义的Tabhost
  5. android 自定义对话框 背景透明
  6. 修改文件夹权限
  7. Android——文件操作
  8. Android下使用Properties文件保存程序设置
  9. android解析xml文件 Android DOM解析XML之全球实时地震信息列表

随机推荐

  1. 混淆打包的Proguard returned with error
  2. Android中Matrix介绍
  3. Android Video Player. 安卓视频播放器,封
  4. Android与JavaSE游戏引擎LGame-0.3.1版正
  5. 体验Android
  6. Android Launcher7.0首次数据加载逻辑
  7. android ArrayList和数组之间的转换
  8. StrictMode总结
  9. dl-ssl.google.com
  10. android面试题