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

前言

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

用到的知识

activity-alias并不是代表一个Activity,而是代表一个已经存在的Activity的别名。

它使用在清单文件中,类似Activity标签。它可用来设置某个Activity的快捷入口

activity-alias基本用法

android:exported=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:permission="string"

android:targetActivity="string" >

...

属性解释:

属性

含义

enabled

是否生效。配置多个activity-alias时,如果只想一个生效,就设置一个为true

exported

是否可以被其他应用调起,配置intent-filter时默认为true,未配置intent-filter时默认为false,只能被应用自身调起

icon

自定义生效时的icon

label

作用同Activity标签中的label属性,主要表现为桌面上的app名称和activity的title的名称

name

该activity-alias的名字

permission

指明通过别名声明调起目标Activity所必需的权限

targetActivity

指明目标Activity,类似于Activity标签中的name属性,需写明包类路径。表明通过activity-alias调起的是哪个Activity

使用

首先配置AndroidManifest.xml,设置别名

android:name=".activitys.WelcomeActivity"

android:configChanges="keyboard|keyboardHidden|orientation"

android:hardwareAccelerated="true"

android:label="@string/app_name"

android:screenOrientation="portrait"

android:theme="@style/Acrivity_Fullscreen">

android:name=".changeLauncherIconActivity"

android:configChanges="keyboard|keyboardHidden|orientation"

android:enabled="false"

android:icon="@drawable/yishijie_logo"

android:label="@string/app_name"

android:screenOrientation="portrait"

android:targetActivity=".activitys.WelcomeActivity">

这里要注意的是

android:name 标识:主要用于在代码中获取此组件enable的状态;

android:targetActivity标识,targetActivity标识就是点击后跳转的Activity;

icon和lable分别是启动图标和桌面名称

代码配置

思路是首先获取服务端下发接口,缓存到本地,等用户退出主页的时候执行更换图标的逻辑

获取服务端接口,接口提示更换节日图标

判断要显示组件的状态是否为显示状态COMPONENT_ENABLED_STATE_ENABLED

private boolean isComponentState(ComponentName componentName) {

return mPackageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED;

}

注意:这里的标示位

属性

含义

COMPONENT_ENABLED_STATE_DEFAULT

默认状态,xml预设的状态

COMPONENT_ENABLED_STATE_ENABLED

此组件或应用程序已明确启用,无论其清单中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED

此组件或应用程序已明确禁用,无论其清单中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED_USER

用户已明确禁用该应用程序,无论其在清单中指定了什么。

COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED

his application should be considered, until the point where the user actually wants to use it. (这个不清楚怎么翻才好,没有使用过)

如果不是则设置其可见,否则不变

注意这里设置标志位是永久性的,即使App升级获取此组件状态时,也是之前的值

private void enableComponent(ComponentName componentName) {

//此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

完整代码

public class ChangeAppIconUtils {

private PackageManager mPackageManager;

//默认桌标

private static final String DEFAULT_ICON = "com.x.x.activitys.WelcomeActivity";

//活动桌标

private static final String ANTHER_ICON = "com.x.x.changeLauncherIconActivity";

//缓存文件键值

public static final String KEY_LAUNCHER_ICON = "key_launcher_icon";

public ChangeAppIconUtils(PackageManager mPackageManager) {

this.mPackageManager = mPackageManager;

}

/**

* 启动组件

*

* @param componentName 组件名

*/

private void enableComponent(ComponentName componentName) {

//此方法用以启用和禁用组件,会覆盖Androidmanifest文件下定义的属性

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

}

/**

* 禁用组件

*

* @param componentName 组件名

*/

private void disableComponent(ComponentName componentName) {

mPackageManager.setComponentEnabledSetting(componentName,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

}

/**

* 当前组件的状态,判断当前enable状态

* 即使xml里面设置enable=false 标志位第一次获取时 还是COMPONENT_ENABLED_STATE_DEFAULT

* 所以这里判断是否为enable

*

* @param componentName return true 未被应用为可显示

*/

private boolean isComponentState(ComponentName componentName) {

//默认图标且为默认状态则返回false

return !(DEFAULT_ICON.equals(componentName.getClassName()) && mPackageManager.getComponentEnabledSetting(componentName) == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT)

&& mPackageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_ENABLED;

}

/**

* 更换app 图标

*

* @param context context

* @param changeIcon changeIcon

*/

private void changeIconState(Context context, String changeIcon) {

ComponentName defaultIcon = new ComponentName(context, DEFAULT_ICON);

ComponentName otherIcon = new ComponentName(context, ANTHER_ICON);

//判断状态

if (DEFAULT_ICON.equals(changeIcon)) {//设置默认icon

boolean componentState = isComponentState(defaultIcon);

if (componentState) {//如果不一样则设置

enableComponent(defaultIcon);

disableComponent(otherIcon);

// restartSystemLauncher(context, mPackageManager);

}

} else {//其它icon

boolean componentState = isComponentState(otherIcon);

if (componentState) {

enableComponent(otherIcon);

disableComponent(defaultIcon);

// restartSystemLauncher(context, mPackageManager);

}

}

}

/**

* 没啥用,有的rom不会让你杀掉Launcher进程,例如华为,VIVO

* @param context

* @param pm

*/

private void restartSystemLauncher(Context context, PackageManager pm) {

ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);

Intent i = new Intent(Intent.ACTION_MAIN);

i.addCategory(Intent.CATEGORY_HOME);

i.addCategory(Intent.CATEGORY_DEFAULT);

List resolves = pm.queryIntentActivities(i, 0);

for (ResolveInfo res : resolves) {

if (res.activityInfo != null && am != null) {

am.killBackgroundProcesses(res.activityInfo.packageName);

}

}

}

public void setAppLauncherIcon(Context context, String tagName) {

if (!TextUtils.isEmpty(tagName)) {

if ("icon2".equals(tagName)) {

changeIconState(context, ANTHER_ICON);

} else {

changeIconState(context, DEFAULT_ICON);

}

}

}

}

使用的时候只需要

new ChangeAppIconUtils(getPackageManager()).setAppLauncherIcon(getApplicationContext(), sharePreUtils.getStringValue(ChangeAppIconUtils.KEY_LAUNCHER_ICON, ""));

这里的sharepreUtils是工具类获取接口中下发的状态值,icon1默认图标,icon2为节日图标,因为之前有人说会导致app的重启,所以这里的操作时放在主Activity onDestory里面执行的.

问题

目前已知的问题,当改完图标之后,使用AS再次启动会无法启动,把快速启动关掉就可以了

Error while executing: am start -n "in.myinnos.changeappiconandname/in.myinnos.changeappiconandname.MainActivity-settings" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=in.myinnos.changeappiconandname/.MainActivity-settings }

