3. 怎么添加一个系统服务

答题要点
-
答题关键点 -
为什么要添加系统服务:给别人用的 -
如何让别人使用:弃用binder机制ipc通信,注册开放出去,让其他调用者可以使用 -
具体有那些事要干 -
添加系统服务时机:SystemServer启动时注册 -
服务端要做的事 -
启用binder机制 -
服务初始化工作 -
binder注册到ServiceManager -
应用端要做哪些事 -
系统服务调用方式Context.getSystemSevice -
如果自己 添加服务,也要与系统服务调用保持一致,需要为服务注册serviceFeature
4. 系统服务和bind的应用服务有什么区别
启动方式上的区别
注册方式上的区别
使用方式上的区别
-
系统服务: -
图17 -
应用服务 -
图18
5. ServiceManager的启动和工作原理
ServiceManager的启动流程是怎样的?
怎么获取ServiceManager的binder对象?
怎么向ServiceManager添加服务?
怎么从ServiceManager获取服务?
应用进程相关
1. 应用进程是怎么启动的

考察点:
-
了解Linux下进程启动的方式 -
熟悉应用进程启动的基本流程 -
深入理解应用进程启动的原理
什么时候触发的进程启动?

应用的启动
题解
-
应用进程是什么时候启动的 -
启动应用组件,如Activity、Service会先判断应用所在进程是否启动,如果没有启动,就会先启动进程 -
进程启动由谁发起 -
由AMS向zygote发起请求,通过socket进行通信 -
zygote fork出应用进程,执行ActivityThread的入口main函数,入口函数的java类名是AMS通过socket发给zygote的 -
进程启动之后向AMS报告,注册Application Thread整个启动才算结束,只有向AMS报告,进程才是可用的 -
图22
2. 应用是怎么启用binder机制的
考察点:
题解
3. 谈谈对Application的理解
考察点:
作用:
继承关系: Application - ContextWrapper

生命周期:
Application怎么初始化
-
ActivityThread.attch()-> -
图24 -
总结: -
如上图,先调用ActivityThread.attch()函数,最终是通过反射创建了Application实例 -
然后会准备上下文 application.attchBaseContext() -
最后调用了application Oncreate函数 -
整体流程如图25 -
注意: -
不要在Application的生命周期中执行耗时操作,因为这可能会阻塞应用的UI线程(code过程要小心了,Application onCreate中耗时的操作如sdk耗时的初始化操作要避免) -
Application中静态变量的bug -
例 -
在Application中声明变量static String name -
MainActivity中初始化name的值 -
TestActivity中获取name的值 -
问题:假设应用进程被杀死,切回应用的时候,系统会重建应用并恢复TestActivity,此时name并没有被初始化,所以name为null,这回引发一些异常
4. 谈谈对Context的理解
讲的不错的一篇文章:https://juejin.cn/post/6864346705081401352
考察点
inActivity中初始化name的值
4. 谈谈对Context的理解
讲的不错的一篇文章:https://juejin.cn/post/6864346705081401352
考察点
|