云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > Android系统启动流程(四)Launcher启动过程与系统启动流程

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

  • 62 次阅读
  • 3 次下载
  • 2025/6/22 21:31:47

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

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com