欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android动态修改icon方法

程序员文章站 2022-05-01 18:36:19
Android动态修改icon 南京证券项目最近的需求之一,在某一时间时应用图标icon显示4.0icon,春节时显示春节icon,当春节过后,app需还原为默认icon,也就是...

Android动态修改icon

南京证券项目最近的需求之一,在某一时间时应用图标icon显示4.0icon,春节时显示春节icon,当春节过后,app需还原为默认icon,也就是有三个icon需要变化更改,基于此需求设计开发。

1、配置Activity


    
        
        
    

一个程序可以配置多个category为LAUNCHER的activity,从而达到显示多个应用图标的效果,每个图标都是程序的一个入口,点击后显示的界面都不一样。

2、Activity设置引用

Android可以配置多个activity-alias标签 来为指定activity设置多个引用,targetActivity指定点击图标后响应的Activity, name属性为activity-alias唯一标识,java代码中通过该参数获得该activity引用。

如下配置中,为Activity设置三个引用,又因为只有tztCommHeadPageGenearlActivity的enable为true,因此,只有该图标会显示在应用程序列表中。


    
        
        
    


    
        
        
    


    
        
        
    


    
        
        
    

至于为何在此将tztCommHeadPageActivity的enable为false,因在如果tztCommHeadPageActivity的enable为true,第一次动态修改icon时,app在icon修改完成后kill掉。所以我们需要将某一如tztCommHeadPageGenearlActivity的activity-alias的enable为true,为默认组件入口,即默认icon。这里其实我也有疑问,只是暂未查出为何需如此,如有了解者还望告知。(E-mail:cr_wchf@sina.com)

3、动态禁用或启用组件

在java代码中,也可以通过ClassName来判断当前处于哪一个组件, 获得的mClassName即是在清单文件为activity或activity-alias配置的name属性,不过我此次没有用这个。

String mClassName = activity.getComponentName().getClassName();

在此,得到程序的PackageManager,通过禁止或启动对应的组件,即是重新设置activity-alias的enable属性。

String v4Path = "。。。.tztCommHeadPageV4AliasActivity";
String springPath = "。。。.tztCommHeadPageAliasActivity";
String genearlPath = "。。。.tztCommHeadPageGenearlActivity";
private void changeIcon(Activity activity,String activityPath) { PackageManager pm = activity.getPackageManager(); pm.setComponentEnabledSetting(activity.getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP); pm.setComponentEnabledSetting(new ComponentName(activity, activityPath), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); }

4、总结

通过预设activity的引用,可简单实现动态改变icon,但是还有其他问题:

1、必须写死在程序中,不能真正的动态改变;

2、程序禁止或启动组件时,需等待10秒左右时间(具体时间跟当前系统Launcher策略有关),桌面Launcher才会更新图标。