本系列分四篇文章详细介绍Context, 这是第三篇
-
因为本文是分析Service的Context创建流程,我们直接从
ActivityThread.handleCreateService
开始分析,如果不太明白这之前的逻辑的话,可以参考Service启动流程源码分析。@UnsupportedAppUsage private void handleCreateService(CreateServiceData data) { // If we are getting ready to gc after going to the background, well // we are back active so skip it. unscheduleGcIdler(); LoadedApk packageInfo = getPackageInfoNoCheck( data.info.applicationInfo, data.compatInfo); Service service = null; try { //-----1----- java.lang.ClassLoader cl = packageInfo.getClassLoader(); service = packageInfo.getAppFactory() .instantiateService(cl, data.info.name, data.intent); } catch (Exception e) { if (!mInstrumentation.onException(service, e)) { throw new RuntimeException( "Unable to instantiate service " + data.info.name + ": " + e.toString(), e); } } try { if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name); //-----2----- ContextImpl context = ContextImpl.createAppContext(this, packageInfo); //-----3----- context.setOuterContext(service); //-----4----- Application app = packageInfo.makeApplication(false, mInstrumentation); //-----5----- service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService()); //-----6----- service.onCreate(); mServices.put(data.token, service); try { ActivityManager.getService().serviceDoneExecuting( data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } catch (Exception e) { if (!mInstrumentation.onException(service, e)) { throw new RuntimeException( "Unable to create service " + data.info.name + ": " + e.toString(), e); } } }
-
注释
1
处创建一个service
对象。 -
注释
2
处创建一个Service的ContextImpl对象。 -
注释
3
处setOuterContext
将service对象赋值给ContextImpl中的mOuterContext
, 这样ContextImpl就可以访问service中的方法和变量了。 -
注释
4
处创建一个Application,在前面Android深入理解Context讲过。 -
注释
5
处调用service.attach
,将创建的context传递进service中。 -
注释
6
处调用service.onCreate()
。 -
我们主要看下注释
4
的代码部分,进入service.attach
:public abstract class Service extends ContextWrapper { @UnsupportedAppUsage public final void attach( Context context, ActivityThread thread, String className, IBinder token, Application application, Object activityManager) { attachBaseContext(context); mThread = thread; // NOTE: unused - remove? mClassName = className; mToken = token; mApplication = application; mActivityManager = (IActivityManager)activityManager; mStartCompatibility = getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ECLAIR; } } public class ContextWrapper extends Context { protected void attachBaseContext(Context base) { if (mBase != null) { throw new IllegalStateException("Base context already set"); } mBase = base; } }
-
最终还是将Service类型的ContextImpl赋值给了ContextWrapper中的
mBase
变量,这样我们调用ContextWrapper中的方法实际就是调用mBase
这个真正的ContextImpl中的方法。 -
至此我们关于Service的Context的分析就结束了。