双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如有疑问请联系作者。