Launcher3 数据库初始化分析

Launcher3分析篇:(一、前导篇) Launcher作为Android手机启动后给用户展示的第一个应用,我想一步一步对Launcher3的源码进行分析并记录,也是为了让自己遗忘的时候可以看看。 下面正式开始Launcher3的分析,首先介绍一下主要的几个类: Launcer是显示Launcher的主Activity。我们看到的桌面就是它,是最核心且唯一的Activity。 LauncherAppState:单例对... 阅读详情

一.初始化创建launcher.db数据库,数据库里创建了两张表,分别是favorites和workspaceScrrens。

1.其表结构为:

 

2.内容为,举例:

3.字段含义:

 _id:用于标识区分各个应用图标,是表favorites的主键,当添加数据时通过generateNewId使_id值增加。

    title:在WorkSpace(HotSeat中一般会隐藏掉)中展示的应用快捷图标的标题。

    intent:当点击桌面图标时的负责启动应用的intent,它通过Intent.toUri()转换为String存储,在使用时通过Intent.parseUri()转换为intent。

    container:指的是当前数据所在的容器类型,在Launcher中有两种container类型:1.CONTAINER_DESKTOP(-100), 2.CONTAINER_HOTSEAT(-101)。

    screen:用于标识当前数据所在的页。当container为-100时,则screen的值表现为我们桌面的页数的值,当container为-101即当前快捷图标处于HotSeat时,则指快捷图标所在的第X个位置。

    cellX:当前快捷图标所在页(CellLayout)的X位置,即快捷图标在当前页横向的第X个位置。

    cellY:当前快捷图标所在页(CellLayout)的Y位置,即快捷图标在当前页纵向的第Y个位置。

    spanX:当前快捷图标的在所在页(CellLayout)的横向范围信息,如果当前图标为application、shortcut、folder则为1,表示图标横向上占据一个cell的位置范围。如果当前图标为Widget,则横向占据范围可能为多个cell。

    spanY:当前快捷图标的在所在页(CellLayout)的纵向范围信息,如果当前图标为application、shortcut、folder则为1,表示图标纵向上占据一个cell的位置范围。如果当前图标为Widget,则纵向占据范围可能为多个cell。

二.数据库的创建

1.数据库的创建是在LauncherProvider中,以ContentProvider的形式建立

三.数据库数据的初始化

1.在Launcher初始化数据类LoaderTask中,在loadWorkspace方法中调用了

    if (clearDb) {
            Log.d(TAG, "loadWorkspace: resetting launcher database");
            LauncherSettings.Settings.call(contentResolver,
                    LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB);
        }

        Log.d(TAG, "loadWorkspace: loading default favorites");
        LauncherSettings.Settings.call(contentResolver,
                LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES);

如果数据库clear的情况下,调用LauncherSettings.Setting.call方法重新建立数据库,如果有数据库,就配置默认的favorites表数据,call方法的真正实现在LauncherProvider中:

  @Override
    public Bundle call(String method, final String arg, final Bundle extras) {
        if (Binder.getCallingUid() != Process.myUid()) {
            return null;
        }
        createDbIfNotExists();

        switch (method) {
            case LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID: {
                String extractedColors = extras.getString(
                        LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS);
                int wallpaperId = extras.getInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID);
                Utilities.getPrefs(getContext()).edit()
                        .putString(ExtractionUtils.EXTRACTED_COLORS_PREFERENCE_KEY, extractedColors)
                        .putInt(ExtractionUtils.WALLPAPER_ID_PREFERENCE_KEY, wallpaperId)
                        .apply();
                mListenerHandler.sendEmptyMessage(ChangeListenerWrapper.MSG_EXTRACTED_COLORS_CHANGED);
                Bundle result = new Bundle();
                result.putString(LauncherSettings.Settings.EXTRA_VALUE, extractedColors);
                return result;
            }
            case LauncherSettings.Settings.METHOD_CLEAR_EMPTY_DB_FLAG: {
                clearFlagEmptyDbCreated();
                return null;
            }
            case LauncherSettings.Settings.METHOD_WAS_EMPTY_DB_CREATED : {
                Bundle result = new Bundle();
                result.putBoolean(LauncherSettings.Settings.EXTRA_VALUE,
                        Utilities.getPrefs(getContext()).getBoolean(EMPTY_DATABASE_CREATED, false));
                return result;
            }
            case LauncherSettings.Settings.METHOD_DELETE_EMPTY_FOLDERS: {
                Bundle result = new Bundle();
                result.putSerializable(LauncherSettings.Settings.EXTRA_VALUE, deleteEmptyFolders());
                return result;
            }
            case LauncherSettings.Settings.METHOD_NEW_ITEM_ID: {
                Bundle result = new Bundle();
                result.putLong(LauncherSettings.Settings.EXTRA_VALUE, mOpenHelper.generateNewItemId());
                return result;
            }
            case LauncherSettings.Settings.METHOD_NEW_SCREEN_ID: {
                Bundle result = new Bundle();
                result.putLong(LauncherSettings.Settings.EXTRA_VALUE, mOpenHelper.generateNewScreenId());
                return result;
            }
            case LauncherSettings.Settings.METHOD_CREATE_EMPTY_DB: {
                mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase());
                return null;
            }
            case LauncherSettings.Settings.METHOD_LOAD_DEFAULT_FAVORITES: {
                loadDefaultFavoritesIfNecessary();
                return null;
            }
            case LauncherSettings.Settings.METHOD_REMOVE_GHOST_WIDGETS: {
                mOpenHelper.removeGhostWidgets(mOpenHelper.getWritableDatabase());
                return null;
            }
        }
        return null;
    }

 

