Òò´Ë£¬ÕâÀï¾Í·µ»Øcom.android.launcher2.LauncherÕâ¸öActivityÁË¡£ÓÉÓÚÊǵÚÒ»´ÎÆô¶¯Õâ¸öActivity£¬½ÓÏÂÀ´µ÷Óú¯ÊýgetProcessRecordLocked·µ»ØÀ´µÄProcessRecordֵΪnull£¬ÓÚÊÇ£¬¾Íµ÷ÓÃmMainStack.startActivityLockedº¯ÊýÆô¶¯com.android.launcher2.LauncherÕâ¸öActivityÁË£¬ÕâÀïµÄmMainStackÊÇÒ»¸öActivityStackÀàÐ͵ijÉÔ±±äÁ¿¡£ 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ÀàÐ͵ijÉÔ±±äÁ¿£¬ÕâÀïͨ¹ýµ÷ÓÃËüµÄ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. ......
Ïà¹ØÍÆ¼ö£º