- Android进阶解密
- 刘望舒
- 277字
- 2020-08-27 17:04:56
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=1739633246-3tZ3rx8DWNCzHAhtnToTb6cBYwZi9kmB-0-4475b12bca79eaccd6ac51edaf1e0daa)
sendMessage方法向H类发送CREATE_SERVICE类型的消息,H类的handleMessage方法会对CREATE_SERVICE类型的消息进行处理,其中调用了ActivityThread的handleCreateService方法:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer163.jpg?sign=1739633246-Wqhv9xdPWFBBMR9u61PsavqnBRQ8wVqI-0-f3786672863249f37a9c71e4aa3fa040)
在注释1处通过ContextImpl的createAppContext方法创建了ContextImpl,并将该ContextImpl传入注释2处service的attach方法中:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer164.jpg?sign=1739633246-7vUWrY8TuhTnVPGTkXQAotCobjKvrA7o-0-1da3eec1cb2ec84ec6753b4b978a6487)
在注释1处调用了ContextWrapper的attachBaseContext方法,如下所示:
![](https://epubservercos.yuewen.com/D63A94/16896237205618706/epubprivate/OEBPS/Images/figer165.jpg?sign=1739633246-gVNqVkkMXHJfmXiAk1tYnrbakSOJoeYO-0-ed733f04d74f3ea86c322fae3fe08115)
注释1处的base一路传递过来的是ContextImpl,将ContextImpl赋值给ContextWrapper的Context类型的成员变量mBase,这样在ContextWrapper中就可以使用Context的方法,而Service继承自ContextWrapper,同样可以使用Context的方法。