Android系统默认Home应用程序(Launcher)的启动过程源代码分析 下载本文

因此,这里就返回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 apps = null; 15.

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. ......