Android深入理解Context--Service中Context的创建过程

本系列分四篇文章详细介绍Context, 这是第三篇

  • Android深入理解Context–Application中Context的创建过程

  • Android深入理解Context–Activity中Context的创建过程

  • Android深入理解Context–Service中Context的创建过程

  • Android深入理解Context–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对象。

  • 注释3setOuterContext将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的分析就结束了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值