android 单双层桌面切换

2023-05-16

单双层桌面切换由于必须持久化数据 所以必须多创建单层桌面所须要的数据库表;

  1. 一表为存储桌面图标,表结构跟原生 桌面表一样 直接copy一份就可以了
  2. 一表为存储桌面页,表结构跟原生一样

创建上面两张表时注意下 数据库版本升级带来的影响

由于表结构跟原生一样 所以加载逻辑不需要改动 直接按原生加载 所需要改动的是加载的是哪个表

建立一个判断是否为单双层桌面的方法,此方法单双层桌面的 标志

	/**add by lmjssjj begin*/
	public static boolean isDisableAllApps(){
		return false;
	}
	/**add by lmjssjj end*/

修改加载的数据表

 public static final class WorkspaceScreens implements ChangeLogColumns {

        public static final String TABLE_NAME = "workspaceScreens";
        /**add by lmjssjj begin*/
        public static final String TABLE_DISABLEALLAPPS_NAME = "workspaceScreens_disable_allapps";
        /**add by lmjssjj end*/

        /**
         * The content:// style URL for this table
         */
        static final Uri CONTENT_URI = Uri.parse("content://" +
                ProviderConfig.AUTHORITY + "/" + /**modify by lmjssjj*/(LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME));

        /**
         * The rank of this screen -- ie. how it is ordered relative to the other screens.
         * <P>Type: INTEGER</P>
         */
        public static final String SCREEN_RANK = "screenRank";
    }
public static final class Favorites implements BaseLauncherColumns {

        public static final String TABLE_NAME = "favorites";
        /**add by lmjssjj begin*/
        public static final String TABLE_DISABLEALLAPPS_NAME = "favorites_disable_allapps";
        /**add by lmjssjj end*/
        /**
         * The content:// style URL for this table
         */
        public static final Uri CONTENT_URI = Uri.parse("content://" +
                ProviderConfig.AUTHORITY + "/" +/**modify by lmjssjj*/ (LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME));

        /**
         * The content:// style URL for a given row, identified by its id.
         *
         * @param id The row id.
         *
         * @return The unique content URL for the specified row.
         */
        public static Uri getContentUri(long id) {
            return Uri.parse("content://" + ProviderConfig.AUTHORITY +
                    "/" + (LauncherAppState.isDisableAllApps()?TABLE_DISABLEALLAPPS_NAME:TABLE_NAME) + "/" + id);
        }

添加数据库表
为了数据库版本升级 单独建立

//add by lmjssjj
        private void addFavoritesDisableAllappsTable(SQLiteDatabase db){
        	 UserManagerCompat userManager = UserManagerCompat.getInstance(mContext);
             long userSerialNumber =
                     userManager.getSerialNumberForUser(UserHandleCompat.myUserHandle());
            db.execSQL("CREATE TABLE favorites_disable_allapps (" + "_id INTEGER PRIMARY KEY," + "title TEXT,"
            		+ "intent TEXT," + "container INTEGER," + "screen INTEGER," + "cellX INTEGER,"
            		+ "cellY INTEGER," + "spanX INTEGER," + "spanY INTEGER," + "itemType INTEGER,"
            		+ "appWidgetId INTEGER NOT NULL DEFAULT -1," + "isShortcut INTEGER,"
            		+ "iconType INTEGER," + "iconPackage TEXT," + "iconResource TEXT,"
            		+ "icon BLOB," + "uri TEXT," + "displayMode INTEGER,"
            		+ "appWidgetProvider TEXT," + "modified INTEGER NOT NULL DEFAULT 0,"
            		+ "restored INTEGER NOT NULL DEFAULT 0," + "profileId INTEGER DEFAULT "
            		+ userSerialNumber + "," + "rank INTEGER NOT NULL DEFAULT 0,"
            		+ "options INTEGER NOT NULL DEFAULT 0" + ");");
        }//end by lmjssjj