Error type 3

Error: Activity class {in.myinnos.changeappiconandname/in.myinnos.changeappiconandname.MainActivity-settings} does not exist.

Error while Launching activity

这里我使用打包的方式覆盖安装没有出现这个问题

改过图标后,会过一会儿图标才会改变,有的(华为)改变之前点击会提示,但是桌面更新后就可以点进去了

使用重启桌面的方法,加快图标的切换,1.会被系统禁用例如华为 Vivo Oppo则无法重启桌面2.小米可以,但是还是会在1~3秒的时候关闭应用一次

仅仅修改的是启动图标,如果有快捷方式那么快捷方式不会发生改变,当然可以使用代码动态更新快捷方式

无法动态加载网络图片,还是仅仅是本地资源修改的桌标

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python替代php,Python架构的PHP替代方案

I am happily using fabric for my Python projects for deployment. Now I am engaged in a larger PHP project and wondering if there is something like fabric for PHP?解决方案Hmm? Why does it matter? Fabric is just python scripting. So its project language a…

MAC终端安装grunt--javascript世界得构建工具

祝贺我成为前端啦!~~从年前得小测试到今年得前端,成功转型!我真是一个进步得好青年,好少女! 这两天出去受虐,面了两家前端,表现非常不好,还是回到我现在得公司好好沉淀技术&#xff…

android sdk eclipse没导入,Android—新的eclipse导入SDK出错解决办法

原先系统崩溃,重装系统,加入一块内存条,从32位变成62位,原先的eclipse用不了;去官网下载64位的eclipse,安装,用一样的方法导入SDK。这时候肯定会提示错误,如下:1.This An…

两个分数化简比怎么化_我学《分数的意义》心得

停课不停学已经有将近两个月了,我们迈入了“分数”这一部分。听妈妈说,这一块内容很重要,可我觉得到目前为止(明天就学真分数、假分数和带分数了),分数好像并不比四年级难。看了看书,再做点练习,把这点新的…

html在线拖拽环绕,jQuery实现html元素拖拽

