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

简介:

      Step 19. InputManager.unregisterInputChannel

        这个函数定义在frameworks/base/services/java/com/android/server/InputManager.java文件中:

  1. public class InputManager {  
  2.     ......  
  3.   
  4.     public void unregisterInputChannel(InputChannel inputChannel) {  
  5.         ......  
  6.   
  7.         nativeUnregisterInputChannel(inputChannel);  
  8.     }  
  9.   
  10.     ......  
  11. }  

         这个函数很简单,它调用本地方法nativeUnregisterInputChannel来进一步处理。

 

         Step 20. InputManager.nativeUnregisterInputChannel

         这个函数定义在frameworks/base/services/jni/com_android_server_InputManager.cpp文件中:

  1. static void android_server_InputManager_nativeUnregisterInputChannel(JNIEnv* env, jclass clazz,  
  2.         jobject inputChannelObj) {  
  3.     ......  
  4.   
  5.   
  6.     sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env,  
  7.                         inputChannelObj);  
  8.     ......  
  9.   
  10.   
  11.     status_t status = gNativeInputManager->unregisterInputChannel(env, inputChannel);  
  12.   
  13.     ......  
  14. }  

        这个函数首先调用android_view_InputChannel_getInputChannel函数根据Java层的InputChannel对象找到C++层的InputChannel对象,然后调用NativeInputManager的unregisterInputChannel函数来执行注销的操作。

 

        Step 21. NativeInputManager.unregisterInputChannel
        这个函数定义在frameworks/base/services/jni/com_android_server_InputManager.cpp文件中:

  1. status_t NativeInputManager::unregisterInputChannel(JNIEnv* env,  
  2.         const sp<InputChannel>& inputChannel) {  
  3.     ......  
  4.   
  5.     return mInputManager->getDispatcher()->unregisterInputChannel(inputChannel);  
  6. }  

       这个函数与前面分析应用程序注册键盘消息通道的Step 17(NativeInputManager.registerInputChannel)相对应,主要是调用InputDispatcher对象的unregisterInputChannel函数来执行真正注销的操作。

 

       Step 22. InputDispatcher.unregisterInputChannel
       这个函数定义在frameworks/base/libs/ui/InputDispatcher.cpp文件中:

  1. status_t InputDispatcher::unregisterInputChannel(const sp<InputChannel>& inputChannel) {  
  2.     ......  
  3.   
  4.     { // acquire lock  
  5.         AutoMutex _l(mLock);  
  6.   
  7.         ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);  
  8.         ......  
  9.   
  10.         sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);  
  11.         mConnectionsByReceiveFd.removeItemsAt(connectionIndex);  
  12.   
  13.         ......  
  14.   
  15.         mLooper->removeFd(inputChannel->getReceivePipeFd());  
  16.   
  17.         .....  
  18.   
  19.     } // release lock  
  20.   
  21.     ......  
  22.   
  23.     return OK;  
  24. }  

        这一步与前面的Step 14注销应用程序一侧的Client端InputChannel是差不多的,只不过这里是从InputDispatcher中把Server端的InputChannel注销掉。首先是根据传进来的参数inputChannel找到它在InputDispatcher中对应的Connection对象在mConnectionsByReceiveFd中的索引,然后把它从mConnectionsByReceiveFd中删除:

  1. ssize_t connectionIndex = getConnectionIndexLocked(inputChannel);  
  2.     ......  
  3.   
  4. sp<Connection> connection = mConnectionsByReceiveFd.valueAt(connectionIndex);  
  5. mConnectionsByReceiveFd.removeItemsAt(connectionIndex);  

        最后,还需要把这个InputChannel中的反向管道读端文件描述符从InputDispatcher的内部对象mLooper中删除,因为这个文件描述符是在前面注册Server端的InputChannel时加入到mLooper对象去的,具体可以参考上面分析应用程序注册键盘消息接收通道的过程中的Step 18(InputDispatcher.registerInputChannel)。

 

        这样, 应用程序注销键盘消息接收通道的过程就分析完成了,整个应用程序键盘消息处理机制也分析完成了,这是一个比较复杂的过程,要完全理解它还需要花费一些努力和时间,不过,理解了这个过程之后,对Android应用程序框架层的理解就更进一步了。





本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966659,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
21 1
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
36 4
|
3月前
|
监控 Android开发 C语言
深度解读Android崩溃日志案例分析2:tombstone日志
深度解读Android崩溃日志案例分析2:tombstone日志
86 0
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
3月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
42 1
|
3天前
|
存储 Java Android开发
Android系统 设置第三方应用为默认Launcher实现和原理分析
Android系统 设置第三方应用为默认Launcher实现和原理分析
18 0
|
3天前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
25 0
|
2月前
|
网络协议 算法 Android开发
安卓逆向 -- 实战某峰窝APP(动态分析)
安卓逆向 -- 实战某峰窝APP(动态分析)
32 4
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
3月前
|
安全 算法 JavaScript
安卓逆向 -- 关键代码定位与分析技术
安卓逆向 -- 关键代码定位与分析技术
42 0