资源描述:
《Android系统Activity窗口启动过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在Android系统中,一个Activity对应一个应用程序窗口,任何一个Activity的启动都是由AMS服务和应用程序进程相互配合来完成的。AMS服务统一调度系统中所有进程的Activity启动,而每个Activity的启动过程则由其所属进程来完成。AMS服务通过realStartActivityLocked函数来通知应用程序进程启动某个Activity:frameworks/base/services/java/com/android/server/am/ActivityStack.javafinalbooleanrealStartActivityLoc
2、ked(ActivityRecordr,ProcessRecordapp,booleanandResume,booleancheckConfig)throwsRemoteException{...//系统参数发送变化,通知Activityif(checkConfig){①Configurationconfig=mService.mWindowManager.updateOrientationFromAppTokens(mService.mConfiguration,r.mayFreezeScreenLocked(app)?r.appToken:null);mS
3、ervice.updateConfigurationLocked(config,r,false,false);}//将进程描述符设置到启动的Activity描述符中r.app=app;app.waitingToKill=null;//将启动的Activity添加到进程启动的Activity列表中intidx=app.activities.indexOf(r);if(idx<0){app.activities.add(r);}mService.updateLruProcessLocked(app,true,true);try{...//通知应用程序进程加载Act
4、ivity②app.thread.scheduleLaunchActivity(newIntent(r.intent),r.appToken,System.identityHashCode(r),r.info,newConfiguration(mService.mConfiguration),r.compat,r.icicle,results,newIntents,!andResume,mService.isNextTransitionForward(),profileFile,profileFd,profileAutoStop);...}catch(Remo
5、teExceptione){...}if(mMainStack){mService.startSetupActivityLocked();}returntrue;}AMS通过realStartActivityLocked函数来调度应用程序进程启动一个Activity,参数r为即将启动的Activity在AMS服务中的描述符,参数app为Activity运行所在的应用程序进程在AMS服务中的描述符。函数通过IApplicationThread代理对象ApplicationThreadProxy通知应用程序进程启动r对应的Activity,应用程序进程完成Acti
6、vity的加载等准备工作后,AMS最后启动该Activity。启动Activity的创建等工作是在应用程序进程中完成的,AMS是通过IApplicationThread接口和应用程序进程通信的。r.appToken在AMS服务端的类型为Token,是IApplicationToken的Binder本地对象。frameworks/base/core/java/android/app/ActivityThread.javapublicfinalvoidscheduleLaunchActivity(Intentintent,IBindertoken,intident
7、,ActivityInfoinfo,ConfigurationcurConfig,CompatibilityInfocompatInfo,Bundlestate,ListpendingResults,ListpendingNewIntents,booleannotResumed,booleanisForward,StringprofileName,ParcelFileDescriptorprofileFd,booleanautoStopProfiler){//将AMS服务传过来的参数封装为ActivityClientRe
8、cord对象ActivityClien