欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > AlarmManager添加定时任务

AlarmManager添加定时任务

2025/3/20 14:19:45 来源:https://blog.csdn.net/github_35581409/article/details/146300027  浏览:    关键词:AlarmManager添加定时任务

通过AlarmManager添加定时任务,即使应用被杀死了,也会启动intent

用户静默安装前,定时自启动自身应用。直到应用启动完成,取消其他的定时任务

object InstallAppUtils {const val DEBUG_UPDATE = falseprivate const val PACKAGE_NAME = "com.demo.test"suspend fun installApkCmd(context: Context,filepath: String,onFailed: () -> Unit,onSuccess: () -> Unit) {LogUtils.d("InstallAppUtils installApk filepath=${filepath}")try {val apkFile = File(filepath)scheduleAppRestart(context)MmkvUtils.saveUpdatingApkFilePath(apkFile.absolutePath)delay(500)//延迟执行命令,先做好升级前的准备val process = Runtime.getRuntime().exec(arrayOf("su", "0", "pm", "install", "-r", apkFile.absolutePath))process.waitFor()if (process.exitValue() == 0) {// 安装成功LogUtils.d("APK 静默安装成功")onSuccess.invoke()} else {// 安装失败,可读取错误流以获取详细信息val errorStream = process.errorStream.bufferedReader().readText()LogUtils.d("APK 静默安装失败:$errorStream")apkFile.delete()onFailed.invoke()}} catch (e: Exception) {e.printStackTrace()}}fun clearUpdatingFile() {try {MmkvUtils.getUpdatingApkFilePath()?.let { path ->if (path.isNotEmpty()) {LogUtils.d("InstallAppUtils clearUpdatingFile $path")val file = File(path)if (file.exists()) {file.delete()}}}} catch (e: Exception) {e.printStackTrace()} finally {MmkvUtils.clearUpdatingApkFilePath()}}/*** 通过AlarmManager尝试每隔10秒启动应用*/fun scheduleAppRestart(context: Context) {// 构造启动应用的 Intent,这里假设 MainActivity 为入口var triggerAtMillis = System.currentTimeMillis() + 10_000Lval alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManagerrepeat(6) {triggerAtMillis += 10_000LgetRestartPendingIntent(context, it)?.let { pendingIntent ->// setExactAndAllowWhileIdle 确保在低功耗模式下也能执行alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,triggerAtMillis,pendingIntent)}}}// 取消启动应用的定时任务fun cancelAlarm(context: Context) {val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManagerrepeat(6) {getRestartPendingIntent(context, it)?.let { pendingIntent ->alarmManager.cancel(pendingIntent)}}}private fun getRestartPendingIntent(context: Context, requestCode: Int): PendingIntent? {
//        val intent = Intent().apply {
//            component = ComponentName(PACKAGE_NAME, LAUNCH_ACTIVITY)
//            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
//        }val launchIntent: Intent? =getPackageManager().getLaunchIntentForPackage(PACKAGE_NAME)return PendingIntent.getActivity(context,requestCode,launchIntent,PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词