输入法启动过程 - inputmethod/PinyinIME GitHub Wiki
有很多文章研究安卓应用的启动过程,也有一些研究了Service的启动过程,输入法服务派生自Service,因此一方面通用Service的启动流程适用于输入法服务,另一方面,输入法因自身出现场合和使用场景与通用Service又略有不同,因而有一些自身独有的额外步骤。
输入法框架由3个进程协作:应用程序进程,系统进程和输入法进程。每个应用程序包含若干个可输入的控件View,还有一个InputMethodManager类单例对象,输入法进程实现了派生自Service的InputMethodService类,系统进程的类InputMethodManagerService协调二者的交互。
<<应用进程>> | <<系统进程>> | <<输入法进程>>
微信 | | PinYinIME
邮件 | | Sogou
短信 | ImputMethodManagerService| 某du
记事本 | | 某飞
... | | ...
安卓操作系统启动时,SystemServer的ServerThread类(继承自Thread类)的run方法被调用,这个方法先调用Looper.prepare和进行像设置优先级之类的线程初始化, 之后就初始化启动第一批系统服务(网络,usb,wifi等等安卓称为critical service), 然后就到第2批系统服务(其中之一就是输入法的InputMethodManagerService),然后再检查系统是不是安全模式后,就认为系统准备就绪,准备启动应用程序, ActivityManagerService.self().systemReady()时传入一个Runnable(运行时发intent启动SystemUIService服务显示操作系统的界面), 后调用Looper.loop()。
系统进程创建输入法服务并添加进ServiceManager的源码
// Bring up services needed for UI.
if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
try {
Slog.i(TAG, "Input Method Service");
imm = new InputMethodManagerService(context);
ServiceManager.addService(Context.INPUT_METHOD_SERVICE, imm);
} catch (Throwable e) {
reportWtf("starting Input Manager Service", e);
}
系统就绪时设置输入法服务就绪的源码
final InputMethodManagerService immF = imm;
//....
try {
if (immF != null) immF.systemReady(statusBarF);
} catch (Throwable e) {
reportWtf("making Input Method Service ready", e);
}
输入法服务的构造和systemReady方法都可查阅源码InputMethodManagerService.java。
独立进程输入法服务基类InputMethodService.java
当前应用程序进程的输入法代理类InputMethodManager.java
参考链接
[Android系统源码分析--Context](https://zhuanlan.zhihu.com/p/33681899)
[Android 8.0 源码分析 (五) Service 启动](https://juejin.im/post/5dbb0507f265da4cf406f735)
[从Android 8.0源码的角度剖析APP的启动过程](https://blog.csdn.net/AndrExpert/article/details/103535201)
[Android Application 启动流程分析及其源码调用探究](https://juejin.im/post/5e4ea9465188254903693d4a)
[Android输入法框架系统(上)](https://blog.csdn.net/huangyabin001/article/details/28434989)
[Android输入法框架系统(下)](https://blog.csdn.net/huangyabin001/article/details/28435093)
[Android InputMethod 源码分析,显示输入法流程](https://blog.csdn.net/jieqiong1/article/details/71262987)
[Android 输入法框架源码分析总结(1)](http://www.jeepxie.net/article/780024.html)
[启动优化(上):从启动过程看启动速度优化](https://blog.yorek.xyz/android/paid/master/start_1/)
[启动优化(下):优化启动速度的进阶方法](https://blog.yorek.xyz/android/paid/master/start_2/)