网站备案电话没接邢台市政建设集团股份有限公司网站

diannao/2026/1/16 13:22:40/文章来源:
网站备案电话没接,邢台市政建设集团股份有限公司网站,wordpress后台极慢,网络推广的基本方法2.2. IME管理端#xff08;IMMS#xff09;初始化流程 IMMS运行在system server进程中#xff0c;属于系统服务的一部分#xff0c;用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径#xff1a; IMMS运行在system server进程中#xff0c;属于系统服务的…2.2. IME管理端IMMS初始化流程 IMMS运行在system server进程中属于系统服务的一部分用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径 IMMS运行在system server进程中属于系统服务的一部分用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径 frameworks/base/services/java/com/android/server/SystemServer.java frameworks/base/services/core/java/com/android/server/SystemServiceManager.java frameworks/base/core/java/android/os/SystemService.java frameworks/base/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java frameworks/base/packages/SettingsProvider/res/values/defaults.xml 2.2.1. 初始化函数流程梳理 # 我们从systemserver的startOtherServices函数开始梳理 # 此处需要注意因为我梳理的是IMMS而Google还提供了一个MultiClientInputMethodManagerService多客户端输入法服务进程此处不梳理 # PS从InputMethodManagerService代码文件中可以看到Lifecycle是里面的一个内部类继承systemservice SystemServer.java -- startOtherServices然后通过SystemServiceManager的startService启动IMMS传入class nameInputMethodManagerService.Lifecycle.class--- SystemServiceManager.java -- startService有好几个重载的方法说明下1第一个startService方法入参className即InputMethodManagerService.Lifecycle.class将其作为入参调用loadClassFromLoader2loadClassFromLoader会通过反射方法得到具体的Class类返回ClassSystemService类型的服务类即继承SystemService的Lifecycle3调用第二个startService方法入参即serviceClass4先通过SystemService.class.isAssignableFrom(serviceClass)判断该类是否是SysteService的子类5然后通过反射构造类的实例serviceconstructor.newInstance(mContext)即实例化Lifecycle类重点6调用第三个startService方法入参该Lifecycle对象2先将该service添加到mServices列表中然后调用SystemService.java的onStart函数--- InputMethodManagerService.java -- 通过上面的流程看到此处会先调用Lifecycle类的构造函数然后调用onStart函数1构造函数会创建IMMS实例即InputMethodManagerService mServicenew InputMethodManagerService(context)2onStart函数会将该mService通过publishBinderService方法发布到系统服务中以便其他进行可以进行Binder获取到即添加到dev/binder域管理# 主要讲述IMMS对象被创建从构造函数梳理---》 调用构造函数主要用于注册一些监听事件, 获取必须的系统服务, UI相关的组件等 PS SystemService启动输入法服务时会有个判断启动IMMS还是MCIMMS。MULTI_CLIENT_IME_ENABLED即persist.debug.multi_client_ime或ro.sys.multi_client_ime开启启动MultiClientInputMethodManagerService服务否则启动InputMethodManagerService服务关于MultiClientInputMethodManagerService就是多会话输入法支持每屏幕焦点是启用此功能的前提。如果不支持则无法启用此功能。由于安全限制每屏幕焦点限制规定只有一小部分设备支持此功能。详细参考Google官方文档和源码 2.2.2. systemRunning函数流程梳理 # 我们从systemserver的startOtherServices函数开始梳理 # startBootPhase在服务startservice后执行该函数将service分段处理 # 例如此处IMMS在SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE200和SystemService.PHASE_LOCK_SETTINGS_READY480之间 SystemServer.java -- startOtherServices然后通过SystemServiceManager的startBootPhase--- SystemServiceManager.java -- startBootPhase遍历两个分段之间的服务然后调用对应service的onBootPhase--- InputMethodManagerService.java -- 调用Lifecycle类的onBootPhase函数然后调用InputMethodManagerService的systemRunning函数主要内容1MyPackageMonitor内部类register注册监听安装包的变化包含安装卸载更新等2SettingsObserver注册监听当前用户的各种输入法相关的settingprovider变化例如默认输入法输入法列表输入法语言等3getSelectedInputMethod获取用户设置的输入法default_input_method此处是查询settings数据库的默认输入法frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java4buildInputMethodListLocked如果没有默认输入法则入参false该函数内容如下---》 查询输入法服务信息然后将信息储存到mMethodListmMethodMapmMyPackageMonitor中---》 调用chooseNewDefaultIMELocked选择一个新的输入法---》 updateInputMethodsFromSettingsLocked遍历所有输入法如果输入法存在被禁用的组件则重新启用调用setInputMethodLocked方法完成对输入法设置和输入法发生变化的广播ACTION_INPUT_METHOD_CHANGED的发送该函数中调用setInputMethodLocked 一般我们修改默认输入法packages/SettingsProvider/res/values/defaults.xml 数据库配置添加def_input_method和def_enable_input_methods然后frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java对应添加loadStringSetting加载引用DEFAULT_INPUT_METHOD和ENABLED_INPUT_METHODS 2.2.3. 代码详细说明 //SystemServer.java private void startOtherServices(NonNull TimingsTraceAndSlog t) {......// Bring up services needed for UI.if (mFactoryTestMode ! FactoryTest.FACTORY_TEST_LOW_LEVEL) {t.traceBegin(StartInputMethodManagerLifecycle);if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) {mSystemServiceManager.startService(MultiClientInputMethodManagerService.Lifecycle.class);} else {//启动IMMS服务mSystemServiceManager.startService(InputMethodManagerService.Lifecycle.class);}t.traceEnd();......}... }//SystemServiceManager.java//第一个startService函数public SystemService startService(String className) {//调用loadClassFromLoaderfinal ClassSystemService serviceClass loadClassFromLoader(className,this.getClass().getClassLoader());return startService(serviceClass);}private static ClassSystemService loadClassFromLoader(String className,ClassLoader classLoader) {try {//通过反射方法得到具体的Class类返回ClassSystemService类型的服务类即继承SystemService的Lifecyclereturn (ClassSystemService) Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {.......}}//第二个startService函数public T extends SystemService T startService(ClassT serviceClass) {try {final String name serviceClass.getName();Slog.i(TAG, Starting name);Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, StartService name);// 判断该class该类是否是SysteService的子类if (!SystemService.class.isAssignableFrom(serviceClass)) {throw new RuntimeException(Failed to create name : service must extend SystemService.class.getName());}final T service;try {//通过反射构造类的实例即实例化Lifecycle类ConstructorT constructor serviceClass.getConstructor(Context.class);//newInstance实例化service constructor.newInstance(mContext);} catch (InstantiationException ex) {throw new RuntimeException(Failed to create service name : service could not be instantiated, ex);} ............//调用第三个startServicestartService(service);return service;} finally {Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);}}//第三个startService函数public void startService(NonNull final SystemService service) {// Register it.将service注册到mServices列表中mServices.add(service);// Start it.long time SystemClock.elapsedRealtime();try {//调用该service的onStart函数service.onStart();} catch (RuntimeException ex) {throw new RuntimeException(Failed to start service service.getClass().getName() : onStart threw an exception, ex);}warnIfTooLong(SystemClock.elapsedRealtime() - time, service, onStart);}//InputMethodManagerService.javapublic static final class Lifecycle extends SystemService {private InputMethodManagerService mService;//实例化时调用构造函数public Lifecycle(Context context) {super(context);//创建InputMethodManagerService IMMS对象然后调用IMMS构造函数mService new InputMethodManagerService(context);}//在startService中调用到此处Overridepublic void onStart() {//将IMMS service添加到LocalServicesLocalServices.addService(InputMethodManagerInternal.class,new LocalServiceImpl(mService));//发布到系统服务中以便其他进行可以进行Binder获取到即添加到dev/binder域管理publishBinderService(Context.INPUT_METHOD_SERVICE, mService, false /*allowIsolated*/,DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);}.......}public class InputMethodManagerService extends IInputMethodManager.Stubimplements ServiceConnection, Handler.Callback {....//IMMS构造函数public InputMethodManagerService(Context context) {mIPackageManager AppGlobals.getPackageManager();mContext context;mRes context.getResources();mHandler new Handler(this);// Note: SettingsObserver doesnt register observers in its constructor.// SettingsObserver类型用于监听来自设置的输入法配置, 比如默认输入法, 启用的输入法, 选择的输入法等mSettingsObserver new SettingsObserver(mHandler);mIWindowManager IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE));mWindowManagerInternal LocalServices.getService(WindowManagerInternal.class);mPackageManagerInternal LocalServices.getService(PackageManagerInternal.class);mInputManagerInternal LocalServices.getService(InputManagerInternal.class);mImeDisplayValidator displayId - mWindowManagerInternal.getDisplayImePolicy(displayId);.....// 状态栏输入法图标名称, 会根据这个名称设置输入法的图标显示mSlotIme mContext.getString(com.android.internal.R.string.status_bar_ime);mIsLowRam ActivityManager.isLowRamDeviceStatic();// 切换输入法时的通知Bundle extras new Bundle();extras.putBoolean(Notification.EXTRA_ALLOW_DURING_SETUP, true);.....//获取UIDint userId 0;try {userId ActivityManager.getService().getCurrentUser().id;} catch (RemoteException e) {Slog.w(TAG, Couldnt get current user ID; guessing its 0, e);}// 最近切换的UIDmLastSwitchUserId userId;//应在buildInputMethodListLocked之前创建mSettings//类型InputMethodSettings输入法设置对象mSettings new InputMethodSettings(mRes, context.getContentResolver(), mMethodMap, userId, !mSystemReady);updateCurrentProfileIds();AdditionalSubtypeUtils.load(mAdditionalSubtypeMap, userId);mSwitchingController InputMethodSubtypeSwitchingController.createInstanceLocked(mSettings, context);mMenuController new InputMethodMenuController(this);}......} IMMS.java中几个重要的变量 String mCurMethodId系统当前默认的输入法id, 可能为空, 与Settings.Secure#DEFAULT_INPUT_METHOD值保持一致在setInputMethodLocked中赋值String mCurId当前已经绑定的输入法id, 如果没有输入法绑定上的话, 值为nullClientState mCurClient用于当前激活的IME, 只有持有这个令牌的IME才被系统认可IInputMethod mCurMethod当前已经绑定的输入法接口, 如果为null, 说明没有任何输入法连接上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页模板下载网站本地建设网站软件

