当前位置:首页 > Android系统启动流程(四)Launcher启动过程与系统启动流程
android:name=\ android:launchMode=\ android:clearTaskOnLaunch=\ android:stateNotNeeded=\ android:theme=\ android:windowSoftInputMode=\ android:screenOrientation=\ android:configChanges=\ android:resumeWhilePausing=\ android:taskAffinity=\ android:enabled=\ 这样,应用程序Launcher就会被启动起来,并执行它的onCreate函数。 3.Launcher中应用图标显示流程 Launcher的onCreate函数如下所示。 packages/apps/Launcher3/src/com/android/launcher3/Launcher.java @Override protected void onCreate(Bundle savedInstanceState) { ... LauncherAppState app = LauncherAppState.getInstance();//1 mDeviceProfile = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? app.getInvariantDeviceProfile().landscapeProfile : app.getInvariantDeviceProfile().portraitProfile; mSharedPrefs = Utilities.getPrefs(this); mIsSafeModeEnabled = getPackageManager().isSafeMode(); mModel = app.setLauncher(this);//2 .... if (!mRestoring) { if (DISABLE_SYNCHRONOUS_BINDING_CURRENT_PAGE) { mModel.startLoader(PagedView.INVALID_RESTORE_PAGE);//2 } else { mModel.startLoader(mWorkspace.getRestorePage()); } } ... } 注释1处获取LauncherAppState的实例并在注释2处调用它的setLauncher函数并将Launcher对象传入,LauncherAppState的setLauncher函数如下所示。 packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java LauncherModel setLauncher(Launcher launcher) { getLauncherProvider().setLauncherProviderChangeListener(launcher); mModel.initialize(lawww.sm136.comuncher);//1 mAccessibilityDelegate = ((launcher != null) && Utilities.ATLEAST_LOLLIPOP) ? new LauncherAccessibilityDelegate(launcher) : null; return mModel; } 注释1处会调用LauncherModel的initialize函数: public void initialize(Callbacks callbacks) { synchronized (mLock) { unbindItemInfosAndClearQueuedBindRunnables(); mCallbacks = new WeakReference 在initialize函数中会将Callbacks,也就是传入的Launcher 封装成一个弱引用对象。因此我们得知mCallbacks变量指的就是封装成弱引用对象的Launcher,这个mCallbacks后文会用到它。 再回到Launcher的onCreate函数,在注释2处调用了LauncherModel的startLoader函数: packages/apps/Launcher3/src/com/android/launcher3/LauncherModel.java ... @Thunk static final HandlerThread sWorkerThread = new HandlerThread(\ static { sWorkerThread.start(); } @Thunk static final Handler sWorker = new Handler(sWorkerThread.getLooper());//2 ... public void startLoader(int synchronousBindPage, int loadFlags) {s InstallShortcutReceiver.enableInstallQueue(); synchronized (mLock) { synchronized (mDeferredBindRunnables) { mDeferredBindRunnables.clear(); } if (mCallbacks != null && mCallbacks.get() != null) { stopLoaderLocked(); mLoaderTask = new LoaderTask(mApp.getContext(), loadFlags);//3 if (synchronousBindPage != PagedView.INVALID_RESTORE_PAGE &&mAllAppsLoaded&&mWorkspaceLoaded && !mIsLoaderTaskRunning) { mLoaderTask.runBindSynchronousPage(synchronousBindPage); } else { sWorkerThread.setPriority(Thread.NORM_PRIORITY); sWorker.post(mLoaderTask);//4 } } } } 注释1处创建了具有消息循环的线程HandlerThread对象。注释2处创建了Handler,并且传入HandlerThread的Looper。Hander的作用就是向HandlerThread发送消息。在注释3处创建LoaderTask,在注释4处将LoaderTask作为消息发送给HandlerThread 。 LoaderTask类实现了Runnable接口,当LoaderTask所描述的消息被处理时则会调用它的run函数,代码如下所示 private class LoaderTask implements Runnable { ... public void run() { synchronized (mLock) { if (mStopped) { return; } mIsLoaderTaskRunning = true; } keep_running: { if (DEBUG_LOADERS) Log.d(TAG, \ loadAndBindWorkspace();//1 if (mStopped) { break keep_running; } waitForIdle(); if (DEBUG_LOADERS) Log.d(TAG, \ loadAndBindAllApps();//2 } mContext = null; synchronized (mLock) { if (mLoaderTask == this) { mLoaderTask = null; } mIsLoaderTaskRunning = false; mHasLoaderCompletedOnce = true; } } ... } Launcher是用工作区的形式来显示系统安装的应用程序的快捷图标,每一个工作区都是来描述一个抽象桌面的,它由n个屏幕组成,每个屏幕又分n个单元格,每个单元格用来显示一个应用程序的快捷图标。注释1处调用loadAndBindWorkspace函数用来加载工作区信息,注释2处的loadAndBindAllApps函数是用来加载系统已经安装的应用程序信息,loadAndBindAllApps函数代码如下所示。 private void loadAndBindAllApps() { if (DEBUG_LOADERS) { Log.d(TAG, \ } if (!mAllAppsLoaded) { loadAllApps();//1 synchronized (LoaderTask.this) { if (mStopped) { return; } } updateIconCache(); synchronized (LoaderTask.this) { if (mStopped) { return; } mAllAppsLoaded = true; } } else { onlyBindAllApps(); }
共分享92篇相关文档