Android应用程序内部启动Activity过程(startActivity)的源代码分析

上传人:博****1 文档编号:487984994 上传时间:2022-12-30 格式:DOCX 页数:15 大小:109.47KB
返回 下载 相关 举报
Android应用程序内部启动Activity过程(startActivity)的源代码分析_第1页
第1页 / 共15页
Android应用程序内部启动Activity过程(startActivity)的源代码分析_第2页
第2页 / 共15页
Android应用程序内部启动Activity过程(startActivity)的源代码分析_第3页
第3页 / 共15页
Android应用程序内部启动Activity过程(startActivity)的源代码分析_第4页
第4页 / 共15页
Android应用程序内部启动Activity过程(startActivity)的源代码分析_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《Android应用程序内部启动Activity过程(startActivity)的源代码分析》由会员分享,可在线阅读,更多相关《Android应用程序内部启动Activity过程(startActivity)的源代码分析(15页珍藏版)》请在金锄头文库上搜索。

1、上文介绍了Android应用程序的启动过程,即应用程序默认Activity的启动过程,一般来说,这种默认Activity是在新的进程和任务中启动的;本文将继续分析在应用程序内部启动非默认Activity的过程的源代码,这种非默认Activity一般是在原来的进程和任务中启动的。这里,我们像上一篇文章Android应用程序启动过程源代码分析一样,采用再上一篇文章Android应用程序的Activity启动过程简要介绍和学习计划所举的例子来分析在应用程序内部启动非默认Activity的过程。在应用程序内部启动非默认Activity的过程与在应用程序启动器Launcher中启动另外一个应用程序的默认

2、Activity的过程大体上一致的,因此,这里不会像上文Android应用程序启动过程源代码分析一样详细分析每一个步骤,我们着重关注有差别的地方。回忆一下Android应用程序的Activity启动过程简要介绍和学习计划一文所用的应用程序Activity,它包含两个Activity,分别是MainActivity和SubActivity,前者是应用程序的默认Activity,后者是非默认ActivityoMainActivity启动起来,通过点击它界面上的按钮,便可以在应用程序内部启动SubActivity。我们先来看一下应用程序的配置文件AndroidManifest.xml,看看这两个Ac

3、tivity是如何配置的: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_name910actionandr

4、oid:name=androidintentactionMAIN/11categoryandroid:name=androidintentcategoryLAUNCHER/1213/activity14activityandroid:name=.SubActivity15android:label=string/sub_activity16intentfilter17actionandroid:name=shy.luo.activity.subactivity/18categoryandroid:name=androidintentcategoryDEFAULT/19/intentfilter

5、20/activity21/application22/manifest这里可以很清楚地看到,MainActivity被配置成了应用程序的默认Activity,而SubActivity可以通过名称shy.luo.activity.subactivity”隐式地启动,我们来看一下src/shy/luo/activity/MainActivity.java文件的内容,可以清楚地看到SubActivity是如何隐式地启动的:viewplain1publicclassMainActivityextendsActivityimplementsOnClickListener234.Override5pub

6、licvoidonClick(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同冷*?.町FLeBl1PIIUMlVfe

7、druiAtriuibawrl0iuFSmTiTztz攻5皿卫臥112S_rSJ匕1111111点击查看大图与前面介绍的MainActivity启动过程相比,这里少了中间创建新的进程的步骤;接下来,我们就详细分析一下SubActivity与MainActivity启动过程中有差别的地方,相同的地方请参考Android应用程序启动过程源代码分析一文。Step1.Activity.startActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step2大体一致,通过指定名称“shy.luo.activity.subact来告诉应用程序框架层,它要隐式地启动SubActivi

8、ty。所不同的是传入的参数intent没有lntent.FLAG_ACTIVITY_NEW_TASK标志,表示这个SubActivity和启动它的MainActivity运行在同一个Task中。Step2.Activity.startActivityForResult这一步与上一篇文章Android应用程序启动过程源代码分析的Step3一致。Step3.Instrumentation.execStartActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step4一致。Step4.ActivityManagerProxy.startActivity这一步与上一篇文章An

9、droid应用程序启动过程源代码分析的Step5一致。Step5.ActivityManagerService.startActivity这一步与上一篇文章Android应用程序启动过程源代码分析的Step6一致。Step6.ActivityStack.startActivityMayWait这一步与上一篇文章Android应用程序启动过程源代码分析的Step7一致。Step7.ActivityStack.startActivityLocked这一步与上一篇文章Android应用程序启动过程源代码分析的Step8一致。Step8.ActivityStack.startActivityUnche

10、ckedLocked这一步与上一篇文章Android应用程序启动过程源代码分析的Step9有所不同,主要是当前要启动的Activity与启动它的Activity是在同一个Task中运行的,我们来详细看一下。这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:viewplain1publicclassActivityStack2345finalintstartActivityUncheckedLocked(ActivityRecordr,6ActivityRecordsourceReco

11、rd,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.getFla

12、gs();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

13、&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=topRunningNonDe

14、layedActivityLocked(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)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 商业/管理/HR > 商业计划书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号