我看着工资单上每一个开发团队成员的薪水,慢慢地我不能保持淡定了。 而当我看到我的工资排名是倒数的时候——靠近最后一名——我不由得倒抽一口冷气。就像圣诞故事中的那个可爱的小男孩Ralphie ,想买气枪却被忽悠会有危险一样,我也不断忽悠…

找人建设网站辽宁省住建厅官网

list容器概念 list是一个双向链表容器,可高效地进行插入删除元素。 List 特点: list不可以随机存取元素,所以不支持at.(position)函数与[]操作符。可以对其迭代器执行,但是不能这样操作迭代器:it3使用时包含 #includ…

江苏国龙翔建设网站.企业网络解决方案

为什么80%的码农都做不了架构师?>>> 一、授权认证 1、请求用户授权Token URL: https://api.weibo.com/oauth2/authorize HTTP请求方式:GET/POST 请求参数 必选 类型及范围 说明 client_id true string 申请应用时分配的AppKey。 redire…

网站设计公司哪家比较好佛山定制网站建设

Redis雪崩问题通常发生在大量缓存同时过期,导致所有请求直接打到数据库上,从而可能压垮数据库。解决这一问题的关键在于分散缓存失效时间,避免集中失效。此外,还可以通过限流、降级、预热等策略来进一步缓解压力。 下面是一个综合…

