• 一原理解析

    • 1 原理1activity-alias
    • 2 原理2PMsetComponentEnabledSetting
  • 二动态更换桌面icon
  • 三远程控制图标的实现方式
  • 四多入口实现方式 快捷方式入口
  • 五其他
  • 参考文档

时不时的我们就会发现,一些我们常见的应用,比如某宝,某东,在一些特殊的日子中,比如双十一、元旦,为了迎合这样一个日子的气氛,在桌面的应用图标就会发生改变,再譬如一些理财产品在举办一些活动的时候也会醒目的在桌面图标上有所展示。

在这期间我们并没有更新应用,但是桌面图标自动发生了变化,不仅醒目的为用户提示了一些信息,还体现了个性化的定制内容,从而达到了传达营销信息和提高用户体验的目的。

本篇我们就套路下该逻辑的实现方式。

  1. 动态更换桌面图标,可以显式告知用户关键信息或个性化定制。

    • 譬如可以在口袋助理桌面图标加入ISO认证字眼,以告知用户口袋助理通过了ISO认证;
    • 譬如节假日自动更换图标以展现个性化定制;
  2. 远程控制桌面图标,通过运营后台发送指令自动切换具体用户图标为某预设样式;
  3. 为业务模块创建快捷方式,减少操作序列,提高用户体验;

一、原理解析

Android的API里已经提供了类似的的功能,但是需要我们组合起来使用

1.1 原理1——activity-alias

AndroidManifest中支持标签activity-alias,顾名思义,即activity的别名,目的在于解决重复的Activity。activity-alias并非代表一个独立的Activity,而是为一个已经存在的Activity创建的别名

activity-alias作为一个已存在Activity的别名,则应该可以通过该别名标签声明快速打开目标Activity。因此activity-alias可用来设置某个Activity的快捷入口,可以放在桌面上或者通过该别名被其他组件快速调起。该标签元素支持一些属性及intent-filter、meta-data等配置,因此可以触发一些跟目标Activity不同的功能逻辑,虽然打开的是同一个Activity。

举个简单的例子,我们下文会用到
如之前需要先打开主界面,然后才能点击进入某个Activity,如果使用activity-alias为该Activity配置一个快捷入口,甚至可以为其在桌面生成一个图标,然后点击桌面图标可直接进入该Activity,该功能可满足某些需要快速到达功能界面的需求

<activity-alias android:enabled=["true" | "false"]android:exported=["true" | "false"]android:icon="drawable resource"android:label="string resource"android:name="string"android:permission="string"android:targetActivity="string" >. . .
</activity-alias>

部分属性说明如下

  1. android:enable 该属性用来决定目标Activity可否通过别名被系统实例化,默认为true。需要注意的是application也有enable属性,只用当它们同时为true时,activity-alias的enable才生效。
  2. android:exported 该属性为true的话,则目标Activity可被其他应用调起,如为false则只能被应用自身调起。其默认值根据activity-alias是否包含intent-filter元素决定,如果有的话,则默认为true;没有的话则为false。其实也很好理解,如果有intent-filter,则目标Activity可以匹配隐式Intent,因此可被外部应用唤起;如果没有intent-filter,则目标Activity要被调起的话必须知道其精确类名,因为只有应用本身才知道精确类名,所以此时默认为false。
  3. android:icon 该属性就比较好玩了,允许自定义icon,可以不同于应用本身在桌面的icon。如果需要在桌面上创建快捷入口,也许产品会要求换个不同的icon。
  4. android:label 该属性类似于android:icon,图标都换了,换个名称也合情合理吧,此属性就是为此而生的。
  5. android:name 该属性可以为任意字符串,但最好符合类名命名规范。activity元素的name属性实质上都会指向一个具体的Activity类,而activity-alias的name属性仅作为一个唯一标识而已。
  6. android:permission 该属性指明了通过别名声明调起目标Activity所必需的权限。
  7. android:targetActivity 该属性指定了目标Activity,即通过activity-alias调起的Activity是哪个,此属性其实类似于activity标签中的name属性,需要规范的Activity包名类名

需要注意的是,activity-alias的属性可以理解为activity属性的子集,如果是activity-alias和activity共有的属性,则以activity-alias为准,目标Activity中的设置并不会在activity-alias中生效;如果是仅activity才有的属性,则为目标Activity配置的属性会在activity-alias中生效

另外需要注意的一点是,在AndroidManifest配置文件中,activity-alias标签元素必须声明在目标Acitvity对应的activity标签元素之后,否则会编译错误

activity-alias可以设置自己的intent-filter或meta-date,最常用的就是设置如下intent-filter从而在桌面Launcher上创建一个快捷入口:

<intent-filter>// 决定应用程序最先启动的Activity<action android:name="android.intent.action.MAIN" />// 决定应用程序是否显示在程序列表里<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

1.2 原理2——PM.setComponentEnabledSetting

