Step 13. ActivityStack.startActivityLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中,具体可以参考Android应用程序启动过程源代码分析一文,这里就不详述了,在我们这个场景中,调用这个函数的最后结果就是把com.android.launcher2.Launcher启动起来,接着调用它的onCreate函数。

Step 14.Launcher.onCreate

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中:

[java] view plain copy
  1. publicfinalclassLauncherextendsActivity
  2. implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
  3. ......
  4. @Override
  5. protectedvoidonCreate(BundlesavedInstanceState){
  6. ......
  7. if(!mRestoring){
  8. mModel.startLoader(this,true);
  9. }
  10. ......
  11. }
  12. ......
  13. }

这里的mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader成员函数来执行加应用程序的操作。

Step 15.LauncherModel.startLoader

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:

[java] view plain copy
  1. publicclassLauncherModelextendsBroadcastReceiver{
  2. ......
  3. publicvoidstartLoader(Contextcontext,booleanisLaunching){
  4. ......
  5. synchronized(mLock){
  6. ......
  7. //Don'tbothertostartthethreadifweknowit'snotgoingtodoanything
  8. if(mCallbacks!=null&&mCallbacks.get()!=null){
  9. //Ifthereisalreadyonerunning,tellittostop.
  10. LoaderTaskoldTask=mLoaderTask;
  11. if(oldTask!=null){
  12. if(oldTask.isLaunching()){
  13. //don'tdowngradeisLaunchingifwe'realreadyrunning
  14. isLaunching=true;
  15. }
  16. oldTask.stopLocked();
  17. }
  18. mLoaderTask=newLoaderTask(context,isLaunching);
  19. sWorker.post(mLoaderTask);
  20. }
  21. }
  22. }
  23. ......
  24. }

这里不是直接加载应用程序,而是把加载应用程序的操作作为一个消息来处理。这里的sWorker是一个Handler,通过它的post方式把一个消息放在消息队列中去,然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息,这个mLoaderTask是LoaderTask类型的实例,于是,下面就会执行LoaderTask类的run函数了。

Step 16. LoaderTask.run

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:

[java] view plain copy
  1. publicclassLauncherModelextendsBroadcastReceiver{
  2. ......
  3. privateclassLoaderTaskimplementsRunnable{
  4. ......
  5. publicvoidrun(){
  6. ......
  7. keep_running:{
  8. ......
  9. //secondstep
  10. if(loadWorkspaceFirst){
  11. ......
  12. loadAndBindAllApps();
  13. }else{
  14. ......
  15. }
  16. ......
  17. }
  18. ......
  19. }
  20. ......
  21. }
  22. ......
  23. }

这里调用loadAndBindAllApps成员函数来进一步操作。

更多相关文章

  1. Android TextView 自定义字体设置(华文行楷TTF)
  2. Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题
  3. (4.1.15.1) Android简单自定义圆形和水平ProgressBar
  4. 2种自定义android标题栏titleBar的方法
  5. Android系统在新进程中启动自定义服务过程(startService)的原理分
  6. android 应用程序跳转到Settings的各个界面

随机推荐

  1. Android(安卓)AndroidProgressLayout:加载
  2. android中的反编译
  3. Android(安卓)和 iOS 版 Quickoffice 都
  4. 【Android(安卓)开发】:UI控件之 ImageVie
  5. android手机短信发送
  6. Android(安卓)init 启动过程分析(一)
  7. 以php开发服务器后台的android即时通讯ap
  8. Android从系统Gallery获取图片具体实现
  9. Android系统堆内存限制浅析
  10. Android的反射机制Reflection