美文网首页Android 源码分析
Android源码(3) --- 系统Launcher 启动流程

Android源码(3) --- 系统Launcher 启动流程

作者: jfson_土豆 | 来源:发表于2017-06-03 17:15 被阅读92次

    Launcher 启动流程

    • 1 启动Launcher
    • 在之前分析了一下SystemServer源码,最后启动boot/core/other ... Service,在startOtherService 中,有调用到 mActivityManagerService.systemReady();
    mActivityManagerService.systemReady(new Runnable() {
                @Override
                public void run() {
                    Slog.i(TAG, "Making services ready");
                    mSystemServiceManager.startBootPhase(
                SystemService.PHASE_ACTIVITY_MANAGER_READY);
                    try { mActivityManagerService.startObservingNativeCrashes();
                    } catch (Throwable e) {
                        reportWtf("observing native crashes", e);
                    }
    
                    try {
                        startSystemUi(context);
                    } catch (Throwable e) {
                        reportWtf("starting System UI", e);
                    }
                    try {
                        if (networkScoreF != null) networkScoreF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("making Network Score Service ready", e);
                    }
                    try {
                        if (networkManagementF != null) networkManagementF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("making Network Managment Service ready", e);
                    }
                    try {
                        if (networkStatsF != null) networkStatsF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("making Network Stats Service ready", e);
                    }
                    try {
                        if (networkPolicyF != null) networkPolicyF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("making Network Policy Service ready", e);
                    }
                    try {
                        if (connectivityF != null) connectivityF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("making Connectivity Service ready", e);
                    }
                    try {
                        if (audioServiceF != null) audioServiceF.systemReady();
                    } catch (Throwable e) {
                        reportWtf("Notifying AudioService running", e);
                    }
                    Watchdog.getInstance().start();
                }
            });
        }
    
    • 通过源码可以看到其中大多是系统服务systemReady()操作,重点关注一下Launcher所进行的操作流程,ActivityManagerService.systemReady();
    public void systemReady(final Runnable goingCallback) {
            ......  各种校验 System ready 情况 ......
            Slog.i(TAG, "System now ready");
                
            // Make sure we have no pre-ready processes sitting around.
    
    
            retrieveSettings();
            loadResourcesOnSystemReady();
    
    
            // Start up initial activity.
            mBooting = true;
            startHomeActivityLocked(mCurrentUserId, "systemReady");
            
            ......
        }
    
    • 这里主要是校验各种System ready 情况,最后调用startHomeActivityLocked();
    boolean startHomeActivityLocked(int userId, String reason) {
            if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                    && mTopAction == null) {
                // We are running in factory test mode, but unable to find
                // the factory test app, so just sit around displaying the
                // error message and don't try to start anything.
                return false;
            }
            Intent intent = getHomeIntent();
            ActivityInfo aInfo =
                resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
            if (aInfo != null) {
                intent.setComponent(new ComponentName(
                        aInfo.applicationInfo.packageName, aInfo.name));
                // Don't do this if the home app is currently being
                // instrumented.
                aInfo = new ActivityInfo(aInfo);
                aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
                ProcessRecord app = getProcessRecordLocked(aInfo.processName,
                        aInfo.applicationInfo.uid, true);
                if (app == null || app.instrumentationClass == null) {
                    intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                    mStackSupervisor.startHomeActivity(intent, aInfo, reason);
                }
            }
    
            return true;
        }
        
        
       Intent getHomeIntent() {
            Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
            intent.setComponent(mTopComponent);
            if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
                intent.addCategory(Intent.CATEGORY_HOME);
            }
            return intent;
        }
    
    
    • 这里很清晰,先通过getHomeIntent获取 Intent之后,startHomeActivity进行start。而了Intent.CATEGORY_HOME常量是Android的androidmanifest.xml清单文件中的常量。
    void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) {
            moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason);
            startActivityLocked(...);
            
           if (inResumeTopActivity) {
                scheduleResumeTopActivities();
            }
        }
    
    • 最后调用到的是startActivityLocked(),这里其实启动的是清单文件中声明的Launcher的Activity类

    • 2.LauncherActivity

    • LauncherActivity 继承自 ListActivity,layout 文件十分简单,一个ListView,一个TextView,从生命周期OnCreate()来看

    protected void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            
            mPackageManager = getPackageManager();
    
            if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
                requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
                setProgressBarIndeterminateVisibility(true);
            }
            onSetContentView();
    
            mIconResizer = new IconResizer();
            
            mIntent = new Intent(getTargetIntent());
            mIntent.setComponent(null);
            mAdapter = new ActivityAdapter(mIconResizer);
    
            setListAdapter(mAdapter);
            getListView().setTextFilterEnabled(true);
    
            updateAlertTitle();
            updateButtonText();
    
            if (!mPackageManager.hasSystemFeature(PackageManager.FEATURE_WATCH)) {
                setProgressBarIndeterminateVisibility(false);
            }
        }
    
    
    * 其中 getPackageManager() 是获取应用列表,以及应用信息,并将数据注入Adapter,显示到桌面。
    
    protected void onListItemClick(ListView l, View v, int position, long id) {
            Intent intent = intentForPosition(position);
            startActivity(intent);
        }
    

    在点击图标的点击事件回调中,将Intent取出来后,并启动Activity.至此启动应用。Launcher 启动结束。

    相关文章

      网友评论

        本文标题:Android源码(3) --- 系统Launcher 启动流程

        本文链接:https://www.haomeiwen.com/subject/cglmfxtx.html