PackageManager是一个大统领类,可以管理所有的系统组件,当然,如果Root了,你还可以管理其它App的所有组件,一些系统优化工具就是通过这个方式来禁用一些后台Service的

private void enableComponent(ComponentName componentName) {mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);
}private void disableComponent(ComponentName componentName) {mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);
}

根据
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
PackageManager.COMPONENT_ENABLED_STATE_DISABLED
这两个标志量和对应的ComponentName,就可以控制一个组件的是否启用

二、动态更换桌面icon

我们创建一个Activity,作为默认的入口并带着默认的图片,再创建一个双11的activity-alias,指向默认的Activity并带有双11的图片,再创建一个双12的activity-alias,指向默认的Activity并带有双12的图片……等等等

<activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
</activity><activity-alias
    android:name=".Test11"android:enabled="false"android:icon="@drawable/s11"android:label="双11"android:targetActivity=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
</activity-alias><activity-alias
    android:name=".Test12"android:enabled="false"android:icon="@drawable/s12"android:label="双12"android:targetActivity=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter>
</activity-alias>

默认我们会把这些activity-alias先禁用“android:enabled=”false””,等到要用的时候再启用,以避免Launcher上显示3个入口

public class MainActivity extends AppCompatActivity {private ComponentName mDefault;private ComponentName mDouble11;private ComponentName mDouble12;private PackageManager mPm;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mDefault = getComponentName();mDouble11 = new ComponentName(getBaseContext(),"com.xys.changeicon.Test11");mDouble12 = new ComponentName(getBaseContext(),"com.xys.changeicon.Test12");mPm = getApplicationContext().getPackageManager();}public void changeIcon11(View view) {disableComponent(mDefault);disableComponent(mDouble12);enableComponent(mDouble11);}public void changeIcon12(View view) {disableComponent(mDefault);disableComponent(mDouble11);enableComponent(mDouble12);}private void enableComponent(ComponentName componentName) {if(componentName == null){return;}if(pm.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_ENABLED){return;}mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);}private void disableComponent(ComponentName componentName) {if(componentName == null){return;}if(pm.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED){return;}mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED,PackageManager.DONT_KILL_APP);}
}

最终效果如图所示:

三、远程控制图标的实现方式

android kdzl本身拥有着端内推送和命令模式,可以通过“端内推送或命令模块”,对相关推送信息进行响应,对相关已经内部集成的图标样式进行切换,从而实现远程控制桌面图标的方式

四、多入口实现方式 & 快捷方式入口

kdzl拥有诸多业务模块,在正常的用户场景下进入一个具体的业务模块需要经历一下几个场景,基本要经历三个步骤:

  1. 桌面点击应用图标—>进入主界面
  2. 主界面点击应用标签页 —-> 进入应用标签页
  3. 点击具体业务应用图标 —> 进入业务模块
  4. 执行目标意图操作

然而 我们可以通过监听用户对某个业务模块的点击次数,一旦点击超过某个阈值就认为该业务为用户常用模块,提醒用户创建快捷方式,该快捷方式直接进入业务模块,从而减少操作序列以增加用户体验。

        <activity-alias
            android:name=".workattendance.activity.WorkAttendanceActivity.alias"android:enabled="false"android:icon="@drawable/v2__apps_ic__workattendence"android:label="考勤"android:targetActivity=".workattendance.activity.WorkAttendanceActivity"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity-alias>
final MsgDoubleDlgInteraction msgDoubleDlgInteraction = new MsgDoubleDlgInteraction(getActivity(), false);
msgDoubleDlgInteraction.msg().setMsg("是否为考勤应用在桌面创建快捷方式");
msgDoubleDlgInteraction.buttons().setOnLeftClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mParentActivity, WorkAttendanceActivity.class);startActivity(intent);msgDoubleDlgInteraction.dismiss();}
});
msgDoubleDlgInteraction.buttons().setOnRightClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PackageManager mPm;mPm = getActivity().getApplicationContext().getPackageManager();ComponentName componentName = new ComponentName(getContext(), FunctionConfig.PACKAGE_NAME + ".workattendance" +".activity" +".WorkAttendanceActivity" +".alias");mPm.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_ENABLED,PackageManager.DONT_KILL_APP);Intent intent = new Intent(mParentActivity, WorkAttendanceActivity.class);startActivity(intent);msgDoubleDlgInteraction.dismiss();}
});

五、其他

  1. 根据ROM的不同,在禁用了组件之后,会等一会,Launcher会自动刷新图标
  2. 在切换icon的时候,去点击应用会说未安装该应用,出现概率很低,暂时无解\
    等一下launch 自动刷新就好了,或者写一段小代码重启一下launcher
  3. activity-alias的name是不能改的,如果当前版本设置了icon_1212,升级后的下版本改成icon_act,就会导致系统找icon_1212找不到,导致桌面无图标,应用打不开!!!此坑严重请注意

