因此,这里就返回com.android.launcher2.Launcher这个Activity了。由于是第一次启动这个Activity,接下来调用函数getProcessRecordLocked返回来的ProcessRecord值为null,于是,就调用mMainStack.startActivityLocked函数启动com.android.launcher2.Launcher这个Activity了,这里的mMainStack是一个ActivityStack类型的成员变量。 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文件中:
view plain
1. 2.
public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {
3. 4. 5. 6. 7. 8. 9.
......
@Override
protected void onCreate(Bundle savedInstanceState) { ......
if (!mRestoring) {
10. mModel.startLoader(this, true); 11. } 12.
13. ...... 14. } 15.
16. ...... 17. }
这里的mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader成员函数来执行加应用程序的操作。
Step 15. LauncherModel.startLoader
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
view plain
1. 2. 3. 4. 5. 6.
public class LauncherModel extends BroadcastReceiver { ......
public void startLoader(Context context, boolean isLaunching) { ......
7. 8. 9.
synchronized (mLock) { ......
10. // Don't bother to start the thread if we know it's not going to do anything
11. if (mCallbacks != null && mCallbacks.get() != null) { 12. // If there is already one running, tell it to stop. 13. LoaderTask oldTask = mLoaderTask; 14. if (oldTask != null) {
15. if (oldTask.isLaunching()) {
16. // don't downgrade isLaunching if we're already running 17. isLaunching = true; 18. }
19. oldTask.stopLocked(); 20. }
21. mLoaderTask = new LoaderTask(context, isLaunching); 22. sWorker.post(mLoaderTask); 23. } 24. } 25. } 26.
27. ...... 28. }
这里不是直接加载应用程序,而是把加载应用程序的操作作为一个消息来处理。这里的sWorker是一个Handler,通过它的post方式把一个消息放在消息队列中去,然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息,这个mLoaderTask是LoaderTask类型的实例,于是,下面就会执行LoaderTask类的run函数了。 Step 16. LoaderTask.run
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
view plain
1. 2. 3. 4. 5. 6. 7. 8. 9.
public class LauncherModel extends BroadcastReceiver { ......
private class LoaderTask implements Runnable { ......
public void run() { ......
10. keep_running: { 11. ......
12.
13. // second step
14. if (loadWorkspaceFirst) { 15. ......
16. loadAndBindAllApps(); 17. } else { 18. ...... 19. } 20.
21. ...... 22. } 23.
24. ...... 25. } 26.
27. ...... 28. } 29.
30. ...... 31. }
这里调用loadAndBindAllApps成员函数来进一步操作。 Step 17. LoaderTask.loadAndBindAllApps
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
view plain
1. 2. 3. 4. 5. 6. 7. 8. 9.
public class LauncherModel extends BroadcastReceiver { ......
private class LoaderTask implements Runnable { ......
private void loadAndBindAllApps() { ......
10. if (!mAllAppsLoaded) { 11. loadAllAppsByBatch(); 12. if (mStopped) { 13. return; 14. }
15. mAllAppsLoaded = true; 16. } else {
17. onlyBindAllApps();
18. } 19. } 20. 21.
22. ...... 23. } 24.
25. ...... 26. }
由于还没有加载过应用程序,这里的mAllAppsLoaded为false,于是就继续调用loadAllAppsByBatch函数来进一步操作了。
Step 18. LoaderTask.loadAllAppsByBatch
这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:
view plain
1. 2. 3. 4. 5. 6. 7. 8. 9.
public class LauncherModel extends BroadcastReceiver { ......
private class LoaderTask implements Runnable { ......
private void loadAllAppsByBatch() { ......
10. final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 11. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 12.
13. final PackageManager packageManager = mContext.getPackageManager(); 14. List
16. int N = Integer.MAX_VALUE; 17.
18. int startIndex; 19. int i=0;
20. int batchSize = -1;
21. while (i < N && !mStopped) { 22. if (i == 0) {
23. mAllAppsList.clear(); 24. ......
25. apps = packageManager.queryIntentActivities(mainIntent, 0); 26. 27. ......