代码很简单,效果非常棒,直接给大家上源码:html定投金额 :元10050010002000300040005000600070008000900010000单位:元css.money-input{margin:36px auto 0;width:330px;font-size:14px;color:#818181}.input-rela{width:250px;height:42px;di…

iphone 抹除设备是什么意思_SMT设备有哪些,SMT是什么意思?

SMT设备其实就是表面贴装技术所需要的机器,一般一条SMT整线常规包含以下设备:上板机、印刷机、接驳台、SPI、贴片机、插件机、回流焊、波峰焊、AOI、X-ray、下板机等设备,以上设备是一条比较完整的smt配线清单设备,不同工厂可根据…

visual studio 安装Entity framework失败

今日通过Nuget安装Entity Framwork 6.1.3时候在最后一步石一直报错,提示“安装失败,正在回滚”。 回滚也就罢了,居然还卸载不了安装了一半的EF。 shit 考虑是不是得用管理员模式run Visual Studio 试之,然并卵。 是不是Nuget版本太…

笔记本软件页面分辨率低_笔记本最容易忽略的屏幕 有几个参数一定要知道

对于第一次购买笔记本的朋友来说,往往会忽视一个重要的硬件,那就是屏幕。尺寸有多大?分辨率是多少?色彩好不好?这些都应该是大家应该关心的问题。下面笔者就和大家聊聊笔记本屏幕应该注意的几个参数。1、尺寸屏幕尺寸示…

html优美界面左侧下拉,一组时尚的侧边栏菜单和下拉列表UI设计

这是一款非常时尚的可伸展的侧边栏菜单和select下拉列表以及手风琴式垂直下拉列表UI设计效果。它们通过简单的CSS样式设置,以及和jQuery,jqueryUI的配合,制作出非常时尚的web组件UI设计效果。制作方法HTML结构侧边栏的HTML结构使用在中嵌套无…

.NET基础 (03)生成、部署和管理

生成、部署和管理1 如何生成强签名的程序集2 如何把程序集放入GAC中3 延迟签名及其作用4 程序集的版本分哪几部分 1 如何生成强签名的程序集在生成程序集时,CLR提供了两种可选类型:强签名程序集。弱签名程序集。 强签名程序集是一个带有公钥和数字签名的…

.net 识别一维码_天若OCR文字识别 v5.0 原创好用的OCR及翻译小工具

一款非常好用的OCR及翻译小工具,集合百度、腾讯、有道、搜狗,调用了各大网站的ocr接口,免费不限次数(有道免费接口有ip限制仅供娱乐)。1、对于搜狗的接口调用的还是http://ocr.shouji.sogou.com/v2/ocr/json,这个接口识别效果很好…

html中div中加颜色,css怎样给div加边框颜色

css怎样给div加边框颜色1、css为div四个边分别添加边框border-color:#000(设置4边边框颜色为黑色)border-color:颜色值,即可设置对象边框颜色border-left-color:#000 设置左边框颜色为黑色border-right-color:#000 设置右边框颜色为黑色border-top-color:#000 设置上…

Microsoft Dynamics CRM 前瑞开发

做CRM开发最大的感受就是其前瑞开发过程中,调试起来比较麻烦,需要做一些断点还要配制一些浏览器设置,对新手来说比较困难。还有就是对REST调试,经常为了调试一个正确的结果而花费大量的时间。现在推荐一个REST 工具来调试CRM的前瑞…

割线法求解过程_求解稀疏优化问题2——临近点方法+半光滑牛顿法

这篇文章是我之前一篇文章的兄弟篇,没看过的可以看下面这个。邓康康:求解稀疏优化问题——半光滑牛顿方法​zhuanlan.zhihu.com我们考虑的问题仍然是如下的一般问题:其中 ,并且 特别大;表示一个凸可微函数,例如 表示一…

html 树形图可拖拽,HTML5拖拽API实现vue树形拖拽组件

因业务场景需要一个可拖拽修改节点位置的树形组件,因此动手撸了一个,乘此机会摸了一把html5原生拖拽。近期有时间将核心部分代码抽出,简单说下实现方式。1.树形结构-组件递归使用树形结构非常简单,tree组件作为父组件,…

navicat 或者workbench 无法连接127.0.0.1(61)的解决方法

1、输入mysql -uroot 进入命令行模式, 2、输入"show variables like %sock%;"查看sock文件所在位置 如: 3、配置客户端(以navicat为例) (1)打开mac 下的navicat(2)建立相应的连接&…

jmeter如何定位网络延时_JMeter用户定义变量和properties变量高级使用

Jmeter有个配置元素叫做用户自定义变量(英文名称是UserDefinedVariables)而我们提到的vars即是Variables的简写。 之前我们也说到过Jmeter的脚本中(jsr223sampler或者beanshell编写的脚本)使用varsput和varsget的操作(varsget和put的操作仅在threadgroup测试组线程中执行&#…

html5与跨平台开发,HTML5应用与跨平台应用开发

本课程将总体讲解开发HTML5应用和跨平台应用的方法,共分成三部分。第一部分为HTML5开发基础,带你分析并掌握多种移动开发技术和设计方式;第二部分为HTML5高级应用,讲解在HTML5中调用其它应用或服务的方法;第三部分为跨…

jQuery中的几个模块总结

Query插件,以备并希望在前端方面有所长进。请批评指正。 一,类型判断全解 JQuery判断类型扩展方法:$.type() 1 /*type: function( obj ) { 2 if ( obj null ) { 3 return obj ""; 4 } …

python实现连续数列相加_技术 | Python经典面试题解析实现斐波那契数列

黑马程序员微信号:heiniu526传智播客旗下互联网资讯,学习资源免费分享平台大家在面试过程中经常会考到斐波那契数列,斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo …