Launcher3开发学习总结

发布时间:2026/7/11 10:39:23
Launcher3开发学习总结 本文以展锐 Android10平台为例。编译编译时用 make Launcher3QuickStep -j4 而不是 make Launcher3 -j4界面结构Launcher.java 对应布局 launcher.xml当前界面 WorkspaceCellLayout 是单一页。桌面图标排列布局LauncherProvider.java处控制桌面图标的加载。/** * Loads the default workspace based on the following priority scheme: * 1) From the app restrictions * 2) From a package provided by play store * 3) From a partner configuration APK, already in the system image * 4) The default configuration for the particular device */ synchronized private void loadDefaultFavoritesIfNecessary() { SharedPreferences sp Utilities.getPrefs(getContext()); if (sp.getBoolean(mOpenHelper.getKey(EMPTY_DATABASE_CREATED), false)) { Log.d(TAG, loading default workspace); AppWidgetHost widgetHost mOpenHelper.newLauncherWidgetHost(); AutoInstallsLayout loader createWorkspaceLoaderFromAppRestriction(widgetHost); if (loader null) { Log.d(TAG, 11111111111e); loader AutoInstallsLayout.get(getContext(),widgetHost, mOpenHelper); } if (loader null) { Log.d(TAG, 11222222); final Partner partner Partner.get(getContext().getPackageManager()); if (partner ! null partner.hasDefaultLayout()) { Log.d(TAG, 3333333); final Resources partnerRes partner.getResources(); int workspaceResId partnerRes.getIdentifier(Partner.RES_DEFAULT_LAYOUT, xml, partner.getPackageName()); if (workspaceResId ! 0) { Log.d(TAG, 4444444); loader new DefaultLayoutParser(getContext(), widgetHost, mOpenHelper, partnerRes, workspaceResId); } } } final boolean usingExternallyProvidedLayout loader ! null; if (loader null) { Log.d(TAG, 555555); loader getDefaultLayoutParser(widgetHost); } // There might be some partially restored DB items, due to buggy restore logic in // previous versions of launcher. mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); // Populate favorites table with initial favorites if ((mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), loader) 0) usingExternallyProvidedLayout) { // Unable to load external layout. Cleanup and load the internal layout. mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase()); mOpenHelper.loadFavorites(mOpenHelper.getWritableDatabase(), getDefaultLayoutParser(widgetHost)); } clearFlagEmptyDbCreated(); } }非GMS版本要看Launcher3/res/xml/default_workspace**.xml 的配置。可在device_profiles.xml 中查看配置的是哪个布局文件go版本在 go/res/xml/device_profiles.xml以 default_workspace_4x3.xml 为例favorites xmlns:launcherhttp://schemas.android.com/apk/res-auto/com.android.launcher3 !-- Hotseat (We use the screen as the position of the item in the hotseat) -- !-- Dialer, Messaging, Browser, Camera -- resolve launcher:container-101 launcher:screen0 launcher:x0 launcher:y0 favorite launcher:uri#Intent;actionandroid.media.action.STILL_IMAGE_CAMERA;end / favorite launcher:uri#Intent;actionandroid.intent.action.CAMERA_BUTTON;end / /resolve resolve launcher:container-101 launcher:screen1 launcher:x1 launcher:y0 favorite launcher:uri#Intent;actionandroid.intent.action.MAIN;categoryandroid.intent.category.APP_GALLERY;end / /resolve resolve launcher:container-101 launcher:screen2 launcher:x2 launcher:y0 !-- favorite launcher:uri#Intent;actionandroid.intent.action.MAIN;categoryandroid.intent.category.APP_SETTINGS;end / -- favorite launcher:packageNamecom.android.settings launcher:classNamecom.android.settings.Settings launcher:uriandroid.settings.SETTINGS / /resolve !-- Bottom row -- resolve launcher:screen0 launcher:x0 launcher:y-1 favorite launcher:uri#Intent;actionandroid.intent.action.MAIN;categoryandroid.intent.category.APP_TURBOTEST;end / /resolve resolve launcher:screen0 launcher:x1 launcher:y-1 favorite launcher:uri#Intent;actionandroid.intent.action.MAIN;categoryandroid.intent.category.APP_STORE;end / favorite launcher:uri#Intent;typeimages/*;end / /resolve resolve launcher:screen0 launcher:x2 launcher:y-1 favorite launcher:uri#Intent;actionandroid.intent.action.MAIN;categoryandroid.intent.category.APP_AGINGTEST;end / /resolve /favorites一个resolve中配置一个应用图标同一个resolve 中不同的favorite是为了兼容不同版本的intent。launcher:container-101 控制最下面的hotseat. 没有的是上面的快捷区。GMS版本要看vendor/google/apps/GmsSampleIntegration/***/xml/partner_default_layout.xml中的覆盖情况。控制应用图标隐藏复写AppFilter 的实现类AppFilterImpl 并配置 app_filter_class 为对应实现的类即可。注意事项AppFilterImpl必须实现 带Context 参数的构造函数AppFilterImpl(Context context)参考 Android Launcher3 隐藏应用图标和widget的显示部分事件处理禁用 应用长按显示信息或拖拽事件ItemLongClickListener.java 中 canStartDrag函数中返回false 即可。禁用长按空白地方弹出widget等项在 WorkspaceTouchListener 中的 canHandleLongPress 函数中返回false 即可。