资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。这里,我们像上一篇文章Android应用程序启动过程源代码分析一样,采用再上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划所举的例子来分析在应用程序内部启动非默认Activity的过程。在应用程序内部启动非默认Activity的过程与在应用程序启动器Launcher中启动另外一个应用程序的默认Activity的过程大体上一致的,因此,这里不会像上文Android应用程序启动过程源代码分析一样详细分析每一个步骤,我们着重关注有差别的地方。回忆一下Android应用程序的Activity启动过程简要介绍和学习计划一文所用的应用程序Activity,它包含两个Activity,分别是MainActivity和SubActivity,前者是应用程序的默认Activity,后者是非默认ActivityoMainActivity启动起来,通过点击它界面上的按钮,便可以在应用程序内部启动SubActivity。我们先来看一下应用程序的配置文件AndroidManifest.xml,看看这两个Activity是如何配置的:viewplain12manifestxmlns:android=http:/schemas.androidcom/apk/res/android3package=shy.luo.activity4android:versionCode=15android:versionName=106applicationandroid:icon=drawable/iconandroid:label=string/app_name7activityandroid:name=MainActivity8android:label=string/app_name910actionandroid:name=androidintentactionMAIN/11categoryandroid:name=androidintentcategoryLAUNCHER/1213/activity14activityandroid:name=.SubActivity15android:label=string/sub_activity16intentfilter17actionandroid:name=shy.luo.activity.subactivity/18categoryandroid:name=androidintentcategoryDEFAULT/19/intentfilter20/activity21/application22/manifest这里可以很清楚地看到,MainActivity被配置成了应用程序的默认Activity,而SubActivity可以通过名称shy.luo.activity.subactivity”隐式地启动,我们来看一下src/shy/luo/activity/MainActivity.java文件的内容,可以清楚地看到SubActivity是如何隐式地启动的:viewplain1publicclassMainActivityextendsActivityimplementsOnClickListener234.Override5publicvoidonClick(Viewv)6if(v.equals(startButton)7.Intentintent=newIntent(shy.luo.activity.subactivity);8startActivity(intent);9.1011这里,首先创建一个名称为shy.luo.activity.subactivity的Intent,然后以这个Intent为参数,通过调用startActivity函数来实现隐式地启动SubActivity。有了这些背景知识后,我们就来看一下SubActivity启动过程的序列图:IIIrIIaMfr同冷*?.町FLeBl1PIIUMlVfedruiAtriuibawrl0iuFSmTiTztz攻5皿卫臥112S_rSJ匕1111111点击查看大图与前面介绍的MainActivity启动过程相比,这里少了中间创建新的进程的步骤;接下来,我们就详细分析一下SubActivity与MainActivity启动过程中有差别的地方,相同的地方请参考Android应用程序启动过程源代码分析一文。Step1.Activity.startActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step2大体一致,通过指定名称“shy.luo.activity.subact来告诉应用程序框架层,它要隐式地启动SubActivity。所不同的是传入的参数intent没有lntent.FLAG_ACTIVITY_NEW_TASK标志,表示这个SubActivity和启动它的MainActivity运行在同一个Task中。Step2.Activity.startActivityForResult这一步与上一篇文章Android应用程序启动过程源代码分析的Step3一致。Step3.Instrumentation.execStartActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step4一致。Step4.ActivityManagerProxy.startActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step5一致。Step5.ActivityManagerService.startActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step6一致。Step6.ActivityStack.startActivityMayWait这一步与上一篇文章Android应用程序启动过程源代码分析的Step7一致。Step7.ActivityStack.startActivityLocked这一步与上一篇文章Android应用程序启动过程源代码分析的Step8一致。Step8.ActivityStack.startActivityUncheckedLocked这一步与上一篇文章Android应用程序启动过程源代码分析的Step9有所不同,主要是当前要启动的Activity与启动它的Activity是在同一个Task中运行的,我们来详细看一下。这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:viewplain1publicclassActivityStack2345finalintstartActivityUncheckedLocked(ActivityRecordr,6ActivityRecordsourceRecord,UrigrantedUriPermissions,7.intgrantedMode,booleanonlyfNeeded,booleandoResume)8910.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.finalIntentintent=r.intent;finalintcallingUid=r.launchedFromUid;intlaunchFlags=intent.getFlags();if(sourceRecord=null)elseif(sourceRecordlaunchMode=ActivityInfoLAUNCH_SINGLE_INSTANCE)elseif(r.launchMode=ActivityInfo.LAUNCH_SINGLE_INSTANCEif(r.resultTo!=null&(launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)!=0)booleanaddingToTask=false;if(launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)!=0&(launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK)=0)|r.launchMode=ActivityInfo.LAUNCH_SINGLE_TASK|r.launchMode=ActivityInfo.LAUNCH_SINGLE_INSTANCE)if(r.packageName!=null)/Iftheactivitybeinglaunchedisthesameastheonecurrently/atthetop,thenweneedtocheckifitshouldonlybelaunched/once.ActivityRecordtop=topRunningNonDelayedActivityLocked(notTop);if(top!=null&r.resultTo=null)if(top.realActivity.equals(r.realActivity)elsebooleannewTask=false;52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75./Shouldthisbeconsideredanewtask?if(r.resultTo=null&!addingToTask&(launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK)!=0)elseif(sourceRecord!=null)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号