android launcher3桌面快捷方式分析

背景

一般情况下,为了让用户更方便的打开应用,程序会在桌面上生成一些快捷方式。
本来呢,如果是原生的桌面,其实是十分简单,直接调用系统相关的API就行了。但是众多的系统厂商以及众多第三方自己定制的桌面(Launcher),导致在适配、兼容方面存在很多问题。
比如,有些桌面无法删除快捷方式(比如小米),有些桌面无法生成快捷方式(比如锤子),有些系统无法更新桌面图标(比如华为荣耀6)。
在升级、降级的时候快捷方式发生变化;比如,全部变成应用的主图标,升级、降级后点击快捷方式没有反应,删除应用后无法删除快捷方式。
很多问题都是需要解决的,虽然有些由于系统限制,没有办法搞定所有的,但是仍然需要寻求一个最优的方案。这也就是本文需要讨论的问题。
本文说指的快捷方式是指应用桌面快捷方式,不包含长按弹出的生成快捷方式。
快捷方式所有信息都是存在于launcher的favorite表。一般需要用到的字段为_id,title,intent,iconResource,icon,分别表示 快捷方式名称,快捷方式intent,快捷方式图标(本地),快捷方式图标(data二进制压缩数据)。

两个intent数据如下

数据可以通过SQLite Editor查看,需要已经ROOT的手机

实现

增加快捷方式

在AndroidManifest.xml增加权限

[html]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />  

同时,根据Intent是隐式还是显示在相关的Activity声明相关的intent-filter。
相关代码:

删除快捷方式

跟增加快捷方式一样,也是需要增加权限的。加上

[html]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />  

相关代码:

快捷方式修改

需要增加权限

[html]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
  2. <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />  
如果适配所有桌面,请添加附录中第二条所列出的权限。
系统并没有提供API去更改桌面快捷方式。只能通过其他猥琐的办法了,可行的的办法之一就是通过ContentProvider去更改数据库相关的信息。当然有人会说了,先删掉快捷方式,再重新创建不就行了?这是个办法。但是有些系统是无法删除快捷方式的;另外,删除快捷方式与创建快捷方式都是通过广播实现的,这个地方需要控制两者的时间间隔。权衡之后,选用第一种办法相对稳妥。
废话不多少,上代码。

[java]  view plain   copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.   * 更新桌面快捷方式图标,不一定所有图标都有效<br/> 
  3.   * 如果快捷方式不存在,则不更新<br/>. 
  4.   */  
  5.  public static void updateShortcutIcon(Context context, String title, Intent intent,Bitmap bitmap) {  
  6.   if(bitmap==null){  
  7.    XLog.i(TAG, "update shortcut icon,bitmap empty");  
  8.    return;  
  9.   }  
  10.   try{  
  11.    final ContentResolver cr = context.getContentResolver();  
  12.    StringBuilder uriStr = new StringBuilder();  
  13.    String urlTemp="";  
  14.    String authority = LauncherUtil.getAuthorityFromPermissionDefault(context);  
  15.    if(authority==null||authority.trim().equals("")){  
  16.     authority = LauncherUtil.getAuthorityFromPermission(context,LauncherUtil.getCurrentLauncherPackageName(context)+".permission.READ_SETTINGS");  
  17.    }  
  18.    uriStr.append("content://");  
  19.    if (TextUtils.isEmpty(authority)) {  
  20.     int sdkInt = android.os.Build.VERSION.SDK_INT;  
  21.     if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的  
  22.      uriStr.append("com.android.launcher.settings");  
  23.     } else if (sdkInt < 19) { // Android 4.4以下  
  24.      uriStr.append("com.android.launcher2.settings");  
  25.     } else { // 4.4以及以上
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值