运城市做网站公司wordpress随机弹窗插件

问题: POST http://127.0.0.1:6000/api/login net::ERR_UNSAFE_PORT 原因: 这个错误表明你在尝试使用一个被认为是不安全的端口进行网络请求。通常情况下,浏览器会限制使用一些特定的端口,因为它们被认为是潜在的安全风险。 在这种情况下&a…

东钱湖镇建设局网站网络建设公司排名

之前有写过用kali开启web服务方法,这次写个用cendos7开启服务的步骤! 1、安装httpd yum install -y httpd 若显示安装失败,报错原因为找不到httpd的安装包,可参考这篇文件更新yum源:CentOS 7更换yum源|详细步骤-CSDN…

唐山网站建设|唐山网站制作|公司建站666起|唐山红城网络网站首页的作用

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

做棋牌网站建设哪家好写小说赚钱的网站

先看一下拖拽相关的事件:dragover、dragenter drop和dragleave 。 dragover事件:当被拖动的元素在一个可放置目标上方时,该事件会被触发。 通常,我们会使用event.preventDefault()方法来取消浏览器默认的拖放行为,以便…

做网站要要多少钱广西网络营销外包公司

亚利桑那州立大学(简称“ASU”)在官网宣布与OpenAI达成技术合作。从2024年2月份开始,为所有学生提供ChatGPT企业版访问权限,主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品,AS…

