不更新APP版本的情况下自动切换应用图标

双12来了,淘宝图标默默的加上了双12字样,留心观察你会发现它们版本号并没有变。实现这个功能我们需要提前把准备切换的图片资源,放在项目开发资源目录里(mipmap目录)。

准备工作做完以后开始写代码:

首先要更改安卓清单文件列表,在清单文件中添加<activity-alias>元素,默认为禁用状态。并通过targetActivity属性将App启动时首先调用的SplashActivity作为实例化的目标 Activity。

<activity android:name=".SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<!--双12切换图标Activity别名-->
<activity-alias
    android:name=".SplashAliasActivity"
    android:enabled="false"
    android:icon="@mipmap/ic_launcher_12"
    android:targetActivity=".SplashActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity-alias>

然后,我们定义一个数据类SwitchIconTask:

//切换图标任务
data class SwitchIconTask (val launcherComponentClassName: String,  // 启动器组件类名
                           val aliasComponentClassName: String,  // 别名组件类名
                           val presetTime: Long,            // 预设时间
                           val outDateTime: Long)           // 过期时间

定义一个LauncherIconManager单例,负责图标更换相关的工作。开放添加图标切换任务的接口:

/**
 * 启动器图标管理器
 */
object LauncherIconManager {

    /** 切换图标任务Map */
    private val taskMap: LinkedHashMap<String, SwitchIconTask> = LinkedHashMap()

    /**
     * 添加图标切换任务
     * @param newTasks 新任务,可以传多个
     */
    fun addNewTask(vararg newTasks: SwitchIconTask) {
        for (newTask in newTasks) {
            // 防止重复添加任务
            if (taskMap.containsKey(newTask.aliasComponentClassName)) return
    
            // 校验任务的预设时间和过期时间
            for (queuedTask in taskMap.values) {
                if (newTask.presetTime > newTask.outDateTime) throw IllegalArgumentException("非法的任务预设时间${newTask.presetTime}, 不能晚于过期时间")
                if (newTask.presetTime <= queuedTask.outDateTime) throw IllegalArgumentException("非法的任务预设时间${newTask.presetTime}, 不能早于已添加任务的过期时间")
            }
    
            taskMap[newTask.aliasComponentClassName] = newTask
        }
    }
}

具体使用方法如下:

//使用时需要在Application中注册监听
LauncherIconManager.register(this)

//一、在Activity中使用
val format = SimpleDateFormat("yyyy-MM-dd")
var beginTime = "2020-12-12"
var endTime = "2020-12-13"
LauncherIconManager.addNewTask(
            SwitchIconTask(
                SplashActivity::class.java.name,
                "$packageName.SplashAliasActivity",
                format.parse(beginTime).time,
                format.parse(endTime).time
            )

//二、在Fragment中使用
val format = SimpleDateFormat("yyyy-MM-dd")
var beginTime = "2020-12-12"
var endTime = "2020-12-13"
LauncherIconManager.addNewTask(
            SwitchIconTask(
                SplashActivity::class.java.name,
                "${activity!!.packageName}.SplashAliasActivity",
                format.parse(beginTime).time,
                format.parse(endTime).time
            )
        )

具体实现代码参考文章:https://www.jianshu.com/p/ad567861bc0e如有疑问请联系作者。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值