强调强调,设置了ICON动态变化的时候,在更新APP版本的时候,必须一定要记住将icon的版本设置回默认的,否则无法安装新的版本。
使用的方法是:利用android下的activity-alias达到动态更换Icon和标题的目的。
一、知道如何关闭一个组件
关闭组件其实并不难,只要创建packageManager对象和ComponentName对象,并调用packageManager对象的setComponentEnabledSetting方法。
public void setComponentEnabledSetting (ComponentName componentName, int newState, int flags)
componentName:组件名称
newState:组件新的状态,可以设置三个值,分别是如下:
- 不可用状态:COMPONENT_ENABLED_STATE_DISABLED
- 可用状态:COMPONENT_ENABLED_STATE_ENABLED
- 默认状态:COMPONENT_ENABLED_STATE_DEFAULT
flags:行为标签,值可以是DONT_KILL_APP或者0。 0说明杀死包含该组件的app
public int getComponentEnabledSetting(ComponentName componentName)//获取组件的状态
二、使用activity-alias更换icon
1、在AndroidManifast.xml文件中设置activity-alias
需要注意的是:
- 假设要更换多个icon那么需要提前将所有可能的icon做好,并且设置为activity-alias
- 因为上述的两个activity-alias都独立的设置了<intent-filter>,且targetActivity都是为MainActivity,那么MainActivity就不需要再设置<intent-filter>了,如果设置了,就会导致程序被杀死。
- 默认新的icon的activity-alias是enable
2、在代码中通过关闭和开启组件更新icon
注意的是:
- 通过ComponentName来获取组件
- 通过setComponentEnableSetting()方法来设置组件是否可用;关键是里面的三个参数:第二个就是PackageManager.COMPONENT_ENABLED_STATE_ENABLED,表示可用;PackageManager.COMPONENT_ENABLED_STATE_DISABLED,表示不可用。
三、动态设置icon注意事项
- 在更换了icon之后,需要大约5s左右的时间系统的Launcher才会刷新,才可见icon的改变
- 假设现在的APP版本是1.0,不管是否更换了icon,那么在继续按照1.0版本的APP时时不存在问题的;
- 假设现在要安装1.2版本,如果已经存在APP版本是1.0,且icon还是使用的默认的(也就是activity-alias设置为enable的那个),那么更新版本是不存在问题的。
- 假设现在安装1.2版本,已经存在的1.0版本的icon换成了新的,且没有切换回默认的,则无法安装APP。(会报错:Error while executing: am start -n "com.mrgao.test/com.mrgao.test.default" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.mrgao.test/.default }
Error type 3
Error: Activity class {com.mrgao.test/com.mrgao.test.default} does not exist.
Error while Launching activity)
综上所述,设置了ICON动态变化的时候,在更新APP版本的时候,必须一定要记住将icon的版本设置回默认的,否则无法安装新的版本。