        private void addWorkspacesTable(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + TABLE_WORKSPACE_SCREENS + " ("
                    + LauncherSettings.WorkspaceScreens._ID + " INTEGER PRIMARY KEY,"
                    + LauncherSettings.WorkspaceScreens.SCREEN_RANK + " INTEGER,"
                    + LauncherSettings.ChangeLogColumns.MODIFIED + " INTEGER NOT NULL DEFAULT 0"
                    + ");");
        }
 private void setFlagDisableAllAppsEmptyDbCreated() {
        	String spKey = LauncherAppState.getSharedPreferencesKey();
        	SharedPreferences sp = mContext.getSharedPreferences(spKey, Context.MODE_PRIVATE);
        	sp.edit().putBoolean(EMPTY_DISABLEALLAPPS_DATABASE_CREATED, true).commit();
        }

public void clearFlagDisableAllAppsEmptyDbCreated() {
    	String spKey = LauncherAppState.getSharedPreferencesKey();
    	getContext().getSharedPreferences(spKey, Context.MODE_PRIVATE).edit()
    	.remove(EMPTY_DISABLEALLAPPS_DATABASE_CREATED).commit();
    }

数据库表已建立完成 接下来需要修改数据库的写入 通过上面的判断方法 修改写的读的表

 private long initializeMaxItemId(SQLiteDatabase db) {
            return getMaxId(db, LauncherAppState.isDisableAllApps()?TABLE_FAVORITES_DISABLE_ALLAPPS:TABLE_FAVORITES);
        }
private long initializeMaxScreenId(SQLiteDatabase db) {
            return getMaxId(db, LauncherAppState.isDisableAllApps()?TABLE_WORKSPACE_SCREENS_DISABLE_ALLAPPS:TABLE_WORKSPACE_SCREENS);
        }
 @Override
        public long insertAndCheck(SQLiteDatabase db, ContentValues values) {
            return dbInsertAndCheck(this, db, LauncherAppState.isDisableAllApps()?TABLE_FAVORITES_DISABLE_ALLAPPS:TABLE_FAVORITES, null, values);
        }

接下来 数据加载

boolean bl = prefs.getBoolean(LauncherAppState.isDisableAllApps()?LauncherProvider.EMPTY_DISABLEALLAPPS_DATABASE_CREATED:LauncherProvider.EMPTY_DATABASE_CREATED, false);
if(LauncherAppState.isDisableAllApps())
					LauncherAppState.getLauncherProvider().clearFlagDisableAllAppsEmptyDbCreated();

加载单层数据,双层数据照原生逻辑

		private void loadAllAppsFirst() {

				final Callbacks oldCallbacks = mCallbacks.get();
				if (oldCallbacks == null) {
					return;
				}
				final List<UserHandleCompat> profiles = mUserManager.getUserProfiles();
				mBgAllAppsList.clear();
				for (UserHandleCompat user : profiles) {

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

					if (apps == null || apps.isEmpty()) {
						return;
					}

					for (int i = 0; i < apps.size(); i++) {
						LauncherActivityInfoCompat app = apps.get(i);

						mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache));

					}
					mBgAllAppsList.added.clear();

			}
			verifyApplications();
			updateIconCache();
			
			loadAndBindWidgetsAndShortcuts(tryGetCallbacks(oldCallbacks), true /* refresh */);

		}

切换时重新加载我采用的是在设置页面(设置页在自己的进程) kill 自己:

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
			activityManager.killBackgroundProcesses(getPackageName());
finish();

合并数据

private void verifyApplications() {
		final Context context = mApp.getContext();

		// Cross reference all the applications in our apps list with items in
		// the workspace
		ArrayList<ItemInfo> tmpInfos;
		ArrayList<ItemInfo> added = new ArrayList<ItemInfo>();
		synchronized (sBgLock) {
			for (AppInfo app : mBgAllAppsList.data) {
				tmpInfos = getItemInfoForComponentName(app.componentName, app.user);
				if (tmpInfos.isEmpty()) {
					// We are missing an application icon, so add this to the
					// workspace
					added.add(app);
					// This is a rare event, so lets log it
					Log.e(TAG, "Missing Application on load: " + app);
				}
			}
		}
		if (!added.isEmpty()) {
			addAndBindAddedWorkspaceItems(context, added,true);
		}
	}