调用loadDefaultFavoritesIfNecessary方法

synchronized private void loadDefaultFavoritesIfNecessary() {
        SharedPreferences sp = Utilities.getPrefs(getContext());

        if (sp.getBoolean(EMPTY_DATABASE_CREATED, false)) {
            Log.d(TAG, "loading default workspace");

            AppWidgetHost widgetHost = mOpenHelper.newLauncherWidgetHost();
            AutoInstallsLayout loader = createWorkspaceLoaderFromAppRestriction(widgetHost);
            if (loader == null) {
                loader = AutoInstallsLayout.get(getContext(),widgetHost, mOpenHelper);
            }
            if (loader == null) {
                final Partner partner = Partner.get(getContext().getPackageManager());
                if (partner != null && partner.hasDefaultLayout()) {
                    final Resources partnerRes = partner.getResources();
                    int workspaceResId = partnerRes.getIdentifier(Partner.RES_DEFAULT_LAYOUT,
                            "xml", partner.getPackageName());
                    if (workspaceResId != 0) {
                        loader = new DefaultLayoutParser(getContext(), widgetHost,
                                mOpenHelper, partnerRes, workspaceResId);
                    }
                }
            }

            final boolean usingExternallyProvidedLayout = loader != null;
            if (loader == null) {
                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();
        }
    }

可以在该方法中,定制favorites表的初始化数据,这样就可以在Launcher启动时候,屏幕显示定制的app,默认加载xml件是default_workspce_n*n的文件,如


<favorites xmlns:launcher="http://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, [All Apps], Browser, Camera -->
    <resolve
        launcher:container="-101"
        launcher:screen="0"
        launcher:x="0"
        launcher:y="0" >
        <favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" />
        <favorite launcher:uri="tel:123" />
        <favorite launcher:uri="#Intent;action=android.intent.action.CALL_BUTTON;end" />
    </resolve>

    <resolve
        launcher:container="-101"
        launcher:screen="1"
        launcher:x="1"
        launcher:y="0" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MESSAGING;end" />
        <favorite launcher:uri="sms:" />
        <favorite launcher:uri="smsto:" />
        <favorite launcher:uri="mms:" />
        <favorite launcher:uri="mmsto:" />
    </resolve>

    <!-- All Apps -->

    <resolve
        launcher:container="-101"
        launcher:screen="3"
        launcher:x="3"
        launcher:y="0" >
        <favorite
            launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_BROWSER;end" />
        <favorite launcher:uri="http://www.example.com/" />
    </resolve>

    <resolve
        launcher:container="-101"
        launcher:screen="4"
        launcher:x="4"
        launcher:y="0" >
        <favorite launcher:uri="#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end" />
        <favorite launcher:uri="#Intent;action=android.intent.action.CAMERA_BUTTON;end" />
    </resolve>

</favorites>

 

 

 

Launcher3 壁纸分析 Launcher3 壁纸分析Launcher3 壁纸分析 WallpaperPickerActivity结构 1 父类WallpaperCropActivity 2 布局文件wallpaper_pickerxml 初始化流程 1 加载壁纸列表 11 系统壁纸 12 图库壁纸 13 动态壁纸 2 加载图库壁纸按键 3 Actionbar的初始化和响应 4 点击事件1. W 阅读详情

相关推荐

Android M Launcher3主流程源码浅析

当存在多个时无论哪种触发都会弹出选择框进行选择设置。可以发现,Launcher3的Activity加载其实和其他应用没啥区别的,也是一样的流程,只是我们需要特别注意上图中红色的两步。在setContentView之后我们其实又进行了一次依据设备属性的layout操作,接着才进行异步数据加载的,所以我们的重点会放在LauncherModel的loader方法中。可以发现,其实Launcher没啥特殊的,只是考虑的问题比较多而已,本文只是给出主流程,细节还需自己继续扣,略显潦草,没办法,没时间,只能这样。

2401_89173673的博客 747

RK3568 Android13 自定义launcher3主屏应用布局

RK3568 Android13 launcher桌面应用布局修改

gfhgasgfc的博客 1158

Android Launcher3分析及定制&主题实现

一. Launcher3 简介 launcher3是在Launcher2的基础上进化的版本,从Android 4.4 开始就使用Launcher3 .(kk版,kk2版)作为桌面使用,以前我们都在使用Launcher2,我们使用的是KK版本,具体区别后面再说. 1 Launcher3 桌面变成了动态管理,launcher2 里面默认最多加载五个workspace布局. 1.2......

Android 1万+

Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launcher都是基于Android4.0.3的Launcher2修改。Launcher源码比较多,而且里面应用了很多设计模式,要把它分析清楚要花不少精力,网上也有一些零碎的分析文章,不过关于修改的文章不多。所

harhy的专栏 1万+

高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)

