<activity-alias
android:name=".SplashAliasActivity"
android:enabled=“false”
android:icon="@mipmap/ic_launcher_88"
android:targetActivity=".SplashActivity">
<activity-alias
android:name=".SplashAlias2Activity"
android:enabled=“false”
android:icon="@mipmap/ic_launcher_11_11"
android:targetActivity=".SplashActivity">
随后,我们图标替换的工作视作一项任务,定义一个数据类:
/**
- 切换图标任务
*/
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
}
}
…
}
LauncherIconManager.addNewTask(
SwitchIconTask(
SplashActivity::class.java.name,
“$packageName.SplashAliasActivity”,
format.parse(“2020-08-02”).time,
format.parse(“2020-08-09”).time
),
SwitchIconTask(
SplashActivity::class.java.name,
“$packageName.SplashAlias2Activity”,
format.parse(“2020-11-05”).time,
format.parse(“2020-11-12”).time
)
)
通过Application#registerActivityLifecycleCallbacks方法注册了对应用内Activity生命周期的监听,通过是否有活跃状态的Activity判断应用是否进入了后台:
/**
- 应用运行状态注册器
*/
object RunningStateRegister {
fun register(application: Application, callback: StateCallback) {
application.registerActivityLifecycleCallbacks(object : SimpleActivityLifecycleCallbacks() {
private var startedActivityCount = 0
override fun onActivityStarted(activity: Activity) {
if (startedActivityCount == 0) {
callback.onForeground()
}
startedActivityCount++
}
override fun onActivityStopped(activity: Activity) {
startedActivityCount–
if (startedActivityCount == 0) {
callback.onBackground()
}
}
})
}
}
class BaseApplication : Application() {
override fun onCreate() {
super.onCreate()
LauncherIconManager.register(this)
}
}
判断应用进入后台后,就可以开始对图标的更换工作了:
/**
- 启动器图标管理器
*/
object LauncherIconManager {
…
/**
- 注册以监听应用运行状态
*/
fun register(application: Application) {
RunningStateRegister.register(application, object: RunningStateRegister.StateCallback{
override fun onForeground() {
}
override fun onBackground() {
proofreadingInOrder(application)
}
})
}
/**
-
依次校对预设时间
-
@param context 上下文
*/
fun proofreadingInOrder(context: Context) {
for (task in taskMap.values) {
if (proofreading(context, task)) break
}
}
/**
-
校对预设时间/过期时间
-
@param context 上下文
-
@return true 已过预设时间 false 未达预设时间或已过期
*/
private fun proofreading(context: Context, task: SwitchIconTask) =
when {
isPassedOutDateTime(task) -> {
*/
fun proofreadingInOrder(context: Context) {
for (task in taskMap.values) {
if (proofreading(context, task)) break
}
}
/**
-
校对预设时间/过期时间
-
@param context 上下文
-
@return true 已过预设时间 false 未达预设时间或已过期
*/
private fun proofreading(context: Context, task: SwitchIconTask) =
when {
isPassedOutDateTime(task) -> {
更多推荐
Android:双11已经过了双12都要到了,还不给你的APP加上自动换图标的功能吗
发布评论