总结:
需要注意的
1、创建单层桌面所须数据库
2、数据库增删改查
3、当第一次加载单层桌面时,应用合并
4、当安装应用时
5、当卸载应用时(原生逻辑)
6、当应用更新时(原生逻辑)
7、判断应用是否是要卸载或者图标删除
8、快捷图标创建细节
9、单双切换

交流群:196040873

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 单双层桌面切换 的相关文章

  • python爬虫(Python读取TXT文件中的URL并下载文件)

    前言 xff1a 本人之前并没有接触过python爬虫 xff0c 但是现在因为要做个试验 xff0c 需要下载海量人脸图片 xff0c 所以需要用到python爬虫这个办法 但是过程中遇到到了很多问题 xff0c 程序调了很久都不成功 x
  • 机器学习之python读取CSV文件

    当我们在用python处理机器学习的问题时 xff0c 往往需要先读取数据 xff0c 这些数据通常都是文件 xff0c 我今天遇到的是CSV文件 xff0c 是在kaggle竞赛数据集下载的 xff08 比如手写数字识别 xff0c 以及
  • Robust PCA Low-rank(附matalb 代码)

    最近在看的论文中 xff0c 包括人脸识别 xff0c 以及深度神经网络模型压缩等论文中 xff0c 都会有low rank 低秩 低秩稀疏分解等解决方法 xff0c 感觉关于low rank的研究还挺火的 xff0c 这个问题和Robus
  • 完美图解教程 Linux环境VNC服务安装、配置与使用

    图片直观明了 xff0c 尝试一步一步分享俺的成果 1 xff1a 下面第一步当然是确认自己linux系统是否安装VNC 默认情况下 xff0c Red Hat Enterprise Linux安装程序会将VNC服务安装在系统上 打开终端窗
  • torch.ge,torch.gt,torch.le

    torch ge torch ge input other out 61 None Tensor 逐元素比较input和other xff0c 即是否 input gt 61 otherinput gt 61 other 如果两个张量有相同
  • VAE(变分自动编码器)

    首先先贴上一些有用的链接 xff1a https www cnblogs com king lps p 8477300 html https zhuanlan zhihu com p 29685634 再补充一个链接 xff1a https
  • 视频去噪资料整理(深度学习方法)

    近几天做了一些视频去噪的一些边缘工作 xff0c 故整理一下 我读的一篇论文 xff1a paper TOFlow Video Enhancement with Task Oriented Flow code https github co
  • 正则表达式里的?:是啥意思例如(?:a|b)

    我也是找答案时看到的 xff0c 发现这里回答的理论是的 xff0c 但不好让人理解 xff0c 我也结合其他地方的资料 xff0c 才能理解他的答案 下面我用两个例子来说明 单引号里面的三个元字符之间的意思 39 39 1 39 39 x
  • idea设置javadoc、idea2020单行注释的快捷键

    找了半天 xff0c 想不起来叫什么 1 其实就是给方法和类上添加这种doc文档的注释的快捷键 xff1a 打开setting keymap 搜索 xff1a fix doc comment 我习惯用ctrl 43 enter 2 切换到i
  • LaTeX分享008【LaTeX多图排列方法】

    LaTeX分享 LaTeX多图排列方法 作者 xff1a JinyuLi 日期 xff1a 2023 03 18 内容 xff1a 填坑 xff0c 补充上一篇专栏中LaTeX图片插入问题中的多张图片同时插入的实现方法部分 xff0c 本篇
  • SONiC(2):手动运行sonic-vs

    SONiC的testbed都是用ansible自动部署的 xff0c 下面尝试手动来创建 另外最新的sonic vs可以从这里下载 准备工作 ansible生成的vlab 01这个虚机的vir配置xml文件如下 testbed 64 u18
  • SONiC vs testbed搭建

    准备工作 一台安装Ubuntu18 04的系统 xff0c 内存建议不少于16G 需要支持kvm虚拟化安装ssh server sudo apt update y sudo apt openssh server y 设置sudo免密 sud
  • 2. 安装GNOME和KDE图形化桌面

    安装GNOME和KDE图形化桌面 1 使用CD DVD介质配置本地Yum源2 安装GNOME图形化桌面2 1 安装GNOME xff1a 2 2 设置在系统启动时进入图形化桌面3 安装KDE图形化桌面3 1 安装KDE xff1a 3 2
  • 复位电路的几种设计

    本人转自 xff1a http hi baidu com yinweini2 item 48ba4f12f54587711009b591 复位源是导致单片机内部复位操作的源泉 xff0c 大致可分为七种 xff1a 上电复位 xff08 P
  • Hadoop入门经典:WordCount

    以下程序在hadoop1 2 1上测试成功 本例先将源代码呈现 xff0c 然后详细说明执行步骤 xff0c 最后对源代码及执行过程进行分析 一 源代码 package org jediael hadoopdemo wordcount im
  • Jlink 采用 SWD 模式下载电路接法

    在Jlink上 xff1a 对应的电路图为 xff1a 其中要使用的是 Pin1 gt vcc Pin7 gt SWDIO Pin9 gt SWCLK Pin4 gt GND 其他GND 引脚也可 在对于的开发板 xff08 举例 xff1
  • ubuntu系统硬盘温度过高的解决方法

    一 更改swap分区设置 在ubuntu 里面 xff0c swappiness的值的大小对如何使用swap分区是有着很大的联系的 swappiness 61 0的时候表示最大限度使用物理内存 xff0c 然后才是 swap空间 xff0c
  • MBus协议详解(一)

    看了许多关于MBus协议的资料 xff0c 感觉说的不具体 不完整 也不系统 xff0c 本人准备结合一个具体的产品实现 xff0c 从理论和实现上对MBus协议做一个详细的论述 xff0c 如有不当之处 xff0c 欢迎讨论 1 介绍 M
  • MBus协议详解(二)

    4 4 slave 设计 传输特性 xff1a slaves 被设计为具有两种不同恒定 sink 电流 xff0c 因此在总线上电压有 1V 的变化的时候 xff0c sink 电流的变化一定不能超过 0 2 为了传输一个 Mark xff
  • 多个进程对同一文件写入的问题

    转载 讨论关于并发环境下 xff0c 多个进程对同一文件写入的问题 xff0c 我们会涉及到文件共享的知识 在开始之前 xff0c 我们先讨论一些有关文件共享的知识 1 文件共享 Unix系统支持在不同进程间共享打开的文件 为此 xff0c

