Android Launcher加载widget 等view的流程

本文详细解析了Android 8.0版本中Launcher的应用加载流程,包括主屏幕布局、应用程序图标和小部件的加载过程。文章重点介绍了Launcher如何从后台加载数据、更新应用列表以及加载桌面小部件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android版本8.0

1. Launcher加载app,shortcut,widget主流程

Launcher LauncherModel OtherSignal LoaderTask LoaderResults BgDataModel.widgetsModel Workspace CellLayout ShortcutAndWidgetContainer onCreate() 1 LauncherAppState.setLauncher 2 startLoaderFromBackground() 3 startLoader 4 startLoaderForResults 5 loadWorkspace() 6 bindWorkspace 7 loadAllApps() 8 bindAllApps 9 loadDeepShortcuts() 10 bindDeepShortcuts 11 update() 12 bindWidgets 13 bindWorkspaceItems 14 bindItems 15 addInScreen 16 addViewToCellLayout 17 addView(child, index, lp) 18 Launcher LauncherModel OtherSignal LoaderTask LoaderResults BgDataModel.widgetsModel Workspace CellLayout ShortcutAndWidgetContainer

2.loadWorkspace

final HashMap<String, Integer> installingPkgs =
    mPackageInstaller.updateAndGetActiveSessionCache();
mBgDataModel.workspaceScreens.addAll(LauncherModel.loadWorkspaceScreensDb(context));

Map<ShortcutKey, ShortcutInfoCompat> shortcutKeyToPinnedShortcuts = new HashMap<>();
final LoaderCursor c = new LoaderCursor(contentResolver.query(
    LauncherSettings.Favorites.CONTENT_URI, null, null, null, null), mApp);
.
.//create info
.
c.checkAndAddItem(info, mBgDataModel);

public void checkAndAddItem(ItemInfo info, BgDataModel dataModel) {
    if (checkItemPlacement(info, dataModel.workspaceScreens)) {
        dataModel.addItem(mContext, info, false);
    } else {
        markDeleted("Item position overlap");
    }
}

3.loadAllApps

final List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(null, user);

for (int i = 0; i < apps.size(); i++) {
    LauncherActivityInfo app = apps.get(i);
    mBgAllAppsList.add(new AppInfo(app, user, quietMode), app);
}


LauncherApps ILauncherApps LauncherAppsService PackageManagerInternal PackageManagerService getActivityList 1 getLauncherActivities 2 getLauncherActivities 3 queryActivitiesForUser 4 queryIntentActivities 5 queryIntentActivitiesInternal 6 LauncherApps ILauncherApps LauncherAppsService PackageManagerInternal PackageManagerService

4. LoadWidgets

mBgDataModel.widgetsModel.update(mApp, null);

Context context = app.getContext();
final ArrayList<WidgetItem> widgetsAndShortcuts = new ArrayList<>();
try {
    PackageManager pm = context.getPackageManager();
    InvariantDeviceProfile idp = app.getInvariantDeviceProfile();

    // Widgets
    AppWidgetManagerCompat widgetManager = AppWidgetManagerCompat.getInstance(context);
    for (AppWidgetProviderInfo widgetInfo : widgetManager.getAllProviders(packageUser)) {
        widgetsAndShortcuts.add(new WidgetItem(LauncherAppWidgetProviderInfo
                                               .fromProviderInfo(context, widgetInfo), pm, idp));
    }

    // Shortcuts
    for (ShortcutConfigActivityInfo info : LauncherAppsCompat.getInstance(context)
         .getCustomShortcutActivityList(packageUser)) {
        widgetsAndShortcuts.add(new WidgetItem(info));
    }
    setWidgetsAndShortcuts(widgetsAndShortcuts, app, packageUser);
} catch (Exception e) {
    if (!FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) {
        // the returned value may be incomplete and will not be refreshed until the next
        // time Launcher starts.
        // TODO: after figuring out a repro step, introduce a dirty bit to check when
        // onResume is called to refresh the widget provider list.
    } else {
        throw e;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值