本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。

weixin_29232121的博客 495

探索LLM世界:新手小白的学习路线图

通过系统的学习和实践,新手小白也能逐步掌握LLM的核心技术。掌握LLM不仅能提升个人技术水平,还能为职业发展带来广阔的前景。未来,随着技术的不断进步,LLM将在更多领域发挥重要作用,成为推动科技进步的重要力量。学习LLM是一条充满挑战但也充满机遇的道路。只要你坚持不懈、不断学习和实践,就一定能够在LLM领域取得突破。希望本文提供的学习路线图能为你指明方向,助你早日掌握LLM,开启AI学习的新篇章!

m0_62110645的博客 2360

android设置默认程序图标,android Launcher3设置默认桌面应用

android Launcher3 设置默认桌面应用,供大家参考,具体内容如下launcher3 的默认桌面应用是在 res/xml里默认有4种样式default_workspace_3x3.xmldefault_workspace_4x4.xmldefault_workspace_5x5.xmldefault_workspace_5x6.xml我们看看default_workspace_3x3....

weixin_42311046的博客 914

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 514

Launcher添加hotseat图标布局

launcher:uri= 后面填应用的intent信息,数据库里面复制出来就可以了。打开Tables下的表格就可以看到图标信息了。launcher:screen="0"表示第一格,下一个图标递增。Launcher的hotseat客户要求添加一些指定应用图标。首先打开机器将要布局的图标手动移动到hotseat位置上面。launcher:y="0"表示y坐标,后续的y坐标也是0。launcher:x="0"表示x坐标,其他的图标递增。添加上面xml后,重新编译升级就可以看到默认的布局了。

hedalei的博客 561

智能网联汽车电子电气架构(下)

从资产的表现形式, 可以分为数据、 软件、 硬件、 服务等, 而从需要保护的业务过程和活动、 所关注信息的角度, 资产类型可包括基于 ECU 的控制功能、 与特定车辆相关的信息、 车辆状态信息、 用户信息、 配置信息、 特定的软件、 内容等。面向新一代 EEA 的安全需求, 基于芯片提供的 OTP, 或SHE\HSM 的安全存储能力, 实现系统关键数据(身份、 密钥等关键信息) 的安全存储, 保证系统的关键数据不被盗取、 破坏、 改写。结合攻击者的动机与识别出的系统用例, 分析对汽车电子系统可能的攻击。

m0_58838529的博客 1473

YOLOv11涨点改进| CVPR 2026 | 全网独家首发、特征融合改进篇| 引入SRFusion 空间细化多级融合,含多种创新融合改进,涨点可直接发论文,适合裂缝图像检测,小目标检测任务高效涨点

🔥本文提出SRFusion空间细化多级融合模块,用于改进YOLOv11网络模型。该模块通过高分辨率特征引导低分辨率语义特征的融合,利用空间注意力机制对上采样后的特征进行加权细化,增强多尺度特征间的空间细节交互。SRFusion模块能够提升模型对目标区域的表达能力,有效改善小目标、密集目标及复杂背景场景下的检测效果,同时保持YOLOv11的高效性与实时检测性能。文章详细介绍了模块结构、实现原理、核心代码及在YOLOv11中的三种配置方法,为模型优化提供了创新解决方案。

Ai缝合怪、助力小伙伴高效发论文 149

默认桌面图标更改图标布局,这里把图库放到底部栏空位上。增加桌面组件图标

