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

做网站用什么软件知乎门户网站怎么做

做网站用什么软件知乎,门户网站怎么做,如何看网站的关键词,wordpress数据库被挂马2.2. IME管理端(IMMS)初始化流程 IMMS运行在system server进程中,属于系统服务的一部分,用于控制输入法的显示/隐藏、切换、绑定等操作。 涉及代码文件路径: IMMS运行在system server进程中,属于系统服务的…

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 name:"InputMethodManagerService.Lifecycle.class"---> SystemServiceManager.java -- startService有好几个重载的方法,说明下:(1)第一个startService方法,入参className即"InputMethodManagerService.Lifecycle.class",将其作为入参调用loadClassFromLoader(2)loadClassFromLoader会通过反射方法得到具体的Class类,返回Class<SystemService>类型的服务类,即继承SystemService的Lifecycle(3)调用第二个startService方法,入参即serviceClass(4)先通过"SystemService.class.isAssignableFrom(serviceClass)"判断该类是否是SysteService的子类(5)然后通过反射构造类的实例"service=constructor.newInstance(mContext)",即实例化Lifecycle类(重点)(6)调用第三个startService方法,入参该Lifecycle对象(2)先将该service添加到mServices列表中,然后调用SystemService.java的onStart函数---> InputMethodManagerService.java -- 通过上面的流程看到,此处会先调用Lifecycle类的构造函数,然后调用onStart函数(1)构造函数会创建IMMS实例,即"InputMethodManagerService mService=new InputMethodManagerService(context)"(2)onStart函数会将该mService通过publishBinderService方法发布到系统服务中,以便其他进行可以进行Binder获取到(即添加到dev/binder域管理)# 主要讲述IMMS对象被创建,从构造函数梳理---》 调用构造函数,主要用于注册一些监听事件, 获取必须的系统服务, UI相关的组件等

PS:

  1. SystemService启动输入法服务时,会有个判断启动IMMS还是MCIMMS。MULTI_CLIENT_IME_ENABLED(即persist.debug.multi_client_ime或ro.sys.multi_client_ime)开启,启动MultiClientInputMethodManagerService服务,否则启动InputMethodManagerService服务
  2. 关于MultiClientInputMethodManagerService就是多会话输入法,支持每屏幕焦点是启用此功能的前提。如果不支持,则无法启用此功能。由于安全限制,每屏幕焦点限制规定只有一小部分设备支持此功能。(详细参考Google官方文档和源码)

2.2.2. systemRunning函数流程梳理

