




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android 深入四大组件(二)Service 的 启动过程 1.ContextImpl 到 ActivityManageService 的调用过程 要启动 Service,我们会调用 startService 方法,它的实现在 ContextWrapper 中,代码如下 所示。 frameworks/base/core/Java/android/content/ContextWrapper.java public class ContextWrapper extends Context Context mBase; . Override public ComponentName startService(Intent service) return mBase.startService(service); . 在 startService 方法中会调用 mBase 的 startService 方法,Context 类型的 mBase 对象具体指 的是什么呢?ActivityThread 启动 Activity 时会调用如下代码创建 Activity 的上下文环境。 frameworks/base/core/java/android/app/ActivityThread.java private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) . if (activity != null) Context appContext = createBaseContextForActivity(r, activity);/1 . activity.attach(appContext, this, getInstrumentation(), r.token, r.ident, app, ent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window); . return activity; 在注释 1 处创建上下文对象 appContext ,并传入 Activity 的 attach 方法中,将 Activity 与 上下文对象 appContext 关联起来,这个上下文对象 appContext 的具体类型是什么,我们 接着查看 createBaseContextForActivity 方法,代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java private Context createBaseContextForActivity(ActivityClientRecord r, final Activity activity) . ContextImpl appContext = ContextImpl.createActivityContext( this, r.packageInfo, r.token, displayId, r.overrideConfig); appContext.setOuterContext(activity); Context baseContext = appContext; . return baseContext; 这里可以得出结论,上下文对象 appContext 的具体类型就是 ContextImpl 。Activity 的 attach 方法中将 ContextImpl 赋值给 ContextWrapper 的成员变量 mBase 中,因此,mBase 具 体指向就是 ContextImpl 。 那么,我们紧接着来查看 ContextImpl 的 startService 方法,代码如下所示。 frameworks/base/core/java/android/app/ContextImpl.java Override public ComponentName startService(Intent service) warnIfCallingFromSystemProcess(); return startServiceCommon(service, mUser); private ComponentName startServiceCommon(Intent service, UserHandle user) try validateServiceIntent(service); service.prepareToLeaveProcess(this); /* * 1 */ ComponentName cn = ActivityManagerNative.getDefault().startService( mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded( getContentResolver(), getOpPackageName(), user.getIdentifier(); . return cn; catch (RemoteException e) throw e.rethrowFromSystemServer(); startService 方法中会 return startServiceCommon 方法,在 startServiceCommon 方法中会在注 释 1 处调用 ActivityManageService(AMS)的代理对象 ActivityManagerProxy(AMP)的 startService 方法,最终会调用 AMS 的 startService 方法。至于注释 1 处的代码为何会调用 AMS 的 startService 方法。 ContextImpl 到 ActivityManageService 的调用过程如下面的时序图所示。 2.ActivityThread 启动 Service 我们接着来查看 AMS 的 startService 方法。 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java Override public ComponentName startService(IApplicationThread caller, Intent service, String resolvedType, String callingPackage, int userId) throws TransactionTooLargeException . synchronized(this) . ComponentName res = mServices.startServiceLocked(caller, service, resolvedType, callingPid, callingUid, callingPackage, userId);/1 Binder.restoreCallingIdentity(origId); return res; 注释 1 处调用 mServices 的 startServiceLocked 方法,mServices 的类型是 ActiveServices,ActiveServices 的 startSeLocked 方法代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActiveServices.java ComponentName startServiceLocked(IApplicationThread caller, Intent service, String resolvedType, int callingPid, int callingUid, String callingPackage, final int userId) throws TransactionTooLargeException . return startServiceInnerLocked(smap, service, r, callerFg, addToStarting); ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r, boolean callerFg, boolean addToStarting) throws TransactionTooLargeException . String error = bringUpServiceLocked(r, service.getFlags(), callerFg, false, false); . return ; startServiceLocked 方法的末尾 return 了 startServiceInnerLocked 方法,而 startServiceInnerLocked 方法中又调用了 bringUpServiceLocked 方法: frameworks/base/services/core/java/com/android/server/am/ActiveServices.java private String bringUpServiceLocked(ServiceRecord r, int intentFlags, boolean execInFg, boolean whileRestarting, boolean permissionsReviewRequired) throws TransactionTooLargeException . final String procName = cessName;/1 ProcessRecord app; if (!isolated) app = mAm.getProcessRecordLocked(procName, r.appInfo.uid, false);/2 if (DEBUG_MU) Slog.v(TAG_MU, “bringUpServiceLocked: appInfo.uid=“ + r.appInfo.uid + “ app=“ + app); if (app != null realStartServiceLocked(r, app, execInFg);/4 return null; catch (TransactionTooLargeException e) throw e; catch (RemoteException e) Slog.w(TAG, “Exception when starting service “ + r.shortName, e); else app = r.isolatedProc; if (app = null . 在注释 1 处得到 ServiceRecord 的 processName 的值赋值给 procName ,其中 ServiceRecord 用来描述 Service 的 android:process 属性。注释 2 处将 procName 和 Service 的 uid 传入到 AMS 的 getProcessRecordLocked 方法中,来查询是否存在一个与 Service 对应的 ProcessRecord 类型的对象 app,ProcessRecord 主要用来记录运行的应用程序进程的信息。 注释 5 处判断 Service 对应的 app 为 null 则说明用来运行 Service 的应用程序进程不存在, 则调用注释 5 处的 AMS 的 startProcessLocked 方法来创建对应的应用程序进程。 注释 3 处判断如果用来运行 Service 的应用程序进程存在,则调用注释 4 处的 realStartServiceLocked 方法: frameworks/base/services/core/java/com/android/server/am/ActiveServices.java private final void realStartServiceLocked(ServiceRecord r, ProcessRecord app, boolean execInFg) throws RemoteException . try . app.thread.scheduleCreateService(r, r.serviceInfo, mApatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo), app.repProcState); r.postNotification(); created = true; catch (DeadObjectException e) . . 在 realStartServiceLocked 方法中调用了 app.thread 的 scheduleCreateService 方法。其中 app.thread 是 IApplicationThread 类型的,它的实现是 ActivityThread 的内部类 ApplicationThread,其中 ApplicationThread 继承了 ApplicationThreadNative,而 ApplicationThreadNative 继承了 Binder 并实现了 IApplicationThread 接口。 ApplicationThread 的 scheduleCreateService 方法如下所示。 frameworks/base/core/java/android/app/ActivityThread.java public final void scheduleCreateService(IBinder token, ServiceInfo info, CompatibilityInfo compatInfo, int processState) updateProcessState(rocessState, false); CreateServiceData s = new CreateServiceData(); s.token = token; = info; patInfo = compatInfo; sendMessage(H.CREATE_SERVICE, s); 首先将要启动的信息封装成 CreateServiceData 对象并传给 sendMessage 方法,sendMessage 方法向 H 发送 CREATE_SERVICE 消息,H 是 ActivityThread 的内部类并继承 Handler。这 个过程和应用程序的启动过程(根 Activity 启动过程)是类似的。我们接着查看 H 的 handleMessage 方法。 frameworks/base/core/java/android/app/ActivityThread.java public void handleMessage(Message msg) if (DEBUG_MESSAGES) Slog.v(TAG, “ handling: “ + codeToString(msg.what); switch (msg.what) . case CREATE_SERVICE: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, (“serviceCreate: “ + String.valueOf(msg.obj); handleCreateService(CreateServiceData)msg.obj); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; . . . handleMessage 方法根据消息类型,调用了 handleCreateService 方法: frameworks/base/core/java/android/app/ActivityThread.java private void handleCreateService(CreateServiceData data) uleGcIdler(); LoadedApk packageInfo = getPackageInfoNoCheck( .applicationInfo, patInfo);/1 Service service = null; try java.lang.ClassLoader cl = packageInfo.getClassLoader();/2 service = (Service) cl.loadClass().newInstance();/3 catch (Exception e) . try if (localLOGV) Slog.v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 4.2实现中华民族伟大复兴的中国梦 课件(内嵌视频) 统编版高中政治必修一
- 2025年民主党派机关招聘考试法律常识模拟题集及答案
- 病理科三基考试试题库及答案
- 2025年机关基建维修工程师招聘笔试要点
- 2025年篮球裁判员专业技能考试试卷及答案
- 2025年湖南省常德市试验检测师之交通工程考试题库及答案(考点梳理)
- 桥梁工程安全知识培训课件
- 2026届北京市朝阳外国语化学高一上期中经典模拟试题含解析
- 2026届河北省深州市长江中学高一化学第一学期期中经典模拟试题含解析
- 2025年制造业品质管理部经理招聘面试题集及解析
- 丈夫过世遗产协议书
- 2025至2030年中国拉菲草行业投资前景及策略咨询报告
- 2025年北京市房屋租赁合同正式版
- 学历案与深度学习:读书感悟与教育启示
- 医院患者病情评估制度
- 钢栏杆安装工程施工方案
- 秘书岗位复习试题附答案(一)
- 电力事故应对中的多部门协同机制
- 2025年幼儿教师师德培训案例集
- 2024年《数字影像设计与制作》考试题库及答案含各题型
- 高中数学开学第一课课件(初高中衔接)
评论
0/150
提交评论