默认桌面图标更改图标布局,这里把图库放到底部栏空位上。增加桌面组件图标

youthking1314的博客 458

Could not create cache adapter cache factory not found: factory for cache adapter ““ was not regist

RROR: Could not create cache adapter error=cache factory not found: factory for cache adapter "" was not registered ERROR: Job failed (system failure): Error response from daemon: OCI runtime create failed: container_linux.go:349: starting co...

知无涯 4034

Launcher3之Workspace数据库首次初始化分析

引言 在Android手机上,我们通常说的桌面其实就是launcher应用,更狭义一点就是workspace,workspace是桌面在实现时的抽象定义。桌面上显示的应用图标、文件夹和小部件都是显示在workspace中的,我们可以增删应用快捷图标,增删文件夹,增删小部件,但是这些桌面上显示的元素状态是怎么保存下来的呢?答案是,launcher使用了一个专门的数据库保存了这些状态,以便下次重启后依...

qinhai1989的专栏 1408

YOLOv10改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 105

Java高频面试基础问题与知识点整理

Java高频面试知识点总结:覆盖高频基础知识考点+高频集合知识点深入分析+高频多线程与并发编程面试题汇总+其他扩展考察等。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

Launcher3源码分析 — 启动过程

转自:Launcher3源码分析 — 启动过程1.执行Application的onCreate方法 在Main Activity执行之前会先执行Application类的onCreate方法,通过LauncherAppState.getInstance()实例化LauncherAppState。public class LauncherApplication extends Application

1618

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Launcher3 桌面加载流程分析

Launcher3 桌面加载流程分析 主入口Launcher 首先来看Launcher.java的onCreate方法,里面代码很多,只看主流程部分: @Override protected void onCreate(Bundle savedInstanceState) { ...... LauncherAppState app = LauncherAppState.getInstance(this); ...... } 这里的LauncherAppState类是用来保存一些全局

qq_43369592的博客 3862

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android Launcher分析和修改3——Launcher启动和初始化

 前面两篇文章都是写有关Launcher配置文件的修改,代码方面涉及不多,今天开始进入Launcher代码分析。 我们开机启动Launcher,Launcher是由Activity Manager启动的,而Activity Manager是由system server启动。 原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3157452.html

木聿的专栏 683

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android launcher3 源码分析,Android Launcher3分析

本文主要是对自己分析MTK 6.0 Launcher3源码的笔记,如有发现不对,请及时指正启动流程app启动都是由application开始启动的。LauncherApplication.javapublic void onCreate() {super.onCreate();...LauncherAppState.setApplicationContext(this);LauncherAppSt...

weixin_33781072的博客 840

Launcher3 UI初始化分析

一. 入口Launcher类,在其onCreate方法中初始化 @Override protected void onCreate(Bundle savedInstanceState) { if (DEBUG_STRICT_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPoli...

yuemingxingxing的博客 626

Android Launcher 分析

 1. Launcher的启动过程从网络上找了一段关于Launcher的启动过程的文章,作为学习Launcher的背景知识:Linux kernel启动以后会通过app_main进程来初始化android Runtime Java运行环境,而zygote是Android的第一个进程。所有的android的应用以及大部分系统服务都是通过zygote fork出来的子进程(我现在看到的只有native的service manager不是由zygote fork出来的)。在system server中启动的若干系

fengkehuan的专栏 2万+

Android之Launcher分析和修改3——Launcher启动和初始化

前面两篇文章都是写有关Launcher配置文件的修改,代码方面涉及不多,今天开始进入Launcher代码分析。 我们开机启动Launcher,Launcher是由Activity Manager启动的,而Activity Manager是由system server启动。 原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3157452.html  1

码莎拉蒂 3066

Launcher3分析之数据加载与绑定

Launcher3的主界面是 packages/apps/Launcher3/src/com/android/launcher3/Launcher.java 首先分析onCreate @Override protected void onCreate(Bundle savedInstanceState) { if (DEBUG_STRICT_MODE) { ...

一个小菜鸟的成长之路的专栏 1627

android launcher3,Android Launcher3 基本功能分析

Android Launcher3 基本功能分析1, 界面的布局, 从上往下分别为:DeleteDropTarget(应用卸载区域,它是一个DropTarget)Workspace(页面容器,一个页面是一个CellLayout)PageIndicator(指示器,指示workspace当前位于第几个页面)Hotseat(底部图标区域)2,Launcher 桌面图标的加载:LauncherAppli...

weixin_35671421的博客 1572
上一篇: Launcher3 UI初始化分析
下一篇: Gradle详解(一)
网络卷毛
博客等级 码龄14年 13粉丝 129原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值