![527ac3d00cec4c8a2d9e24e544d2b2d5.png](https://i-blog.csdnimg.cn/blog_migrate/b2099ef3e80425a6704483bef3714df1.jpeg)
作者:DeepCoder
核心源码
关键类路径
![ad1f1f8ecbda101127ccb379255bc286.png](https://i-blog.csdnimg.cn/blog_migrate/b7e60a8c75f51045134280d0bba944f1.jpeg)
Service 的启动过程相对 Activity 的启动过程来说简单了很多,我们都知道怎么去创建和启动一个 Service, 那么你有没有从源码角度研究过 Service 启动后在系统层是如何运作的 ?
第一次看我文章的小伙伴可以关注一下我,顺便关注一下我的专栏:Android高级开发架构技术专栏 ,每天更新各种技术干货,分享更多最热程序员圈内事。Android高级开发架构技术专栏zhuanlan.zhihu.com
![7b87f9a21b79d9b50db81cb0ba1e51a5.png](https://i-blog.csdnimg.cn/blog_migrate/66486dcc5c74606282d4c2abbef55791.jpeg)
Activity.startService()
首先我们知道:要启动一个 Service 的时候,一般都是在 Activity 中通过 startService() 来启动:
// frameworks/base/core/java/android/app/ActivityManager.java
public class ActivityManager {
@UnsupportedAppUsage
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
@UnsupportedAppUsage
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
}
但是我们在 Activity 源码中并没有实现 startService() 方法,那它在哪里被调用的?找不到我们就去 Activity 的父类中找。
// frameworks/base/core/java/android/app/Activity.java
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
Window.Callback, KeyEvent.Callback,
OnCreateContextMenuListener, ComponentCallbacks2,
Window.OnWindowDismissedCallback, WindowControllerCallback,
AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {
}
// frameworks/base/core/java/android/view/ContextThemeWrapper.java
public class ContextThemeWrapper extends ContextWrapper {
}
// frameworks/base/core/java/android/content/ContextWrapper.java
public class ContextWrapper extends Context {
}
Activity 继承了 ContextThemeWrapper 类, ContextThemeWrapper 又继承了 ContextWrapper类, ContextWrapper 又继承了 Context 类。
ContextWrapper.startService()
在 ContextWrapper 中实现了 startService() 方法:
// frameworks/base/core/java/android/app/ActivityManager.java
public class ActivityManager {
@UnsupportedAppUsage
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
@UnsupportedAppUsage
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);