简介:
Launcher是Android系统中默认的桌面应用程序,负责管理设备的屏幕和应用程序图标。本文将详细介绍Launcher的启动过程,并使用源代码示例进行说明。
Launcher的启动过程:
下面是Launcher的启动过程的详细步骤:
- 由系统框架启动应用程序进程。
Launcher是Android系统默认的应用程序,它会在系统启动时被自动加载。与其他应用程序一样,它是由系统框架启动的。系统框架会加载以"com.android.launcher3.Launcher"为启动器的类,然后启动Launcher应用程序。
- 加载应用程序主入口函数。
在Launcher应用程序启动时,系统框架会加载应用程序主入口函数。这个函数负责初始化Launcher应用程序并为用户提供UI界面。
- 加载主Activity。
主Activity是指Launcher应用程序中的MainActivity,它是应用程序的入口点。系统框架会实例化MainActivity并调用其onCreate()方法。
- 加载设计资源。
Launcher应用程序中的设计资源是指应用程序的UI元素,例如:图标、背景、字体等资源。这些资源是在应用程序启动时加载的,并用于构建应用程序的UI界面。
- 加载布局文件。
Launcher应用程序中的布局文件包含了应用程序的UI元素的结构和排列方式。这些布局文件是在应用程序启动时加载的,并用于构建应用程序的UI界面。
- 加载LauncherModel。
LauncherModel是Launcher应用程序的数据模型。它负责管理设备上所有应用程序的图标和应用程序的位置。LauncherModel还负责从系统资源中获取新安装的应用程序,并将其更新到Launcher中。
下面是LauncherModel的构造函数的源代码示例:
public LauncherModel(LauncherAppState app) {
// Load configuration from a different thread.
mApp = app;
mIconCache = app.getIconCache();
mBgAllAppsList = new DeferredHandler();
mWorkerHandlerThread = new HandlerThread("launcher-loader");
mWorkerHandlerThread.start();
mWorkerHandler = new WorkerHandler(mWorkerHandlerThread.getLooper());
mModelCache = new LoaderResultsCache(this);
}
- 加载界面布局。
Launcher应用程序中的UI布局是通过加载Fragment获得的。Launcher应用程序中有多个Fragment,包括:工作区、小部件和小部件配置屏幕等。Fragment以类似Activity的方式加载。系统框架会加载包含这些Fragment的布局资源,并在应用程序启动时使用这些资源。
下面是Launcher应用程序中加载工作区的源代码示例:
private void populateWorkspace() {
Runnable r = new Runnable() {
public void run() {
mWorkspace.loadUserItems(false);
if (mSynchronouslyBound) {
mSynchronouslyBound = false;
mDragLayer.onAppsBound();
mWorkspace.post(new Runnable() {
public void run() {
mOverlayDrawer.startDiscoveryAnimation();
}
});
}
}
};
runOnMainThread(r, BIND_WORKSPACE_SCREEN_TIMEOUT_SECONDS);
}
- 加载小部件。
小部件是常驻应用程序,它们在设备上运行并提供有用的功能。Launcher应用程序中的小部件在应用程序启动时加载。这些小部件的位置和大小信息存储在LauncherModel中。
下面是Launcher应用程序中加载小部件的源代码示例:
private void populateAppWidgetHostView(AppWidgetHostView view, ItemInfo info, LauncherAppWidgetProviderInfo appWidgetInfo) {
view.setAppWidget(appWidgetInfo);
view.setTag(info);
info.applyFromAppWidgetProviderInfo(appWidgetInfo);
view.setVisibility(View.VISIBLE);
}
- 加载小部件配置屏幕。
小部件配置屏幕是一个用于管理和配置小部件的界面。在Launcher应用程序启动时,会检查是否需要打开小部件配置屏幕。如果需要,系统框架会加载小部件配置屏幕并启动它。
下面是Launcher应用程序中打开小部件配置屏幕的源代码示例:
private void showAllApps(boolean animated, boolean fromHome) {
if (mState == State.APPS_SPRING_LOADED || mState == State.APPS_SPRING_LOADED_HIGHLIGHTED) {
return;
}
if (mState == State.WORKSPACE) {
mWorkspace.setVisibility(View.INVISIBLE);
}
mStateTransitionAnimation = animated;
if (mState != State.WORKSPACE_HIDDEN) {
if (AppsCustomizePagedView.DISABLE_ALL_APPS) {
showWorkspace(animated);
} else {
showAppsCustomizeHelper(animated, false, fromHome);
}
}
}
- 启动应用程序。
Launcher应用程序中的应用程序图标是一个View对象。当用户点击应用程序图标时,系统框架会启动指定的应用程序并将其显示在屏幕上。
下面是Launcher应用程序中启动应用程序的源代码示例:
private void startActivitySafely(View v, Intent intent, ItemInfo item) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (item != null && item instanceof ShortcutInfo) {
int[] pos = new int[2];
v.getLocationOnScreen(pos);
intent.putExtra(EXTRA_SHORTCUT_ID, ((ShortcutInfo)item).id);
intent.putExtra(EXTRA_SHORTCUT_INTENT, intent);
intent.putExtra(EXTRA_SHORTCUT_ICON_RESOURCE, ((ShortcutInfo)item).iconResource);
intent.putExtra(EXTRA_SHORTCUT_ICON, ((ShortcutInfo)item).iconBitmap);
intent.putExtra(EXTRA_SHORTCUT_ICON_PACKAGE, ((ShortcutInfo)item).iconResource.packageName);
intent.putExtra(EXTRA_SHORTCUT_ICON_RESOURCE_TYPE, ((ShortcutInfo)item).iconResource.resourceTypeName);
intent.putExtra(EXTRA_SHORTCUT_ADDED_TO_HOME, ((ShortcutInfo)item).isAddedToHome());
intent.putExtra(EXTRA_ANIMATED_THUMBNAIL, mDragLayer.getAnimatedIconBitmap());
intent.putExtra(EXTRA_CONTROLLER, mStats);
intent.putExtra(EXTRA_DOWN_AND_OUT, true);
intent.putExtra(EXTRA_PROFILE, mUser);
intent.putExtra(EXTRA_DIRECT_CALL_SHORTCUT, true);
intent.putExtra(EXTRA_ANIM_SCALE_FACTOR, mZoomScale);
intent.putExtra(EXTRA_DRAG_SOURCE_Y_OFFSET, mIconDragEvent.getY()
- (mDragLayer.getInsets().top - mWorkspace.getInsets().top + pos[1]));
}
mStats.recordLaunch(intent, item);
getContext().startActivity(intent);
}