上次发版我就改了一行代码!

动态更换应用Icon

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:不可以

产品:我们可以动态更换App在Launcher里面的Icon吗

开发:让我想想……

原理1——activity-alias

在AndroidMainifest中,有两个属性:

// 决定应用程序最先启动的Activity
android.intent.action.MAIN
// 决定应用程序是否显示在程序列表里
android.intent.category.LAUNCHER 

另外,还有一个activity-alias属性,这个属性可以用于创建多个不同的入口,相信做过系统Setting和Launcher开发的开发者在系统的源码中应该见过很多。

原理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

有了上面的两个原理,来实现动态更换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>

等等,这样有个问题,那就是这样会在Launcher上显示3个入口,所以,默认我们会把这些activity-alias先禁用,等到要用的时候再启用,养兵千日,用兵一时。

public class MainActivity extends AppCompatActivity {

    private ComponentName mDefault;
    private ComponentName mDouble11;
    private ComponentName mDouble12;
    private PackageManager mPm;

    @Override
    protected 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) {
        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);
    }
}

OK了,禁用默认的Activity后,启用双11的activity-alias,结果不变还是指向了默认的Activity,但图标已经发生了改变。

根据ROM的不同,在禁用了组件之后,会等一会,Launcher会自动刷新图标。

效果参考下图。

时间: 2024-11-08 20:27:47

上次发版我就改了一行代码!的相关文章

客户端单周发版下的多分支自动化管理与实践

背景 目前,互联网产品呈现出高频优化迭代的趋势,需求方希望尽早地看到结果,并给予及时反馈,所以技术团队需要用"小步快跑"的姿势来做产品,尽早地交付新版本.基于以上背景,美团客户端研发平台适时地推行了单周发版的迭代策略.单周版本迭代的优点可以概括为三个方面:更快地验证产品创意是否符合预期,更灵活地上线节奏,更早地修复线上Bug. 首先说一下美团平台的发版策略,主要变更点是由之前的每四周发一版改为每周都有发版.具体对比如下: (旧)三周迭代指的是2周开发+1周半测试,依赖固定的排期和测试时

jenkins 配置子项目发版

刚接手公司的项目虽说也多模块.分布式部署,但是模块之间却没有被父项目管理,每个模块是一个小的父子项目,管理了两个子项目,单独维护着当前模块内使用的依赖,版本等,模块之间自然有很多重复引用的依赖,我不知道当初为什么这样创建,在我集成apollo配置中心的时候我改掉了这样依赖结构,所有的模块的依赖都和版本都统一由一个父pom管理,这也为后面埋下一个坑. 测试环境上线的时候,使用的jenkins自动部署,原以为更换了源码路径就可以了,但是发版错误提示没有定义版本号,×××的是要部署的模块代码,其他模块

linux awk常用操作(快速将fasta格式的序列改成一行显示)

Some time when you want to change the fasta seq into one line For awk:         awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }'  YourFile > newfilename For sed:             sed -n '1{x;d;x};${H;x

AEAI ESB应用集成平台v3.5.3发版说明

发版说明 应用集成平台主要作为企业信息系统的"龙骨"来集成各业务系统,实现应用和数据的互联互通,一般称之为企业服务总线(Enterprise Service BUS,ESB).在数通畅联产品家族中应用集成平台命名为AEAI ESB. 本次发版的AEAI ESB_v3.5.3_20150615是数通畅联首次正式对外发布的AEAI ESB社区版(32位,限本机访问),该产品现已上传至网盘http://pan.baidu.com/s/1o6NvxXo,具体内容如下. 升级内容 新特性 1.

Database(Mysql)发版控制二

author:skate time:2014/08/18 Database(Mysql)发版控制 The Liquibase Tool related Database 一.Installation & Configration 二.Advanced Usage of the Liquibase 三.Frequently Questions 二.Advanced Usage of the Liquibase 1.实际场景模拟 实际需求:需要把不同环境的不同分支的数据库变更合并,并按需求应用或回滚

易助工资总额管控发版说明

一.开发背景 易助工资总额管控系统-2016已经正式发版.上市,满足人事薪酬管理的基础应用,基于平台开发,这意味着软件界面信息.数据结构.功能模块及数据处理算法均可随意修改,用户可根据自身实际情况自行组装.修改模块,甚至可开发新的应用系统.是目前市场上少见的一款务实.经济.高效.灵活的企业管理系统. 二.应用特征 1.功能完备,适用性强 提供系统维护.组织管理.人事管理.合同管理.薪资管理.报表管理.政策法规.保险福利.绩效管理.考勤管理.自助管理功能模块,提供报表与图形分析功能,方便用户使用与

AEAI DP开发平台v3.3.0_20150228发版说明

产品说明 AEAI DP应用开发平台专门用于开发MIS类的Java Web应用,也称Miscdp(Misc Develope Platform)综合应用开发平台. 本次发版产品AEAI DP开发平台v3.3.0_20150228是2014年发版的开发平台v3.2.0_20141016的升级版本,该产品现已开源并上传至开源社区http://www.oschina.net/p/aeaidp,大家可以下载介质免费使用.详细内容可登入官网www.agileai.com了解,也可以加入我们的技术交流群29

AEAI WX 微信扩展框架 V1.0 版本发版说明

AEAI WX 微信扩展框架是基于 Java 封装的微信公众号二次开发框架,基于该框架可以快速接入微信,实现自定义菜单创建.信息按规则自动回复.集成企业的线上系 统(HR.CRM.微店.网站等).同时可以整合集成互联网开放资源(如:百度地图.天气预报.热映电影等). 本次发版的AEAI WX 微信扩展框架为v1.0版本,该产品现已开源并上传至开源中国,产品下载地址:http://pan.baidu.com/s/1ntsXKCT,欢迎大家下载使用,也可以加入数通畅联产品QQ技术群 29971983

AEAI Portal V3.5.2门户集成平台发版说明

AEAI Portal门户集成平台为数通畅联的核心产品,本着分享传递的理念,数通畅联将Portal_server.Portal_portlet两个项目开源,目的在于满足客户与伙伴的OEM需求,以及为广大IT爱好者的集成工具提供多一种选择,多一种便利.希望通过开源中国,分享该产品,在交流学习中,使更多的人受益.本次发版的产品AEAI Portal V3.5.2为AEAI Portal V3.5.1版本的升级版,产品下载地址: http://pan.baidu.com/s/1mgj3SV2. AEA