Step 16.ActivityThread.handlePauseActivity

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalvoidhandlePauseActivity(IBindertoken,booleanfinished,
  4. booleanuserLeaving,intconfigChanges){
  5. ActivityClientRecordr=mActivities.get(token);
  6. if(r!=null){
  7. //Slog.v(TAG,"userLeaving="+userLeaving+"handlingpauseof"+r);
  8. if(userLeaving){
  9. performUserLeavingActivity(r);
  10. }
  11. r.activity.mConfigChangeFlags|=configChanges;
  12. Bundlestate=performPauseActivity(token,finished,true);
  13. //Makesureanypendingwritesarenowcommitted.
  14. QueuedWork.waitToFinish();
  15. //Telltheactivitymanagerwehavepaused.
  16. try{
  17. ActivityManagerNative.getDefault().activityPaused(token,state);
  18. }catch(RemoteExceptionex){
  19. }
  20. }
  21. }
  22. ......
  23. }

函数首先将Binder引用token转换成ActivityRecord的远程接口ActivityClientRecord,然后做了三个事情:1. 如果userLeaving为true,则通过调用performUserLeavingActivity函数来调用Activity.onUserLeaveHint通知Activity,用户要离开它了;2. 调用performPauseActivity函数来调用Activity.onPause函数,我们知道,在Activity的生命周期中,当它要让位于其它的Activity时,系统就会调用它的onPause函数;3. 它通知ActivityManagerService,这个Activity已经进入Paused状态了,ActivityManagerService现在可以完成未竟的事情,即启动MainActivity了

Step 17. ActivityManagerProxy.activityPaused

这个函数定义在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

        
  1. classActivityManagerProxyimplementsIActivityManager
  2. {
  3. ......
  4. publicvoidactivityPaused(IBindertoken,Bundlestate)throwsRemoteException
  5. {
  6. Parceldata=Parcel.obtain();
  7. Parcelreply=Parcel.obtain();
  8. data.writeInterfaceToken(IActivityManager.descriptor);
  9. data.writeStrongBinder(token);
  10. data.writeBundle(state);
  11. mRemote.transact(ACTIVITY_PAUSED_TRANSACTION,data,reply,0);
  12. reply.readException();
  13. data.recycle();
  14. reply.recycle();
  15. }
  16. ......
  17. }

这里通过Binder进程间通信机制就进入到ActivityManagerService.activityPaused函数中去了。

Step 18.ActivityManagerService.activityPaused

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. publicfinalvoidactivityPaused(IBindertoken,Bundleicicle){
  5. ......
  6. finallongorigId=Binder.clearCallingIdentity();
  7. mMainStack.activityPaused(token,icicle,false);
  8. ......
  9. }
  10. ......
  11. }

这里,又再次进入到ActivityStack类中,执行activityPaused函数。 Step 19.ActivityStack.activityPaused

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

        
  1. publicclassActivityStack{
  2. ......
  3. finalvoidactivityPaused(IBindertoken,Bundleicicle,booleantimeout){
  4. ......
  5. ActivityRecordr=null;
  6. synchronized(mService){
  7. intindex=indexOfTokenLocked(token);
  8. if(index>=0){
  9. r=(ActivityRecord)mHistory.get(index);
  10. if(!timeout){
  11. r.icicle=icicle;
  12. r.haveState=true;
  13. }
  14. mHandler.removeMessages(PAUSE_TIMEOUT_MSG,r);
  15. if(mPausingActivity==r){
  16. r.state=ActivityState.PAUSED;
  17. completePauseLocked();
  18. }else{
  19. ......
  20. }
  21. }
  22. }
  23. }
  24. ......
  25. }

这里通过参数token在mHistory列表中得到ActivityRecord,从上面我们知道,这个ActivityRecord代表的是Launcher这个Activity,而我们在Step 11中,把Launcher这个Activity的信息保存在mPausingActivity中,因此,这里mPausingActivity等于r,于是,执行completePauseLocked操作。

Step 20.ActivityStack.completePauseLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

        
  1. publicclassActivityStack{
  2. ......
  3. privatefinalvoidcompletePauseLocked(){
  4. ActivityRecordprev=mPausingActivity;
  5. ......
  6. if(prev!=null){
  7. ......
  8. mPausingActivity=null;
  9. }
  10. if(!mService.mSleeping&&!mService.mShuttingDown){
  11. resumeTopActivityLocked(prev);
  12. }else{
  13. ......
  14. }
  15. ......
  16. }
  17. ......
  18. }

