Step 7. LocalWindowManager.removeViewImmediate

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

  1. public abstract class Window {
  2. ......
  3. private class LocalWindowManager implements WindowManager {
  4. ......
  5. public final void removeViewImmediate(View view) {
  6. mWindowManager.removeViewImmediate(view);
  7. }
  8. ......
  9. private final WindowManager mWindowManager;
  10. }
  11. ......
  12. }

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

Step 8. WndowManagerImpl.removeViewImmediate

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

  1. public class WindowManagerImpl implements WindowManager {
  2. ......
  3. public void removeViewImmediate(View view) {
  4. synchronized (this) {
  5. int index = findViewLocked(view, true);
  6. ViewRoot root = 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. public final class ViewRoot extends Handler implements ViewParent,
  2. View.AttachInfo.Callbacks {
  3. ......
  4. public void die(boolean immediate) {
  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. public final class ViewRoot extends Handler implements ViewParent,
  2. View.AttachInfo.Callbacks {
  3. ......
  4. void doDie() {
  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. public final class ViewRoot extends Handler implements ViewParent,
  2. View.AttachInfo.Callbacks {
  3. ......
  4. void dispatchDetachedFromWindow() {
  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 (RemoteException e) {
  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. public final class InputQueue {
  2. ......
  3. public static void unregisterInputChannel(InputChannel inputChannel) {
  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. static void android_view_InputQueue_nativeUnregisterInputChannel(JNIEnv* env, jclass clazz,
  2. jobject inputChannelObj) {
  3. status_t status = gNativeInputQueue.unregisterInputChannel(env, inputChannelObj);
  4. ......
  5. }

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

Android应用程序键盘(Keyboard)消息处理机制分析(26)相关推荐

  1. Android系统中的Binder通信机制分析(7)- Java 层的 Binder 机制

    声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6.7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾- 文中参考 ...

  2. Android应用程序键盘(Keyboard)消息处理机制分析(3)

    Step 15. Looper.pollOnce 这个函数定义在frameworks/base/libs/utils/Looper.cpp文件中,具体可以参考前面Android应用程序消息处理机制(L ...

  3. Android应用程序键盘(Keyboard)消息处理机制分析(12)

    Step 12. InputChannel.openInputChannelPair 这个函数定义在frameworks/base/core/java/android/view/InputChanne ...

  4. Android应用程序线程消息循环模型分析(5)

      从AsyncTask的实现可以看出,当我们第一次创建一个AsyncTask对象时,首先会执行下面静态初始化代码创建一个线程池sExecutor: private static final Bloc ...

  5. Android应用程序线程消息循环模型分析

    出自:http://blog.csdn.net/luoshengyang/article/details/6905587 我们知道,Android应用程序是通过消息来驱动的,即在应用程序的主线程(UI ...

  6. 以下未发布-Android的多线程以及异步消息处理机制,android移动开发基础案例教程源码

    1.Message: Message 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间进行数据交换.除了 what 字段,还可以使用 arg1 和 arg2 来携带整型数据,使用 ...

  7. Android应用程序键盘(Keyboard)消息处理机制分析(20)

    Step 24. InputQueue.dispatchKeyEvent 这个函数定义在frameworks/base/core/java/android/view/InputQueue.java文件 ...

  8. Android应用程序键盘(Keyboard)消息处理机制分析(17)

    Step 11. InputDispatcher.dispatchOnceInnerLocked 这个函数定义在frameworks/base/libs/ui/InputDispatcher.cpp文 ...

  9. Android应用程序键盘(Keyboard)消息处理机制分析(14)

    3. InputManager分发键盘消息给应用程序的过程分析 在分析InputManager分发键盘消息给应用程序的过程之前,我们先假设现在没有键盘事件发生,因此,InputManager中的Inp ...

最新文章

  1. PYTHON * 和**的用法
  2. php 链接excel表格数据,php 怎么把数据导出到excel表格?php 连接 excel表格数据库数据...
  3. 开年趣图汇总:对不起,让你笑了这么久
  4. getline没有与参数列表匹配的重载函数_C++新增基础功能解析—函数重载功能的使用...
  5. PHP XML操作类 xml2array -- 含节点属性
  6. Spring+Quartz实现定时任务的配置步骤
  7. Centos7上openVP的另一种使用方式,实现访问控制!
  8. python怎么把excel单元格里面的文字提取出来_干货 | Excel如何花式秀操作?
  9. php是属于什么软件,.php是什么软件?
  10. 网络安全-SQL注入原理、攻击及防御
  11. 利用Get-FileHash工具进行哈希验证
  12. 互联网产品用户体验设计方法和用户体验优化方法
  13. “降维打击”到底什么意思?
  14. Softing过程自动化解决方案——助力数字化工业
  15. 年薪40W的程序员,需要有哪些技能傍身?
  16. USACO Palindromic Squares 回文平方数
  17. ubuntu wifi 设备未托管 网络设备不兼容 网络慢
  18. 硬盘分区那点事儿(MBR和GPT)
  19. Collection集合
  20. 原生js遍历 json数组对象

热门文章

  1. Jenkins + Pipeline 构建流水线发布
  2. 转:深度学习与自然语言处理之五:从RNN到LSTM
  3. Response.ContentType 详细列表
  4. Android Context.bindService 返回 false 问题
  5. vue中render: h = h(App)的详细解释
  6. vue路由跳转 返回上一级 this.$router.go(-1) 和返回到指定页面this.$router.push('/home')...
  7. 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
  8. mongo笔记 // 一字一句的写下来,工作点滴片段
  9. 模块讲解----shutil模块(copy、压缩、解压)
  10. C++ smart pointer