当前位置: 首页 > wzjs >正文

如何做网站产品经理抚州 提供网站建站 公司

如何做网站产品经理,抚州 提供网站建站 公司,湖南省建设厅厅长鹿山,企业邮箱和个人邮箱的区别概述: 本文讲述Android Input输入框架中 InputChannel的功能。从前面的讲述,我们知道input系统服务最终将输入事件写入了InputChannel,而input属于system_server进程,App属于另外一个进程,当Input系统服务想要把事件传递给App进行…

概述:

本文讲述Android Input输入框架中 InputChannel的功能。从前面的讲述,我们知道input系统服务最终将输入事件写入了InputChannel,而input属于system_server进程,App属于另外一个进程,当Input系统服务想要把事件传递给App进行处理时这里就涉及到了一个跨进程通信的问题。Android系统中常用的就是通过Binder实现进程间通信,但是Binder属于CS架构,单一的连接不能实现Client和Server的双向通信,如果我们想要实现进程间的双向通信,则必须建立两个Binder通道。Android系统有多个App 这样则每个App都需要两个Binder通信通道才能完成Input系统进行通信。这显然不是很好的选择, 所以Android系统的Input框架选择了传统Linux的Unix域通信机制,也就是我们本章讲述的InputChannel实现原理。

本文涉及的源码路径

frameworks/native/libs/input/InputTransport.cpp

frameworks/base/core/java/android/view/InputChannel.java

frameworks/base/core/jni/android_view_InputChannel.cpp

InputChannel类

public final class InputChannel implements Parcelable {private static final String TAG = "InputChannel";......@SuppressWarnings("unused")private long mPtr; // used by native codeprivate static native InputChannel[] nativeOpenInputChannelPair(String name);    private native void nativeDispose(boolean finalized);private native void nativeTransferTo(InputChannel other);private native void nativeReadFromParcel(Parcel parcel);private native void nativeWriteToParcel(Parcel parcel);private native void nativeDup(InputChannel target);private native String nativeGetName();......public InputChannel() {}@Overrideprotected void finalize() throws Throwable {try {nativeDispose(true);} finally {super.finalize();}}......public static InputChannel[] openInputChannelPair(String name) {if (name == null) {throw new IllegalArgumentException("name must not be null");}if (DEBUG) {Slog.d(TAG, "Opening input channel pair '" + name + "'");}return nativeOpenInputChannelPair(name);}public String getName() {String name = nativeGetName();return name != null ? name : "uninitialized";}......public void dispose() {nativeDispose(false);}......public void transferTo(InputChannel outParameter) {if (outParameter == null) {throw new IllegalArgumentException("outParameter must not be null");}nativeTransferTo(outParameter);}......
}

1、从java层的InputChannel类可以看出,该类的核心实现都是由native jni层完成的。因此接下来我们主要从Native层讲述InputChannel的实现原理;

2、mPtr 保存native层对应的对象地址;

3、可序列化,InputChannel对象可以跨组件传递;

InputChannel 方法

由于我们本系列的博客讲述Android Input输入管理框架,下面的讲述中,只讲述设计到Input输入管理的关键方法实现。

1、openInputChannelPair

openInputChannelPair的实现如下所示:

 public static InputChannel[] openInputChannelPair(String name) {......return nativeOpenInputChannelPair(name);}

该方法本质上直接调用了jni方法nativeOpenInputChannelPair,如下所示:

static jobjectArray android_view_InputChannel_nativeOpenInputChannelPair(JNIEnv* env,jclass clazz, jstring nameObj) {......sp<InputChannel> serverChannel;sp<InputChannel> clientChannel;status_t result = InputChannel::openInputChannelPair(name, serverChannel, clientChannel);......// 创建两个InputChannel 空java对象jobjectArray channelPair = env->NewObjectArray(2, gInputChannelClassInfo.clazz, NULL);if (env->ExceptionCheck()) {return NULL;}jobject serverChannelObj = android_view_InputChannel_createInputChannel(env,new NativeInputChannel(serverChannel));if (env->ExceptionCheck()) {return NULL;}jobject clientChannelObj = android_view_InputChannel_createInputChannel(env,new NativeInputChannel(clientChannel));if (env->ExceptionCheck()) {return NULL;}// 初始化数组对象env->SetObjectArrayElement(channelPair, 0, serverChannelObj);env->SetObjectArrayElement(channelPair, 1, clientChannelObj);// 返回创建的2个java层对象return channelPair;
}

nativeOpenInputChannelPair方法主要完成如下的逻辑:

1、创建一个网络socket对套接字,分别由serverChannel和clientChannel进行管理,这部分源码不再展开详细讲解;

2、创建java层的InputChannel两个数组对象;

3、创建serverChannel和clientChannel InputChannel 对象,并分别设置server和client的native层的对象地址;

4、初始化第2步创建的java数组对象,然后将该数组对象返回java空间;

2、transferTo

transferTo的方法实现如下所示:

public void transferTo(InputChannel outParameter) {......nativeTransferTo(outParameter);}

改方法直接调用了nativeTransferTo,如下所示:

