Android系统默认Home应用程序(Launcher)的启动过程源代码分析(3)
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- publicfinalclassLauncherextendsActivity
- implementsView.OnClickListener,OnLongClickListener,LauncherModel.Callbacks,AllAppsView.Watcher{
- ......
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- ......
- if(!mRestoring){
- mModel.startLoader(this,true);
- }
- ......
- }
- ......
- }
这里的mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader成员函数来执行加应用程序的操作。
Step 15.LauncherModel.startLoader
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
[java] view plain copy- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- publicvoidstartLoader(Contextcontext,booleanisLaunching){
- ......
- synchronized(mLock){
- ......
- //Don'tbothertostartthethreadifweknowit'snotgoingtodoanything
- if(mCallbacks!=null&&mCallbacks.get()!=null){
- //Ifthereisalreadyonerunning,tellittostop.
- LoaderTaskoldTask=mLoaderTask;
- if(oldTask!=null){
- if(oldTask.isLaunching()){
- //don'tdowngradeisLaunchingifwe'realreadyrunning
- isLaunching=true;
- }
- oldTask.stopLocked();
- }
- mLoaderTask=newLoaderTask(context,isLaunching);
- sWorker.post(mLoaderTask);
- }
- }
- }
- ......
- }
这里不是直接加载应用程序,而是把加载应用程序的操作作为一个消息来处理。这里的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- publicclassLauncherModelextendsBroadcastReceiver{
- ......
- privateclassLoaderTaskimplementsRunnable{
- ......
- publicvoidrun(){
- ......
- keep_running:{
- ......
- //secondstep
- if(loadWorkspaceFirst){
- ......
- loadAndBindAllApps();
- }else{
- ......
- }
- ......
- }
- ......
- }
- ......
- }
- ......
- }
这里调用loadAndBindAllApps成员函数来进一步操作。
更多相关文章
- Android TextView 自定义字体设置(华文行楷TTF)
- Android 4.0为Launcher主界面所有应用程序图标添加统一背景主题
- (4.1.15.1) Android简单自定义圆形和水平ProgressBar
- 2种自定义android标题栏titleBar的方法
- Android系统在新进程中启动自定义服务过程(startService)的原理分
- android 应用程序跳转到Settings的各个界面