µÚÒ»·¶ÎÄÍø - רҵÎÄÕ·¶ÀýÎĵµ×ÊÁÏ·ÖÏíÆ½Ì¨

AndroidϵͳĬÈÏHomeÓ¦ÓóÌÐò(Launcher)µÄÆô¶¯¹ý³ÌÔ´´úÂë·ÖÎö

À´Ô´£ºÓû§·ÖÏí ʱ¼ä£º2025/10/1 13:07:05 ±¾ÎÄÓÉloading ·ÖÏí ÏÂÔØÕâÆªÎĵµÊÖ»ú°æ
˵Ã÷£ºÎÄÕÂÄÚÈݽö¹©Ô¤ÀÀ£¬²¿·ÖÄÚÈÝ¿ÉÄܲ»È«£¬ÐèÒªÍêÕûÎĵµ»òÕßÐèÒª¸´ÖÆÄÚÈÝ£¬ÇëÏÂÔØwordºóʹÓá£ÏÂÔØwordÓÐÎÊÌâÇëÌí¼Ó΢ÐźÅ:xxxxxxx»òQQ£ºxxxxxx ´¦Àí£¨¾¡¿ÉÄܸøÄúÌṩÍêÕûÎĵµ£©£¬¸ÐлÄúµÄÖ§³ÖÓëÁ½⡣

Òò´Ë£¬ÕâÀï¾Í·µ»Ø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 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. ......

ËÑË÷¸ü¶à¹ØÓÚ£º AndroidϵͳĬÈÏHomeÓ¦ÓóÌÐò(Launcher)µÄ µÄÎĵµ
AndroidϵͳĬÈÏHomeÓ¦ÓóÌÐò(Launcher)µÄÆô¶¯¹ý³ÌÔ´´úÂë·ÖÎö.doc ½«±¾ÎĵÄWordÎĵµÏÂÔØµ½µçÄÔ£¬·½±ã¸´ÖÆ¡¢±à¼­¡¢ÊղغʹòÓ¡
±¾ÎÄÁ´½Ó£ºhttps://www.diyifanwen.net/c5fzbz9w6by9ersa9r11q_3.html£¨×ªÔØÇë×¢Ã÷ÎÄÕÂÀ´Ô´£©

Ïà¹ØÍÆ¼ö£º

ÈÈÃÅÍÆ¼ö
Copyright © 2012-2023 µÚÒ»·¶ÎÄÍø °æÈ¨ËùÓÐ ÃâÔðÉùÃ÷ | ÁªÏµÎÒÃÇ
ÉùÃ÷ :±¾ÍøÕ¾×ðÖØ²¢±£»¤ÖªÊ¶²úȨ£¬¸ù¾Ý¡¶ÐÅÏ¢ÍøÂç´«²¥È¨±£»¤ÌõÀý¡·£¬Èç¹ûÎÒÃÇ×ªÔØµÄ×÷Æ·ÇÖ·¸ÁËÄúµÄȨÀû,ÇëÔÚÒ»¸öÔÂÄÚ֪ͨÎÒÃÇ£¬ÎÒÃǻἰʱɾ³ý¡£
¿Í·þQQ£ºxxxxxx ÓÊÏ䣺xxxxxx@qq.com
ÓåICP±¸2023013149ºÅ
Top