函数首先把mPausingActivity变量清空,因为现在不需要它了,然后调用resumeTopActivityLokced进一步操作,它传入的参数即为代表Launcher这个Activity的ActivityRecord。

Step 21.ActivityStack.resumeTopActivityLokced
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

        
  1. publicclassActivityStack{
  2. ......
  3. finalbooleanresumeTopActivityLocked(ActivityRecordprev){
  4. ......
  5. //Findthefirstactivitythatisnotfinishing.
  6. ActivityRecordnext=topRunningActivityLocked(null);
  7. //Rememberhowwe'llprocessthispause/resumesituation,andensure
  8. //thatthestateisresethoweverwewindupproceeding.
  9. finalbooleanuserLeaving=mUserLeaving;
  10. mUserLeaving=false;
  11. ......
  12. next.delayedResume=false;
  13. //Ifthetopactivityistheresumedone,nothingtodo.
  14. if(mResumedActivity==next&&next.state==ActivityState.RESUMED){
  15. ......
  16. returnfalse;
  17. }
  18. //Ifwearesleeping,andthereisnoresumedactivity,andthetop
  19. //activityispaused,wellthatisthestatewewant.
  20. if((mService.mSleeping||mService.mShuttingDown)
  21. &&mLastPausedActivity==next&&next.state==ActivityState.PAUSED){
  22. ......
  23. returnfalse;
  24. }
  25. .......
  26. //Weneedtostartpausingthecurrentactivitysothetopone
  27. //canberesumed...
  28. if(mResumedActivity!=null){
  29. ......
  30. returntrue;
  31. }
  32. ......
  33. if(next.app!=null&&next.app.thread!=null){
  34. ......
  35. }else{
  36. ......
  37. startSpecificActivityLocked(next,true,true);
  38. }
  39. returntrue;
  40. }
  41. ......
  42. }

通过上面的Step 9,我们知道,当前在堆栈顶端的Activity为我们即将要启动的MainActivity,这里通过调用topRunningActivityLocked将它取回来,保存在next变量中。之前最后一个Resumed状态的Activity,即Launcher,到了这里已经处于Paused状态了,因此,mResumedActivity为null。最后一个处于Paused状态的Activity为Launcher,因此,这里的mLastPausedActivity就为Launcher。前面我们为MainActivity创建了ActivityRecord后,它的app域一直保持为null。有了这些信息后,上面这段代码就容易理解了,它最终调用startSpecificActivityLocked进行下一步操作。

Step 22. ActivityStack.startSpecificActivityLocked
这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

        
  1. publicclassActivityStack{
  2. ......
  3. privatefinalvoidstartSpecificActivityLocked(ActivityRecordr,
  4. booleanandResume,booleancheckConfig){
  5. //Isthisactivity'sapplicationalreadyrunning?
  6. ProcessRecordapp=mService.getProcessRecordLocked(r.processName,
  7. r.info.applicationInfo.uid);
  8. ......
  9. if(app!=null&&app.thread!=null){
  10. try{
  11. realStartActivityLocked(r,app,andResume,checkConfig);
  12. return;
  13. }catch(RemoteExceptione){
  14. ......
  15. }
  16. }
  17. mService.startProcessLocked(r.processName,r.info.applicationInfo,true,0,
  18. "activity",r.intent.getComponent(),false);
  19. }
  20. ......
  21. }

注意,这里由于是第一次启动应用程序的Activity,所以下面语句:

        
  1. ProcessRecordapp=mService.getProcessRecordLocked(r.processName,
  2. r.info.applicationInfo.uid);

取回来的app为null。在Activity应用程序中的AndroidManifest.xml配置文件中,我们没有指定Application标签的process属性,系统就会默认使用package的名称,这里就是"shy.luo.activity"了。每一个应用程序都有自己的uid,因此,这里uid + process的组合就可以为每一个应用程序创建一个ProcessRecord。当然,我们可以配置两个应用程序具有相同的uid和package,或者在AndroidManifest.xml配置文件的application标签或者activity标签中显式指定相同的process属性值,这样,不同的应用程序也可以在同一个进程中启动。