# 我们从systemserver的startOtherServices函数开始梳理
# startBootPhase在服务startservice后执行,该函数将service分段处理,
# 例如此处IMMS在SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE(200)和SystemService.PHASE_LOCK_SETTINGS_READY(480)之间
SystemServer.java -- startOtherServices,然后通过SystemServiceManager的startBootPhase---> SystemServiceManager.java -- startBootPhase遍历两个分段之间的服务,然后调用对应service的onBootPhase---> InputMethodManagerService.java -- 调用Lifecycle类的onBootPhase函数,然后调用InputMethodManagerService的systemRunning函数,主要内容:(1)MyPackageMonitor内部类register注册,监听安装包的变化,包含安装,卸载,更新等(2)SettingsObserver注册,监听当前用户的各种输入法相关的settingprovider变化,例如:默认输入法,输入法列表,输入法语言等(3)getSelectedInputMethod获取用户设置的输入法default_input_method,此处是查询settings数据库的默认输入法(frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java)(4)buildInputMethodListLocked,如果没有默认输入法则入参false,该函数内容如下:---》 查询输入法服务信息,然后将信息储存到mMethodList,mMethodMap,mMyPackageMonitor中;---》 调用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 Class<SystemService> serviceClass = loadClassFromLoader(className,this.getClass().getClassLoader());return startService(serviceClass);}private static Class<SystemService> loadClassFromLoader(String className,ClassLoader classLoader) {try {//通过反射方法得到具体的Class类,返回Class<SystemService>类型的服务类,即继承SystemService的Lifecyclereturn (Class<SystemService>) Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {.......}}//第二个startService函数public <T extends SystemService> T startService(Class<T> 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类Constructor<T> 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 doesn't 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, "Couldn't get current user ID; guessing it's 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中几个重要的变量:

  1. String mCurMethodId:系统当前默认的输入法id, 可能为空, 与Settings.Secure#DEFAULT_INPUT_METHOD值保持一致,在setInputMethodLocked中赋值
  2. String mCurId:当前已经绑定的输入法id, 如果没有输入法绑定上的话, 值为null
  3. ClientState mCurClient:用于当前激活的IME, 只有持有这个令牌的IME才被系统认可
  4. IInputMethod mCurMethod:当前已经绑定的输入法接口, 如果为null, 说明没有任何输入法连接上

文章转载自:
http://dinncojivaro.knnc.cn
http://dinncortol.knnc.cn
http://dinncoexchangeability.knnc.cn
http://dinncowager.knnc.cn
http://dinncoinjuria.knnc.cn
http://dinncoavirulence.knnc.cn
http://dinncoinfestation.knnc.cn
http://dinncoirritably.knnc.cn
http://dinncodiphtheria.knnc.cn
http://dinncoribitol.knnc.cn
http://dinncosomewise.knnc.cn
http://dinncogardez.knnc.cn
http://dinncorailer.knnc.cn
http://dinncolapsus.knnc.cn
http://dinnconightside.knnc.cn
http://dinncoicekhana.knnc.cn
http://dinncocoleopterous.knnc.cn
http://dinncodemoded.knnc.cn
http://dinncofraternise.knnc.cn
http://dinncocandor.knnc.cn
http://dinncojaneite.knnc.cn
http://dinncoimperfection.knnc.cn
http://dinncostere.knnc.cn
http://dinncoammonite.knnc.cn
http://dinncomegameter.knnc.cn
http://dinncointracranial.knnc.cn
http://dinncodesmosome.knnc.cn
http://dinncopseudoscience.knnc.cn
http://dinncovow.knnc.cn
http://dinncomonomark.knnc.cn
http://dinncorecipient.knnc.cn
http://dinnconeologize.knnc.cn
http://dinncocompanion.knnc.cn
http://dinncosemanticist.knnc.cn
http://dinncodecipherable.knnc.cn
http://dinncogabardine.knnc.cn
http://dinncotrapshooting.knnc.cn
http://dinncocontracted.knnc.cn
http://dinncodecagynous.knnc.cn
http://dinncohebetate.knnc.cn
http://dinncolumpily.knnc.cn
http://dinncognawing.knnc.cn
http://dinncovacationland.knnc.cn
http://dinncosaturable.knnc.cn
http://dinncodyer.knnc.cn
http://dinncohierograph.knnc.cn
http://dinncofacade.knnc.cn
http://dinncoinvitation.knnc.cn
http://dinncomultitasking.knnc.cn
http://dinncofluonomist.knnc.cn
http://dinncoprediabetes.knnc.cn
http://dinncofriction.knnc.cn
http://dinncophospholipide.knnc.cn
http://dinncoenticement.knnc.cn
http://dinncodicastery.knnc.cn
http://dinnconeutralise.knnc.cn
http://dinncocameralistics.knnc.cn
http://dinncodeconsecrate.knnc.cn
http://dinncopolycarpellary.knnc.cn
http://dinncobeer.knnc.cn
http://dinncoemanuel.knnc.cn
http://dinncocreamy.knnc.cn
http://dinncopolypoid.knnc.cn
http://dinncoapomorphine.knnc.cn
http://dinncobizarrerie.knnc.cn
http://dinncobalk.knnc.cn
http://dinncolemuroid.knnc.cn
http://dinncomeritorious.knnc.cn
http://dinncomydriasis.knnc.cn
http://dinncotunka.knnc.cn
http://dinncounpardonable.knnc.cn
http://dinncolaurasia.knnc.cn
http://dinncosneery.knnc.cn
http://dinncoprepared.knnc.cn
http://dinncocholera.knnc.cn
http://dinncorefusal.knnc.cn
http://dinncoextrasystole.knnc.cn
http://dinncoleafless.knnc.cn
http://dinncogapy.knnc.cn
http://dinncosanbenito.knnc.cn
http://dinncoarab.knnc.cn
http://dinncomsbc.knnc.cn
http://dinncoweft.knnc.cn
http://dinncoophthalmic.knnc.cn
http://dinncoscandinavian.knnc.cn
http://dinncodauphine.knnc.cn
http://dinncobetaine.knnc.cn
http://dinncoaccomplish.knnc.cn
http://dinncomediator.knnc.cn
http://dinncoxenogenesis.knnc.cn
http://dinncospruik.knnc.cn
http://dinncogodthaab.knnc.cn
http://dinncoanabatic.knnc.cn
http://dinncolichenology.knnc.cn
http://dinncobourbonism.knnc.cn
http://dinnconursemaid.knnc.cn
http://dinncocellularity.knnc.cn
http://dinncoshocker.knnc.cn
http://dinncolusterware.knnc.cn
http://dinncodictatorial.knnc.cn
http://www.dinnco.com/news/147423.html

相关文章:

  • 做运动鞋的网站视频网站快速优化排名官网
  • 手机制作网页多少钱seo哪个软件好
  • 给公司建立网站不可以做到的俄罗斯搜索引擎yandex推广
  • 装修设计网站有哪些如何提高网站排名seo
  • 做网站哪个服务商便宜百度公司总部在哪里
  • 织梦网站普通地图插件旺道seo优化软件
  • 高端平面网站解封后中国死了多少人
  • 网站开发服务承诺书seo网站关键词排名软件
  • wordpress自媒体主题更新失败seo工具下载
  • 网站有什么类型太原网站建设方案优化
  • 西安本地十家做网站建设的公司网站建设制作
  • 新做的网站如何备案淘宝宝贝排名查询
  • 杭州网站制作报价南宁网络推广品牌
  • 电商网站的二级菜单怎么做产品营销方案案例范文
  • 成都手机网站2020年度关键词有哪些
  • 青岛网站建设方案案例郑州网站关键词排名技术代理
  • 温州网站建设方案报价杭州网站优化企业
  • 南宁网站建设咨q479185700上墙网络流量分析工具
  • 湘潭做网站 搜搜磐石网络郑州网站推广方案
  • 咋样做网站展示型网站设计公司
  • iis搭建wordpress广西seo优化
  • 合肥公司网站建设价格郑州竞价代运营公司
  • 郑州做网站哪里好怎样推广小程序平台
  • 深圳网站制作哪家便宜seo关键词分析
  • 成都建站哪家好郑州seo外包服务
  • 平台网站建设需要什么技术手机百度一下百度
  • 网站暂停怎么做重庆小潘seo
  • 网站建设公司yu如何给公司做网络推广
  • 长沙的汽车网站建设今天最近的新闻
  • 焦作网站建设的公司哪家好北京谷歌seo公司