已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android深入四大组件(一)应用程序启动过程前言在此前的文章中,我讲过了Android系统启动流程和Android应用进程启动过程,这一篇顺理成章来学习Android 7.0的应用程序的启动过程。分析应用程序的启动过程其实就是分析根Activity的启动过程。1.Launcher请求ActivityManageServiceLauncher启动后会将已安装应用程序的快捷图标显示到界面上,当我们点击应用程序的快捷图标时就会调用Launcher的startActivitySafely方法,如下所示。 packages/apps/Launcher3/src/com/android/launcher3/Launcher.Java public boolean startActivitySafely(View v, Intent intent, Object tag) . try success = startActivity(v, intent, tag); catch (ActivityNotFoundException e) Toast.makeText(this, R.string.activity_not_found, Toast.LENGTH_SHORT).show(); Log.e(TAG, Unable to launch. tag= + tag + intent= + intent, e); return success; startActivitySafely函数中主要就是调用了startActivity函数: packages/apps/Launcher3/src/com/android/launcher3/Launcher.java private boolean startActivity(View v, Intent intent, Object tag) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);/1 try . if (user = null | user.equals(UserHandleCompat.myUserHandle() StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy(); try StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() .penaltyLog().build(); startActivity(intent, optsBundle);/2 finally StrictMode.setVmPolicy(oldPolicy); else launcherApps.startActivityForProfile(intent.getComponent(), user, intent.getSourceBounds(), optsBundle); return true; catch (SecurityException e) . return false; 在注释1处设置Flag为Intent.FLAG_ACTIVITY_NEW_TASK,这样根Activity会在新的任务栈中启动。在注释2处调用了startActivity函数: frameworks/base/core/java/android/app/Activity.javaOverridepublic void startActivity(Intent intent, Nullable Bundle options) if (options != null) startActivityForResult(intent, -1, options); else startActivityForResult(intent, -1); startActivity会调用startActivityForResult函数,其中第二个参数为-1,表示Launcher不需要知道Activity启动的结果,startActivityForResult函数的代码如下所示。 frameworks/base/core/java/android/app/Activity.java public void startActivityForResult(RequiresPermission Intent intent, int requestCode, Nullable Bundle options) if (mParent = null) Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); . else . mParent是Activity类型的,表示当前Activity的父类。因为目前根Activity还没有创建出来,因此,mParent = null成立。接着调用Instrumentation的execStartActivity方法,Instrumentation主要用来监控应用程序和系统的交互,execStartActivity方法的代码如下所示。 frameworks/base/core/java/android/app/Instrumentation.javapublic ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) . try intent.migrateExtraStreamToClipData(); intent.prepareToLeaveProcess(who); int result = ActivityManagerNative.getDefault() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver(), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options); checkStartActivityResult(result, intent); catch (RemoteException e) throw new RuntimeException(Failure from system, e); return null; 首先会调用ActivityManagerNative的getDefault来获取ActivityManageService(以后简称为AMS)的代理对象,接着调用它的startActivity方法。首先我们先来查看ActivityManagerNative的getDefault方法做了什么: frameworks/base/core/java/android/app/ActivityManagerNative.java static public IActivityManager getDefault() return gDefault.get(); private static final Singleton gDefault = new Singleton() protected IActivityManager create() IBinder b = ServiceManager.getService(activity);/1 if (false) Log.v(ActivityManager, default service binder = + b); IActivityManager am = asInterface(b);/2 if (false) Log.v(ActivityManager, default service = + am); return am; ;getDefault方法调用了gDefault的get方法,我们接着往下看,gDefault 是一个Singleton类。注释1处得到名为”activity”的Service代理对象,也就是ActivityManagerService的代理对象。接着在注释2处将它封装成ActivityManagerProxy(以后简称为AMP)类型对象,并将它保存到gDefault中,此后调用ActivityManagerNative的getDefault方法就会直接获得AMS的代理AMP对象。 回到Instrumentation类的execStartActivity方法中,从上面得知就是调用AMP的startActivity,其中AMP是ActivityManagerNative的内部类,代码如下所示。 frameworks/base/core/java/android/app/ActivityManagerNative.java public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); data.writeString(callingPackage); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); if (profilerInfo != null) data.writeInt(1); profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); else data.writeInt(0); if (options != null) data.writeInt(1); options.writeToParcel(data, 0); else data.writeInt(0); mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);/1 reply.readException(); int result = reply.readInt(); reply.recycle(); data.recycle(); return result; 首先会将传入的参数写入到Parcel类型的data中。在注释1处通过IBinder对象mRemote想AMS发送一个START_ACTIVITY_TRANSACTION类型的进程间通信请求。那么服务端AMS就会从Binder线程池中读取我们客户端发来的数据,最终会调用ActivityManagerNative的onTransact方法中执行,如下所示。 frameworks/base/core/java/android/app/ActivityManagerNative.java Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException switch (code) case START_ACTIVITY_TRANSACTION: . int result = startActivity(app, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, options); reply.writeNoException(); reply.writeInt(result); return true; onTransact中会调用AMS的startActivity方法,如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java Override public final int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, UserHandle.getCallingUserId(); 为了便于理解,给出Launcher到AMS调用过程的时序图。2.ActivityManageService到ApplicationThread的调用流程AMS的startActivity方法中return了startActivityAsUser方法: frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java Override public final int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) enforceNotIsolatedCaller(startActivity); userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, ALLOW_FULL_ONLY, startActivity, null); return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, null, null, bOptions, false, userId, null, null);startActivityAsUser方法中又return了mActivityStarter的startActivityMayWait方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java final int startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, IActivityManager.WaitResult outResult, Configuration config, Bundle bOptions, boolean ignoreTargetSecurity, int userId, IActivityContainer iContainer, TaskRecord inTask) . int res = startActivityLocked(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, outRecord, container, inTask); . return res; 又调用了startActivityLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java final int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent, String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord outActivity, ActivityStackSupervisor.ActivityContainer container, TaskRecord inTask) . doPendingActivityLaunchesLocked(false); . return err; startActivityLocked函数代码非常多,我们只需要关注doPendingActivityLaunchesLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java final void doPendingActivityLaunchesLocked(boolean doResume) while (!mPendingActivityLaunches.isEmpty() final PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); final boolean resume = doResume & mPendingActivityLaunches.isEmpty(); try final int result = startActivityUnchecked( pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null); postStartActivityUncheckedProcessing( pal.r, result, mSupervisor.mFocusedStack.mStackId, mSourceRecord, mTargetStack); catch (Exception e) Slog.e(TAG, Exception during pending activity launch pal= + pal, e); pal.sendErrorResult(e.getMessage(); 接着又调用startActivityUnchecked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask) . mSupervisor.resumeFocusedStackTopActivityLocked(); . return START_SUCCESS; startActivityUnchecked方法中调用了ActivityStackSupervisor类型的mSupervisor的resumeFocusedStackTopActivityLocked方法,如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java boolean resumeFocusedStackTopActivityLocked( ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) if (targetStack != null & isFocusedStack(targetStack) return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions); final ActivityRecord r = mFocusedStack.topRunningActivityLocked(); if (r = null | r.state != RESUMED) mFocusedStack.resumeTopActivityUncheckedLocked(null, null);/1 return false; 在注释1处又调用了ActivityStack类型mFocusedStack的resumeTopActivityUncheckedLocked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStack.java boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) . try . result = resumeTopActivityInnerLocked(prev, options); finally mStackSupervisor.inResumeTopActivity = false; return result; 紧接着查看ActivityStack的resumeTopActivityInnerLocked方法: frameworks/base/services/core/java/com/android/server/am/ActivityStack.java private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) . mStackSupervisor.startSpecificActivityLocked(next, true, true); if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); return true; resumeTopActivityInnerLocked方法代码非常多,我们只需要关注调用了ActivityStackSupervisor类型mStackSupervisor的startSpecificActivityLocked方法,代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) ProcessRecord app = mService.getProcessRecordLocked(cessName, .applicationInfo.uid, true); r.task.stack.setLaunchTime(r); if (app != null & app.thread != null) /1 try if (.flags&ActivityInfo.FLAG_MULTIPROCESS) = 0 | !android.equals(.packageName) app.addPackage(.packageName, .applicationInfo.versionCode, mService.mProcessStats); realStartActivityLocked(r, app, andResume, checkConfig);/2 rn; catch (RemoteException e) Slog.w(TAG, Exception when starting activity + ent.getComponent().flattenToShortString(), e); mService.startProcessLocked(cessName, .applicationInfo, true, 0, activity, ent.getComponent(), false, false, true); 在注释1处如果当前Activity所在的Application运行的话,会执行注释2处的代码。realStartActivityLocked方法的代码如下所示。 frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException . app.thread.scheduleLaunchActivity(new Intent(ent), r.appToken, System.identityHashCode(r), , new Configuration(mService.mConfiguration), new Configuration(task.mOverrideConfig), pat, r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); . return true; 这里的 app.thread指的是IApplicationThread,它的实现是ActivityThread的内部类ApplicationThread,其中ApplicationThread继承了ApplicationThreadNative,而ApplicationThreadNative继承了Binder并实现了IApplicationThread接口。 讲到这里再给出ActivityManageService到ApplicationThread调用过程的时序图,如下图所示。3.ActivityThread启动ActivityActivityThread,在应用程序进程启动时会创建ActivityThread实例。ActivityThread作为应用程序进程的核心类,它是如何启动应用程序(Activity)的呢?我们接着往下看。 根据上文接着查看ApplicationThread的scheduleLaunchActivity方法,代码如下所示。 frameworks/base/core/java/android/app/ActivityThread.java Override public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident, ActivityInfo info, Configuration curConfig, Configuration overrideConfig, CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor, int procState, Bundle state, PersistableBundle persistentState, List pendingResults, List pendingNewIntents, boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) updateProcessState(procState, false); ActivityClientRecord r = new ActivityClientRecord(); r.token = token; r.ident = ident; ent = intent; r.referrer = referrer; r.voiceInte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 昆明冶金高等专科学校《英语翻译理论与实践》2024-2025学年第一学期期末试卷
- 土的直接剪切试验记录(三)
- 高一数学上学期第一次月考(北师大版2019必修第一册第一章高效培优-提升卷)(考试版A4)
- 刺五加对改善睡眠功能研究
- 西藏地区马克思主义大众化现实问题
- 物资采购与供应链管理
- 学位论文参考文献及脚注部分格式示例-论文格式-
- 装备制造业工业汉语平行语料库的搭建与问题的探讨
- 农林经济管理本科毕业论文选题(1425个)
- 【工程建设项目成本管理研究国内外文献综述2400字】
- 2025广东广州市越秀区流花街招聘党建工作指导员1人笔试考试参考题库及答案解析
- 2025年抗菌药培训考试题及答案
- GB/T 21782.4-2025粉末涂料第4部分:爆炸下限的计算
- 冀教版(2024)数学一年级上册第三单元《认识11~20》综合计算练习卷(含解析)
- 2025年宏观经济学试题库及练习题及答案
- 清华大学出版社机械制图习题集参考答案(课堂PPT)
- MBA-营销管理复习题精华及答案
- 高二(8)艺术班下学期家长会课件
- 脾胃风湿病科护理组卧床患者便秘的健康教育知晓率
- 腰骶疼痛精确诊断治疗课件
- 气相色谱质谱联用仪操作规程精
评论
0/150
提交评论