参考文档

  • activity-alias详解及应用
  • Android动态修改icon–让你的app浪起来
  • [Android]动态更换应用Icon

(4.6.25)Android动态更换应用Icon之玩转桌面图标相关推荐

  1. 从微博个性图标里学Android动态更换

    一.背景 前不久,微博官方发布了一项新功能,微博年费会员可以在App设置中动态更换微博的显示图标样式,但由于部分手机存在系统差异,会导致该功能不可用,微博方面后续还会对该功能进行进一步优化. 我们可以 ...

  2. 【Android开发日常】一文弄懂桌面图标快捷菜单 桌面小组件

    本文将介绍如何创建和管理应用快捷方式.如何创建和管理应用桌面小组件. 目录 一.桌面菜单 1.1 概览 1.2.为什么需要桌面图标快捷菜单 1.3.如何实现桌面图标快捷菜单 1.3.1 创建静态快捷方 ...

  3. Android动态更换APP图标及名称

    前言 本来想研究一加手机上的天气APP,会随着每天的天气.温度不同动态的改变APP的图标是如何实现的,但始终没有想出和查阅到相关方法,毕竟是人家自己的系统APP.但是也找到了一种能动态改变图标的方法, ...

  4. 【Delphi】Android 桌面图标添加快捷菜单功能

    目录 一.为什么需要桌面图标长按快捷菜单 二.实现Android桌面图标快捷菜单 第一步:Delphi 创建一个 FMX 工程文件:ShortCut_Demo.dpr 第二步:编辑项目中的 Andro ...

  5. Android 桌面图标右上角显示未读消息数字

    背景: 在Android原生系统中,众所周知不支持桌面图标显示未读消息提醒的数字,虽然第三方控件BadgeView可以实现应用内的数字提醒.但对于系统的图标,特别是app的logo图标很难实现数字标志 ...

  6. Android中动态更换桌面图标Icon(记录)

    问题描述:支付宝.美团.淘宝之类的在某些节日的时候,桌面图标会进行自动进行变化,但是并没有进行APP更新之类的,想做这样的效果,怎么弄? 解决方案: (1)使用activity-alias来定义多个程 ...

  7. android activity alias,动态更换桌标 Activity-alias

    前言 动态更换App图标,网上可以收搜到很多,这里也是参考前人经验,读完本文可以得到,如何动态更换桌标(非网络获取桌标图片),标志位的阐述,更加透彻的理解. 用到的知识 activity-alias并 ...

  8. Android如何动态更换桌面图标(巨坑)

    转载https://blog.csdn.net/pangjl1982/article/details/83308512 1.Android如何动态更换桌面图标 1.1使用场景       APP,在中 ...

  9. Android之动态更换桌面图标

    Android之动态更换桌面图标 文章链接:http://blog.csdn.net/qq_16628781/article/details/69054325 知识点 动态更换APP 桌面icon的引 ...

最新文章

  1. 【时间序列】基于一维卷积自动特征提取的短期用水需求量预测
  2. 雷林鹏分享:PHP MySQL 创建数据库
  3. msg_p!=(void*) 0 --消息邮箱(点滴学习)
  4. 计算机中 amp 是什么符号,这里面的amp;amp;,||是什么意思,相当与数学里面的什么符号?...
  5. ★LeetCode(559)——N叉树的最大深度(JavaScript)
  6. 在浏览器上运行Qt应用 emscripten-qt
  7. 中国的顶级黑客-小榕
  8. 【pytorch目标检测】开山之作:R-CNN算法解读
  9. 内链接和外连接的区别
  10. lanhelper1.83 注册
  11. 微信小程序项目源码在线考试系统+后台含论文+PPT+源码
  12. 《计算机文件管理》教学设计,《文件和文件夹的操作》教学设计
  13. Loadrunner12.55windows-linux-os安装详细教程
  14. 北林嵌入式系统期末复习重点
  15. Registration Code
  16. 损益类科目能说出几个?
  17. 数字信号处理——CFAR检测器设计(4)
  18. mos管寄生二极管的作用
  19. 函数极限概念 极限的性质 极限存在准则 无穷大及无穷小
  20. 基于php理发店管理系统

热门文章

  1. 名悦集团:台风天汽车受损,保险公司理赔吗?
  2. linux kbengine 环境,KBEngine服务器环境搭建
  3. 第二篇 如何阅读文献~
  4. VS CODE 安装vetur后不生效问题解决
  5. 音视频技术开发周刊 | 283
  6. 利用JPcap进行抓包
  7. 和与余数的和同余理解_五年级奥数专题:余数与同余问题
  8. Freemarker简单概述及其数据类型的简单学习—快速入门(一)
  9. 傅里叶变换--虚部的理解
  10. iqoo手机计算机背景变白,电脑界面壁纸变成白色换成别的壁纸一会又变成白色了...