注册个网站要多少钱wordpress浮动导航菜单

Python标准模块--logging参考http://www.cnblogs.com/zhbzz2007/p/5943685.html1 logging模块简介logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备…

网站备案法律百度网址提交入口平台

阿里HR面试核心的几个问题: 1、你为什么离职? 2、你怎么看待自己的职业生涯?(包括怎么平衡家庭和工作的关系、加班、选择一家公司时的考量、location等) 3、薪资期望 4、项目中遇到的最大挑战是什么?怎么…

做外贸网站怎么访问外国网站站长工具是什么意思

有这样一句名言:要吃掉一头大象,每次吃一口。—— 克雷顿艾布拉姆斯(Creighton Abrams)这句名言给我们的启示就是:看起来非常艰巨的任务,不能一蹴而就,需要进行任务分解,一步一步把它…

中国建设局网站查询建设银行保定分行网站

9.1 模板方法模式概述 模板方法模式是一种行为设计模式,它使用一个抽象的基类定义了一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法模式允许子类在不改变算法结构的情况下重新定义算法中的某些步骤。 9.2 代码示例 在Python中使用…

优化一个网站需要多少钱合肥网站建设哪家好价格

使用在 DateTimeFormatInfo 的属性中存储的标准或自定义模式设置 DateTime 值的格式。 可以通过设置可写 DateTimeFormatInfo 的关联属性用自定义模式替代标准模式。若要确定 DateTimeFormatInfo 是否是可写的,请使用 IsReadOnly 属性。 下表列出了每一种标准模式的…

网站上传图片问题江苏建设工程造价管理网站

Mysql的大体结构 客户端:用于链接mysql的软件 连接池: sql接口: 查询解析器: MySQL连接层 连接层: 应用程序通过接口(如odbc,jdbc)来连接mysql,最先连接处理的是连接层。 连接层…

0基础学做网站关于建设设计院公司网站的建议

转载自 史上最全 50 道 Redis 面试题 1、什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存…

中国建设工程招标网官方网站学校网站开发研究的意义和目的

vue创建项目(npm安装→初始化项目) 第一步npm安装 首先:先从nodejs.org中下载nodejs 图1 双击安装,在安装界面一直Next 图2 图3 图4 直到Finish完成安装。 打开控制命令行程序(CMD),检查是否正常 图5 …

网站建设制作过程网站 功能呢

目录 1. 目录结构 2. 代码实现 2.1 安装Express 2.2 app.js - 主文件 2.3 globalMiddleware.js - 全局中间件 3. 程序运行结果 4. 总结 在Node.js的Express框架中,全局生效的中间件是指应用程序启动后,对所有请求都有效的中间件。它通常用于日志记…

个人网站做音乐网要备文化罗湖做网站公司排名

目录 🎈了解题意 🎈算法原理 🚩先处理第一行和最后一行 🚩再处理中间行 🎈实现代码 🎈了解题意 大家看到这个题目的时候肯定是很迷茫的,包括我自己也是搞不清楚题目什么意思,我…

网站开发培训什么本地linux做网站

以下来自一位程序员母亲和工作人员的对话。程序员妈妈:您好,可以帮我推荐一本适合我家小孩看的编程书籍吗?兔子:可以的呀,《Scratch从入门到精通》,这本书适合小孩学习,您可以先看一下哦~程序员…