![Android进阶解密](https://wfqqreader-1252317822.image.myqcloud.com/cover/331/31186331/b_31186331.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
5.5 Service的Context创建过程
Service的Context创建过程与Activity的Context创建过程类似,是在Service的启动过程中被创建的。Service的Context创建过程的时序图可以参考图5-3,这里就不再给出。在4.2.2节中讲到了ActivityThread启动Service的过程,我们从这里开始分析。ActivityThread的内部类ApplicationThread会调用scheduleCreateService方法来启动Service,如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer162.jpg?sign=1738843911-Aa8aRLLpK5pYc1as2gy74YETC0ht2wD2-0-e0d768a2be240517a03f72af23a9681b)
sendMessage方法向H类发送CREATE_SERVICE类型的消息,H类的handleMessage方法会对CREATE_SERVICE类型的消息进行处理,其中调用了ActivityThread的handleCreateService方法:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer163.jpg?sign=1738843911-Y2DxFdkGddhIEQ0jAYKZaxMJJPNf7vpR-0-ef6d2af1d14321e3b41862bd41b3fdf9)
在注释1处通过ContextImpl的createAppContext方法创建了ContextImpl,并将该ContextImpl传入注释2处service的attach方法中:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer164.jpg?sign=1738843911-r3aBjzlWkgC7F39p4s4sk5jX2TBTOGjQ-0-6132eac0e7cfc73668a3bb53ec48f1d5)
在注释1处调用了ContextWrapper的attachBaseContext方法,如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer165.jpg?sign=1738843911-dlTXtiJhfRTEnx9ooycoyDvxK1L8NWfz-0-45e773f2cc3996fe89b8038de7cfa268)
注释1处的base一路传递过来的是ContextImpl,将ContextImpl赋值给ContextWrapper的Context类型的成员变量mBase,这样在ContextWrapper中就可以使用Context的方法,而Service继承自ContextWrapper,同样可以使用Context的方法。