源码分析之应用程序启动过程

整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:

1、 Step1 - Step11:Launcher通过Binder进程间通信机制通知ActivityManagerService要启动一个Activity;

2、 Step12 - Step16:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;

3、 Step17 - Step24:Launcher通过Binder进程间通信机制通知ActivityManagerService它已经准备就绪,ActivityManagerService就创建一个新的进程用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;

4、 Step25 - Step27:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;

5、 Step28 - Step35:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪它可以真正执行Activity的启动操作了;

Step 1. Launcher.startActivitySafely
   
   
在Android系统中,应用程序是由Launcher启动起来的;其实Launcher本身也是一个应用程序,其它的应用程序安装后就会在Launcher的界面上出现一个相应的图标,点击这个图标时Launcher就会启动对应的应用程序
Step 2. Activity.startActivityForResult
   
   
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory,Window.Callback,KeyEvent.Callback,OnCreateContextMenuListener, ComponentCallbacks {
......
public void startActivityForResult(Intent intent, int requestCode) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
......
} else {
......
}
......
}
.......
}
    
    
①这里的mInstrumentationActivity类的成员变量,它的类型是Intrumentation,它用来监控应用程序和系统的交互。
②这里的mMainThread也是Activity类的成员变量,它的类型是ActivityThread,它代表的是应用程序的主线程,这里通过mMainThread.getApplicationThread获得它里面的ApplicationThread成员变量,它是一个Binder对象,ActivityManagerService会使用它来和ActivityThread来进行进程间通信。
③这里我们需注意的是,这里的mMainThread代表的是Launcher应用程序运行的进程。
④这里的mToken也是Activity类的成员变量,它是一个Binder对象的远程接口。
Step 04. Instrumentation.execStartActivity
Step 05. ActivityManagerProxy.startActivity
Step 06. ActivityManagerService.startActivity
Step 07. ActivityStack.startActivityMayWait
Step 08. ActivityStack.startActivityLocked
Step 09. ActivityStack.startActivityUncheckedLocked
Step 10. Activity.resumeTopActivityLocked
Step 11. ActivityStack.startPausingLocked
Step 12. ApplicationThreadProxy.schedulePauseActivity
Step 13. ApplicationThread.schedulePauseActivity
Step 14. ActivityThread.queueOrSendMessage
Step 15. H.handleMessage
Step 16. ActivityThread.handlePauseActivity
Step 17. ActivityManagerProxy.activityPaused
Step 18. ActivityManagerService.activityPaused
Step 19. ActivityStack.activityPaused
Step 20. ActivityStack.completePauseLocked
Step 21. ActivityStack.resumeTopActivityLokced
Step 22. ActivityStack.startSpecificActivityLocked
Step 23. ActivityManagerService.startProcessLocked
Step 24.  ActivityThread.main
  
  
public final class ActivityThread {
......
private final void attach(boolean system) {
......
mSystemThread = system;
if (!system) {
......
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
}
} else {
......
}
}
......
public static final void main(String[] args) {
.......
ActivityThread thread = new ActivityThread();
thread.attach(false);
......
Looper.loop();
.......
thread.detach();
......
}
}
Step 25. ActivityManagerProxy.attachApplication
Step 26. ActivityManagerService.attachApplication
Step 27. ActivityManagerService.attachApplicationLocked
Step 28. ActivityStack.realStartActivityLocked
Step 29. ApplicationThreadProxy.scheduleLaunchActivity
Step 30. ApplicationThread.scheduleLaunchActivity
Step 31. ActivityThread.queueOrSendMessage
Step 32. H.handleMessage
Step 33. ActivityThread.handleLaunchActivity
Step 34.  ActivityThread.performLaunchActivity
Step 35.  MainActivity.onCreate

详细过程下次再分析,启动流程就是这样;在下一篇文章中将会结合应用程序内部启动另一个Activity的过程,具体分析新的Activity与启动它的Activity将会在同一个进程(Process)和任务(Task)运行



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值