/*** 将自己的native C++对象绑定给otherObj的native C++上,然后清空自己的native对象*/
static void android_view_InputChannel_nativeTransferTo(JNIEnv* env, jobject obj,jobject otherObj) {if (android_view_InputChannel_getNativeInputChannel(env, otherObj) != NULL) {jniThrowException(env, "java/lang/IllegalStateException","Other object already has a native input channel.");return;}// 获的调用对象的native对象地址NativeInputChannel* nativeInputChannel =android_view_InputChannel_getNativeInputChannel(env, obj);// 将otherObj对象的native地址设置为调用对象的nativeInputChannelandroid_view_InputChannel_setNativeInputChannel(env, otherObj, nativeInputChannel);// 清空调用对象的native对象地址android_view_InputChannel_setNativeInputChannel(env, obj, NULL);
}

nativeTransferTo的实现逻辑细节,我们不再展开描述,该方法的主要功能就是将otherObj 对象的native层的C++地址替换为调用该方法的InputChannel对象的native层的地址;

3、dispose

dispose的实现方法,如下所示:

 public void dispose() {nativeDispose(false);}

该方法也是直接调用native方法,如下所示:

static void android_view_InputChannel_nativeDispose(JNIEnv* env, jobject obj, jboolean finalized) {NativeInputChannel* nativeInputChannel =android_view_InputChannel_getNativeInputChannel(env, obj);if (nativeInputChannel) {if (finalized) {ALOGW("Input channel object '%s' was finalized without being disposed!",nativeInputChannel->getInputChannel()->getName().string());}nativeInputChannel->invokeAndRemoveDisposeCallback(env, obj);android_view_InputChannel_setNativeInputChannel(env, obj, NULL);// 删除C++对象delete nativeInputChannel;}
}

该方法的实现细节,我们不再展开描述,它的主要功能就是释放native层的InputChannel对象。

总结

本文为Android Input框架中App和Input 服务进行通信的桥梁InputChannel,本质上就是就是对linux中unix域 Socket进程间通信的封装,Framework层调用java层的InputChannel方法,而该方法的核心实现都处于native层。下一篇讲述App如何使用InputChannel与input系统服务建立链接。


文章转载自:

http://NaqVy9Pr.hwcgg.cn
http://byBsXEYO.hwcgg.cn
http://5MasdjWB.hwcgg.cn
http://dEhRoVwI.hwcgg.cn
http://25G3Ha32.hwcgg.cn
http://AsIo9xOj.hwcgg.cn
http://8xOleEED.hwcgg.cn
http://vCzVeSRE.hwcgg.cn
http://DudNCF06.hwcgg.cn
http://J3PIrlqp.hwcgg.cn
http://86jp04tp.hwcgg.cn
http://YXq0niMc.hwcgg.cn
http://wMVBAdPP.hwcgg.cn
http://BxjNibna.hwcgg.cn
http://hRmmmGF4.hwcgg.cn
http://8K1XTH1U.hwcgg.cn
http://FoQnoO55.hwcgg.cn
http://jxDB9G8a.hwcgg.cn
http://XV87G4Iu.hwcgg.cn
http://F6TEJBV8.hwcgg.cn
http://nKuZm1Op.hwcgg.cn
http://tEl226vV.hwcgg.cn
http://zKA19IWO.hwcgg.cn
http://ahnGlNmq.hwcgg.cn
http://utNQThqk.hwcgg.cn
http://b5zIIcam.hwcgg.cn
http://ofFfERC3.hwcgg.cn
http://RrLoI0vR.hwcgg.cn
http://tdkCzknK.hwcgg.cn
http://KBTCi9kx.hwcgg.cn
http://www.dtcms.com/wzjs/639356.html

相关文章:

  • 族谱网站建设方案制作相册
  • 做plc课程设计的网站怎么自建导购网站做淘客
  • 触屏版网站模板低代码前端开发平台
  • 高端网站登录入口海门网页定制
  • 长沙城通基础管网建设有限公司怎么让客户做网站优化
  • 专业外贸制作网站网站备案信息查询接口
  • 网泰网站建设网络推广海南论坛论坛网站建设
  • 制作网站多少钱一个外贸网站建设哪里实惠
  • 烟台高端网站建设公司沈阳网站建设模块维护
  • 方案模板网站与客户沟通网站建设的技巧
  • 有做义工的相亲网站吗鹰潭建设网站
  • 百度网站建设及推广易做文学网站的logo
  • seo网站怎么做网站建设制作优帮云
  • 怎么形容网站做的很好旅游网站建设ppt模板
  • 智慧团建app北京seo服务商
  • 做网站手机版百度的网址是多少
  • 不用开源程序怎么做网站微信营销工具有哪些
  • 淘宝这种网站怎么做的衡阳关键词优化首选
  • c 做网站用什么框架店面设计师是什么
  • 禁止粘贴的网站个人网站域名取名
  • 宁波免费做网站企业网站框架
  • 软件开发职业学校百度关键词seo推广
  • 手机访问wordpress网站卡网页图片大全
  • 网站信息抽查评估网站上传服务器后台上传资料出错
  • 百度免费网站如何建设网站建设策划方案模板
  • 内蒙能源建设集团网站外贸网站有哪些?
  • 电商的网站怎么做的镇网站制作价格
  • 织梦做旅游网站asp.net 4.0网站开发与项目实战
  • 国外的建筑设计案例网站网络推广团队分工
  • 昆明优化广告公司搜索引擎优化seo培训