函数最终执行ActivityManagerService.startProcessLocked函数进行下一步操作。

Step 23.ActivityManagerService.startProcessLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. finalProcessRecordstartProcessLocked(StringprocessName,
  5. ApplicationInfoinfo,booleanknownToBeDead,intintentFlags,
  6. StringhostingType,ComponentNamehostingName,booleanallowWhileBooting){
  7. ProcessRecordapp=getProcessRecordLocked(processName,info.uid);
  8. ......
  9. StringhostingNameStr=hostingName!=null
  10. ?hostingName.flattenToShortString():null;
  11. ......
  12. if(app==null){
  13. app=newProcessRecordLocked(null,info,processName);
  14. mProcessNames.put(processName,info.uid,app);
  15. }else{
  16. //Ifthisisanewpackageintheprocess,addthepackagetothelist
  17. app.addPackage(info.packageName);
  18. }
  19. ......
  20. startProcessLocked(app,hostingType,hostingNameStr);
  21. return(app.pid!=0)?app:null;
  22. }
  23. ......
  24. }

这里再次检查是否已经有以process + uid命名的进程存在,在我们这个情景中,返回值app为null,因此,后面会创建一个ProcessRecord,并存保存在成员变量mProcessNames中,最后,调用另一个startProcessLocked函数进一步操作:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. privatefinalvoidstartProcessLocked(ProcessRecordapp,
  5. StringhostingType,StringhostingNameStr){
  6. ......
  7. try{
  8. intuid=app.info.uid;
  9. int[]gids=null;
  10. try{
  11. gids=mContext.getPackageManager().getPackageGids(
  12. app.info.packageName);
  13. }catch(PackageManager.NameNotFoundExceptione){
  14. ......
  15. }
  16. ......
  17. intdebugFlags=0;
  18. ......
  19. intpid=Process.start("android.app.ActivityThread",
  20. mSimpleProcessManagement?app.processName:null,uid,uid,
  21. gids,debugFlags,null);
  22. ......
  23. }catch(RuntimeExceptione){
  24. ......
  25. }
  26. }
  27. ......
  28. }

这里主要是调用Process.start接口来创建一个新的进程,新的进程会导入android.app.ActivityThread类,并且执行它的main函数,这就是为什么我们前面说每一个应用程序都有一个ActivityThread实例来对应的原因。

Step 24. ActivityThread.main

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalvoidattach(booleansystem){
  4. ......
  5. mSystemThread=system;
  6. if(!system){
  7. ......
  8. IActivityManagermgr=ActivityManagerNative.getDefault();
  9. try{
  10. mgr.attachApplication(mAppThread);
  11. }catch(RemoteExceptionex){
  12. }
  13. }else{
  14. ......
  15. }
  16. }
  17. ......
  18. publicstaticfinalvoidmain(String[]args){
  19. .......
  20. ActivityThreadthread=newActivityThread();
  21. thread.attach(false);
  22. ......
  23. Looper.loop();
  24. .......
  25. thread.detach();
  26. ......
  27. }
  28. }

这个函数在进程中创建一个ActivityThread实例,然后调用它的attach函数,接着就进入消息循环了,直到最后进程退出。

函数attach最终调用了ActivityManagerService的远程接口ActivityManagerProxy的attachApplication函数,传入的参数是mAppThread,这是一个ApplicationThread类型的Binder对象,它的作用是用来进行进程间通信的。

Step 25.ActivityManagerProxy.attachApplication

这个函数定义在frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

        
  1. classActivityManagerProxyimplementsIActivityManager
  2. {
  3. ......
  4. publicvoidattachApplication(IApplicationThreadapp)throwsRemoteException
  5. {
  6. Parceldata=Parcel.obtain();
  7. Parcelreply=Parcel.obtain();
  8. data.writeInterfaceToken(IActivityManager.descriptor);
  9. data.writeStrongBinder(app.asBinder());
  10. mRemote.transact(ATTACH_APPLICATION_TRANSACTION,data,reply,0);
  11. reply.readException();
  12. data.recycle();
  13. reply.recycle();
  14. }
  15. ......
  16. }