随机推荐

  • Linux内核里的DebugFS

    DebugFS xff0c 顾名思义 xff0c 是一种用于内核调试的虚拟文件系统 xff0c 内核开发者通过debugfs和用户空间交换数据 类似的虚拟文件系统还有procfs和sysfs等 xff0c 这几种虚拟文件系统都并不实际存储在
  • linux 只获取dns服务器地址

    有一款设备需要使用静态ip xff0c 但是还要用到dns解析域名 我的想法是定时去查看 etc resolve conf文件 xff0c 如果为空 xff0c 则获取一次dns 在嵌入式linux中 xff0c 我们使用busybox的u
  • linux更新文件

    最近发现很多同学不知道线上操作替换文件的要点 所以又整理了一下 线上替换一个正在运行进程的文件时 xff08 包括二进制 动态库 需要读取的资源文件等 xff09 应避免使用cp scp操作 而需要使用mv rsync作为替代 原因 xff
  • 大型网站架构与自动化运维——ISCSI安装配置

    ISCSI安装配置 一 存储简述 1 DAS xff1a 即直连方式存储 xff0c 英文全称是Direct Attached Storage 直接附加存储 顾名思义 xff0c 在这种方式中 xff0c 存储设备是通过电缆 xff08 通
  • Homebrew brew安装报错:Failed to connect to raw.githubusercontent.com port 443: Operation timed out

    报错 xff1a Failed to connect to raw githubusercontent com port 443 Operation timed out 解决方案 liukeruideMacBook Pro liukerui
  • 正则表达式中(?:)、(?=)以及(?!)等的用法

    out 61 re findall r 39 d 43 61 abc 39 34 1abc 34 只抽取数字 xff0c 并且该数字后面跟的字符是 34 abc 34 print out out1 61 re findall r 39 d
  • Oracle 12C rman备份的坑,搞不好就会hang死

    RMAN Backup to Platform Temporarily Creates DMP File in ORACLE HOME dbs 文档 ID 2349921 1 This has been reported as BUG 25
  • Linux 上安装配置 VNC Server

    一 简介 VNC Virtual Network Console xff0c 即 虚拟网络控制台 它是一款优秀的远程控制工具软件 xff0c 而且是基于 UNIX 和 Linux 操作系统的免费开源的 1 优点 远程控制能力强大 xff0c
  • Xshell能ping通但连不上CentOS 7

    转 xff1a https blog csdn net trackle400 article details 52755571 在虚拟机 xff08 Vmware Workstation xff09 下 xff0c 安装了CentOS7 x
  • Pandas RuntimeWarning: More than 20 figures have been opened. Figures created plt.close()也不起作用

    以下是源代码 xff0c 结果 xff1a function里有个for循环 xff0c 在每一次循环都有plt close xff0c 但是还是报错 xff1a More than 20 figures have been opened
  • 为企业提供存储功能的Red Hat Stratis 2.0.1发布了

    导读Red Hat的Stratis存储项目用于在Linux上提供企业存储功能 xff0c 以与ZFS和Btrfs之类的产品竞争 xff0c 同时在LVM和XFS之上构建 xff0c 这是其2020年守护进程的首次更新 通过Stratis x
  • 【转载】Java基本类型的Writable封装

    Java基本类型的Writable封装 目前Java基本类型对应的Writable封装如表所示 所有这些Writable类都继承自WritableComparable 也就是说 xff0c 它们是可比较的 同时 xff0c 它们都有get
  • Ubuntu18.04 ROS Melodic的cv_bridge指向问题

    由于ROS Melodic自带的是Opencv3 2 0 xff0c 而我自己下载的是opencv3 4 5 xff0c 所以需要将cv bridge的指向改为我自己安装的opencv 全篇很长 xff0c 建议看完后操作 xff0c 不要
  • VNC服务器灰屏怎么办?

    VNC服务器出现灰屏如何解决 最直接的方法就是重启VNC xff0c 那么如何重启VNC呢 xff1f 远程连接VNC 首先关闭VNC xff0c 使用Putty软件 xff08 类似一个远程服务器控制软件 xff09 有关Putty软件可
  • Python str.isalpha

    str isalpha 功能描述 isalpha检查字符串是否只包含字母字符 语法 无参数 span class token builtin str span span class token punctuation span isalph
  • 华为手机MATE10所有分区备份与数据恢复方法

    华为手机MATE10所有分区备份与数据恢复方法 作者 xff1a 爱吃干锅牛肉的喵 时间2020 3 23 前言 xff1a 前段时间笔者手机的root权限出问题 xff0c 误操作重破解ROOT权限导致数据全部wipe并且系统也坏了 没办
  • 树莓派3B+安装系统(Raspbian)以及配置环境

    1 硬件准备 1 树莓派3B 43 xff08 E14 xff09 2 一张64G的闪迪存储卡 3 一个读卡器 4 普通电脑显示器 xff0c 键盘 xff0c 鼠标 5 一台可以正常工作的Window系统的电脑 2 安装系统 1 树莓派系
  • Ubuntu虚拟机无法上网的解决方法

    问题 在使用Ubuntu虚拟机时 xff0c 有时候会遇到无法上网的情况 解决办法一般有更改网络连接模式 xff08 桥接模式 NAT模式切换 xff09 重新设置虚拟机网卡等 但是 xff0c 最近遇到了以上办法均无法解决的情况 xff0
  • 用eclipse编写MapReduce程序的基本要点

    1 要想在eclipse上编写MapReduce xff0c 那么就需要在eclipse上安装hadoop插件 xff0c 具体操作是将hadoop安装目录下的contrib eclipse plugin hadoop 0 20 2 ecl
  • android 单双层桌面切换

    单双层桌面切换由于必须持久化数据 所以必须多创建单层桌面所须要的数据库表 一表为存储桌面图标 xff0c 表结构跟原生 桌面表一样 直接copy一份就可以了一表为存储桌面页 xff0c 表结构跟原生一样 创建上面两张表时注意下 数据库版本升