Android App图标静态更新方案

来源:互联网 发布:软件项目介绍ppt模板 编辑:程序博客网 时间:2024/06/04 23:32

听说支付宝推出的AR红包推出没几天就被我朝众多大神给搞了。。不能说支付宝App的“不坚挺”,只能说众大神太厉害了偷笑~~

今天继续和大家分享Android中动态更新的内容。上篇博客中我和大家分享了如何实现Android中动态更新View的内容,从中大家也知道了如何使用DexClassLoader来动态加载Apk,以及如果通过Resource来获取外部Apk的资源。没有看的童靴点这里:Android动态加载很难?带你快速实现View动态加载热更新

本篇博客要和大家分享的内容是如何实现动态更新App图标。这种场景想必大家都见的很多了。尤其是电商App以及现在的旅游App,例如:阿里系手淘,天猫,京东,携程旅游,途牛等等。每次在到重要节日时,你会突然发现他们的App图标变了,在过完节日后又变成了默认图标。并且是悄悄的。然后你一脸懵逼,我并没有更新App哇。。

是的,你真的没有更新App。下面我就和大家分享下如何实现动态更新App图标。

Android系统为我们提供了App可以实现多入口的功能,什么叫多入口呢?顾名思义,就是可以在桌面产生多个图标(多个launch icon),给你一种多个App的感觉,但是这多个launch icon 都指定了同一个入口,即启动的Activity界面是相同的。先来看看效果:

图飞了~~

如何实现多个入口呢?系统为我们提供了activity-alias,来看看如何使用:

<activity-alias    android:name="com.example.song.wave.SecondActivity"    android:icon="@drawable/ic_laodong"    android:label="劳动节"    android:enabled="false"    android:targetActivity=".MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN"/>        <category android:name="android.intent.category.LAUNCHER"/>    </intent-filter></activity-alias>
在AndroidMainfest.xml配置文件中添加activiry-alias标签属性,上面可以看到比较常用的标签属性,其中targetActivity标注要对接的入口是哪个,就是要启动的Activity,我将其指向了MainActivty,MainActivity就是主入口:

<activity android:name=".MainActivity">    <intent-filter>        <action android:name="android.intent.action.MAIN" />        <category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity>
其他属性很简单就不再赘述了。

注意:
1. IconOne中需要使用
            android:launchMode="singleTask"
            android:clearTaskOnLaunch="true"
   否则, 下一次按Home退出后,按另一个icon进入就不会调用onNewIntent();
2. onNewIntent中注意setIntent否则getIntent()会是之前的intent.

3. activity-alias需要和主入口的相同。

4.activity-alias的enable在初始化时设置为false,就会被隐藏(即隐藏入口),如果设置为true,初始化时就会产生两个图标(即默认Activity和activity-alias)。

4.activity-alias的name是不能改的,如果当前版本的是second,下版本改成second_laodongjie,就会导致系统找second找不到,导致桌面无图标,应用打不开.

ok,实现了如何开启多个入口,那么我们就有了一个思路,换图标,只需要将默认的隐藏掉,然后显示新的activity-alias的就可以了哇。如何控制activity-alias的显示隐藏呢?大家要明白,activity就是一个Component组件哇,没错,就是PackageManager。我们可以利用setComponentEnabledSetting方法来开启和关闭组件,此时就可以动态控制桌面上图标的显示和隐藏了。
来看下核心代码:

/** * 初始化组件 */private void initComponent() {    mainComponent = getComponentName();    laodongjieComponent = new ComponentName(getBaseContext(),"com.example.song.wave.SecondActivity");}/** * 开启 */private void setComponentEnable(ComponentName componentEnable) {    mPm.setComponentEnabledSetting(componentEnable,            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,            PackageManager.DONT_KILL_APP);}/** * 关闭 */private void setComponentDisenable(ComponentName componentEnable) {    mPm.setComponentEnabledSetting(componentEnable,            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,            PackageManager.DONT_KILL_APP);}
主要原理就是通过PackManager的flag来控制componentName的显示和隐藏。

此时有童靴可能会问?这怎么能动态的实现呢?没错,一般动态实现我们的思路都是在服务端保存一个图标,然后下载到客户端,此时客户端可以重新设置加载即可。

ok,今天的内容就到这里了,最后依旧奉上源码

源码下载

2 0
原创粉丝点击