Android Framework分析Launcher启动过程

Android Framework分析Launcher启动过程_第1张图片

简介:

Launcher是Android系统中默认的桌面应用程序,负责管理设备的屏幕和应用程序图标。本文将详细介绍Launcher的启动过程,并使用源代码示例进行说明。

Launcher的启动过程:

下面是Launcher的启动过程的详细步骤:

  1. 由系统框架启动应用程序进程。

Launcher是Android系统默认的应用程序,它会在系统启动时被自动加载。与其他应用程序一样,它是由系统框架启动的。系统框架会加载以"com.android.launcher3.Launcher"为启动器的类,然后启动Launcher应用程序。

  1. 加载应用程序主入口函数。

在Launcher应用程序启动时,系统框架会加载应用程序主入口函数。这个函数负责初始化Launcher应用程序并为用户提供UI界面。

  1. 加载主Activity。

主Activity是指Launcher应用程序中的MainActivity,它是应用程序的入口点。系统框架会实例化MainActivity并调用其onCreate()方法。

  1. 加载设计资源。

Launcher应用程序中的设计资源是指应用程序的UI元素,例如:图标、背景、字体等资源。这些资源是在应用程序启动时加载的,并用于构建应用程序的UI界面。

  1. 加载布局文件。

Launcher应用程序中的布局文件包含了应用程序的UI元素的结构和排列方式。这些布局文件是在应用程序启动时加载的,并用于构建应用程序的UI界面。

  1. 加载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);
}
  1. 加载界面布局。

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);
}
  1. 加载小部件。

小部件是常驻应用程序,它们在设备上运行并提供有用的功能。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);
}
  1. 加载小部件配置屏幕。

小部件配置屏幕是一个用于管理和配置小部件的界面。在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);
        }
    }
}
  1. 启动应用程序。

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

你可能感兴趣的:(Android,android)