这里通过Binder驱动程序,最后进入ActivityManagerService的attachApplication函数中。

Step 26.ActivityManagerService.attachApplication

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. publicfinalvoidattachApplication(IApplicationThreadthread){
  5. synchronized(this){
  6. intcallingPid=Binder.getCallingPid();
  7. finallongorigId=Binder.clearCallingIdentity();
  8. attachApplicationLocked(thread,callingPid);
  9. Binder.restoreCallingIdentity(origId);
  10. }
  11. }
  12. ......
  13. }

这里将操作转发给attachApplicationLocked函数。

Step 27.ActivityManagerService.attachApplicationLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. privatefinalbooleanattachApplicationLocked(IApplicationThreadthread,
  5. intpid){
  6. //Findtheapplicationrecordthatisbeingattached...eithervia
  7. //thepidifwearerunninginmultipleprocesses,orjustpullthe
  8. //nextapprecordifweareemulatingprocesswithanonymousthreads.
  9. ProcessRecordapp;
  10. if(pid!=MY_PID&&pid>=0){
  11. synchronized(mPidsSelfLocked){
  12. app=mPidsSelfLocked.get(pid);
  13. }
  14. }elseif(mStartingProcesses.size()>0){
  15. ......
  16. }else{
  17. ......
  18. }
  19. if(app==null){
  20. ......
  21. returnfalse;
  22. }
  23. ......
  24. StringprocessName=app.processName;
  25. try{
  26. thread.asBinder().linkToDeath(newAppDeathRecipient(
  27. app,pid,thread),0);
  28. }catch(RemoteExceptione){
  29. ......
  30. returnfalse;
  31. }
  32. ......
  33. app.thread=thread;
  34. app.curAdj=app.setAdj=-100;
  35. app.curSchedGroup=Process.THREAD_GROUP_DEFAULT;
  36. app.setSchedGroup=Process.THREAD_GROUP_BG_NONINTERACTIVE;
  37. app.forcingToForeground=null;
  38. app.foregroundServices=false;
  39. app.debugging=false;
  40. ......
  41. booleannormalMode=mProcessesReady||isAllowedWhileBooting(app.info);
  42. ......
  43. booleanbadApp=false;
  44. booleandidSomething=false;
  45. //Seeifthetopvisibleactivityiswaitingtoruninthisprocess...
  46. ActivityRecordhr=mMainStack.topRunningActivityLocked(null);
  47. if(hr!=null&&normalMode){
  48. if(hr.app==null&&app.info.uid==hr.info.applicationInfo.uid
  49. &&processName.equals(hr.processName)){
  50. try{
  51. if(mMainStack.realStartActivityLocked(hr,app,true,true)){
  52. didSomething=true;
  53. }
  54. }catch(Exceptione){
  55. ......
  56. }
  57. }else{
  58. ......
  59. }
  60. }
  61. ......
  62. returntrue;
  63. }
  64. ......
  65. }

在前面的Step 23中,已经创建了一个ProcessRecord,这里首先通过pid将它取回来,放在app变量中,然后对app的其它成员进行初始化,最后调用mMainStack.realStartActivityLocked执行真正的Activity启动操作。这里要启动的Activity通过调用mMainStack.topRunningActivityLocked(null)从堆栈顶端取回来,这时候在堆栈顶端的Activity就是MainActivity了。

更多相关文章

  1. Android应用程序启动过程源代码分析(2)
  2. android WebView java与js相互调用
  3. Momo自定义DialogFragment
  4. android快捷卸载第三方应用
  5. Android(安卓)2D绘图总结
  6. android 调用系统应用
  7. android实现调用系统音乐播放器
  8. Debug native code using addr2line on Android--再转一个Androi
  9. 自定义Android(安卓)editText

随机推荐

  1. Android百度地图调用和GPS定位
  2. Android(安卓)内存泄漏调试(转载)
  3. Android的Animation的onAnimationXXX/onA
  4. android RecyclerView布局真的只是那么简
  5. 处女男学Android(十三)---Android(安卓)轻
  6. Android(安卓)DiskLruCache完全解析,硬盘
  7. Android Studio无法真机调试
  8. Android APIDemos 研读之一:android.graph
  9. [Android]Thread线程入门3--多线程
  10. 启动一个没有界面的Activity(且没有焦点)