一直没有系统的学习过AMS,ActivityManagerService的代码较多,功能也比较繁琐。
记得以前对所谓的“四大组件”都没有概念,平时接触过后,才有些理解,比如在蓝牙的使用练习里,就可以了解到广播的使用,进而可以深刻的理解广播,然后展开其实现原理,本质是观察者模式的注册和回调。
//activity的学习可以从应用的打开过程作为入手点,从dumpsys meminfo 这样的流程了解AMS中//的IApplicationThread代理对象对app的访问。
在BroadcastReceiver的onReceive方法里添加log,我们可以发现,是执行在主进程中的,
这个引起了我的注意,touch事件是回调在主进程,sensor事件也是,广播回调又是怎样的处理呢,
过程比较复杂,这里说说大概流程,AMS通过IApplicationThread这个app的代理对象来进行调用,执行到app进程中,(这个时候是在ApplicationThread这个binder线程里)
app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
data, extras, ordered, sticky, sendingUser, app.repProcState);
最终调用到广播binder对象的
ReceiverDispatcher.performReceive方法里,里面post到主进程。
原理看上去比较清楚,binder回调,再post到主进程,比较文明的方式到主进程,不像input数据那样“野蛮”--采用注册fd回调的方式进行callback。
但流程很多,有些复杂。
参考资料