第一范文网 - 专业文章范例文档资料分享平台

Android系统启动流程(四)Launcher启动过程与系统启动流程

来源:用户分享 时间:2025/7/23 19:04:00 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

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(callbacks); } }

在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(); }

Android系统启动流程(四)Launcher启动过程与系统启动流程.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c7v5dc6h5hm4qfr01784a35m4y31ezc0154v_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top