AlarmManager添加定时任务

AlarmManager 定时任务详解 android 是怎么通过AlarmManager调度定时任务;AlarmManager 与 Timer ,Hander的区别;以及在不同android版本,怎么解决AlarmManager 不准问题 阅读详情

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

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

object InstallAppUtils {

    const val DEBUG_UPDATE = false
    private 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_000L
        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        repeat(6) {
            triggerAtMillis += 10_000L
            getRestartPendingIntent(context, it)?.let { pendingIntent ->
                // setExactAndAllowWhileIdle 确保在低功耗模式下也能执行
                alarmManager.setExactAndAllowWhileIdle(
                    AlarmManager.RTC_WAKEUP,
                    triggerAtMillis,
                    pendingIntent
                )
            }
        }


    }

    // 取消启动应用的定时任务
    fun cancelAlarm(context: Context) {
        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        repeat(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
        )
    }
}

使用AlarmManager实现Android应用中的定时任务 AlarmManager是Android系统中的一个系统级别的服务,用于在指定的时间间隔或指定时间点触发某个动作。它可以用来执行重复性任务、延迟执行任务或在特定时间点执行任务。本文详细介绍了如何使用AlarmManager实现Android应用中的定时任务。通过获取AlarmManager实例、设置定时任务的绝对时间触发和间隔时间触发,以及注意事项和最佳实践的讨论,帮助开发者掌握了如何在Android应用中高效地使用AlarmManager来管理和执行定时任务。 阅读详情

相关推荐

Android实现每日定时任务触发 (附完整源码)

Android实现每日定时任务触发 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 610

记录每天学习的新知识:AlarmManager 定时任务

AlarmManager 定时任务使用场景API1.设置定时任务1.1.单次定时任务 (set)参数 @AlarmType int type参数 long triggerAtMillis参数 PendingIntent operation测试代码1.2.设置在时间段执行的定时任务(setWindow)参数 long windowStartMillis参数 long windowLengthMillis1.3.设置单次准确的定时任务(setExact 、setAlarmClock)参数 AlarmClock

嗯... 5633

Android解决AlarmManager计时不准和手机灭屏后延迟的问题

然而,有时候我们可能会遇到一些问题,比如AlarmManager的计时不准确或在手机灭屏后出现延迟的情况。本文将介绍如何解决这些问题,并提供相应的源代码示例。这样,我们的定时任务就能在预定的时间准确触发,无论手机是否处于灭屏状态。在上面的示例代码中,我们使用了setExact()方法来确保定时任务准确执行,并使用ELAPSED_REALTIME_WAKEUP标志来确保任务在灭屏时也能被唤醒。在上面的示例代码中,我们添加了WAKE_LOCK权限以获取唤醒锁,并声明了我们的AlarmReceiver接收器。

JaDentenet的博客 1365

Android 使用AlarmManager实现每日定时任务触发

一、需求: 最近遇到一个需求,需要每天早上5:00触发执行一个任务,类似闹铃提醒,使用AlarmManager来实现。 二:实现 AlarmManager的基本使用大家可参考后面的文章,写的非常详细,在实现的过程中主要对闹钟的类型,及相应的triggerTime(也有starttime)设置花了点时间研究了下。 1、闹钟的类型 AlarmManager.RTC_WAKEUP 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,即当前系统时间,状态值为0; AlarmManager

孔小乐的博客 8395

Android定时器AlarmManager编程

在Android应用程序开发中,使用定时器可以实现在指定时间间隔内执行特定任务的功能。其中,AlarmManager是Android提供的一种定时器机制,可以在设备休眠状态下仍然触发任务的执行。本文将介绍如何在Android应用程序中使用AlarmManager进行定时任务编程,并提供相应的源代码示例。通过上述步骤,我们可以在Android应用程序中使用AlarmManager实现定时任务的功能。这段代码将在应用程序启动后的1分钟后触发定时任务,并且每隔1分钟重复执行一次。方法中编写具体的任务逻辑。

2301_79326559的博客 102

Android实现循环定时提醒 (附完整源码)

Android实现循环定时提醒 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 629

AlarmManager

AlarmManager 包含的主要方法: [java] view plaincopyprint? // 取消已经注册的与参数匹配的定时器      void   cancel(PendingIntent operation)     //注册一个新的延迟定时器   void   set(int type, long trigg

反思与改变 733

AlarmManager实现精准定时任务

app进程中,需要实现一个定时任务,只要设备处于开机状态,每隔半个小时,就需要定时向服务器上传一次位置信息,并且只要是有网络和获取到GPS信号,进程不能死,如果进程死掉了,需要自动重启。

Notification与AlarmManager相结合实现定时本地消息推送

AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作 AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.

zhoufuqiang30的专栏 810

Android AlarmManager实现定时循环后台任务

主要为大家详细介绍了Android AlarmManager实现定时循环后台任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9240

Alarm闹钟定时任务的处理步骤

首先,调用AlarmManager这个类是必须的,自定义个setAlarmTime方法,如下代码:public void setAlarmTime(Context context,long timeInMillis) { AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SER...

weixin_34037515的博客 284

Foxmail 7.2.25以下版本XSS漏洞实战复现:手把手教你如何构造恶意邮件(含防御方案)

本文深入解析Foxmail 7.2.25以下版本的XSS漏洞(CNVD-2025-06036),详细展示如何构造恶意邮件进行跨站脚本攻击,并提供从客户端升级到企业级防护的多层次防御方案,帮助用户有效防范安全风险。

view3的博客 163

BroadcastReceiver 动态注册

alarmmanager 和broadcastreceiver 定时任务

model2005的专栏 534

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 260

大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”

原标题:BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”BIM研究的先驱、佐治亚理工教授Charles (Chuck) M. Eastman于本周一(11月9日)在其Atlanta家中逝世。特转韩国Yonsei大学Ghang Lee教授的讣文以作纪念。过世原因未说明。BIM的出现是与当今时代科技的发展分不开的。在信息时代建筑发展面临的挑战巨大:建筑物越建越高...

weixin_39941262的博客 3303

workmanager导入android studio

关于workmanager

kim5659的博客 352

GAMES101:MacOS作业环境搭建

查看gcc/clang的位置产看gcc/clang的版本1.1.2 安装cmake。

weixin_38844255的博客 717

Android之Alarm

Android之Alarm   1 简介         Alarm是在预定的时间上触发Intent的一种独立的方法。         Alarm超出了应用程序的作用域,所以它们可以用于触发应用程序事件或动作。在应用程序关闭之后,与Broadcast Receiver结合,它们可以变得尤其的强大,可以通过设置Alarm来启动应用程序或者执行动作,而应用程序不需要打开或者处

chenbeixin的专栏 980

如何设置反馈点

前面的POWER DC仿真都是忽略反馈线进行的仿真,如果单板压降不过,电源会自动调整输出电压,来满足负载的得到额定的电压.可以看到因为设置了反馈点,源端电压就被抬高到满足压降的值了。仿真上也可以自己添加反馈点,以得到抬高后的电源输出电压值。同样以下图的CPU的Core电源为例。按照流程正常设置好参数。

weixin_54787054的博客 1148

【OS】AUTOSAR OS Alarm实现原理

AUTOSAR OS Alarm实现原理

qq_36056498的博客 1025

Android开发实践:实现每日历史事件定时通知提醒功能

本文介绍了在Android应用中实现定时通知功能的方法,以"历史今日HistoryToday"应用为例。主要内容包括:1)使用AlarmManager系统服务安排定时任务;2)通过BroadcastReceiver接收和处理广播;3)利用NotificationManager显示通知。实现步骤涵盖创建通知渠道、构建通知实例、设置定时触发逻辑等关键环节,并针对不同Android版本进行了适配处理。文章还提供了取消定时任务的方法,并指出了各版本系统的注意事项。该方案可为开发者实现类似功能提供

m0_65371943的博客 1120

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1159

Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(一)

前段时间我一个朋友在面试回来问我:那个公司要5天之内完成一个项目,功能包括每天早上6点开始执行定时任务,大批量图片上传,大批量数据库同步。我心想,后两个功能还好说,可就是每天早上6点开始执行的这种定时任务如何搞定? 有了问题,自然要琢磨怎么解决,如果接触的知识面不够,或者没有系统的学习Android API,例如不知道AlarmManager,自然是...

weixin_34234829的博客 122

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Andriod编程权威指南(第28章 后台服务)

一、创建IntentService 首先使用IntentService创建服务。IntentService并不是Android唯一的可用服务,但是最常用的,创建一个名为pollService的IntentService子类,它就是用来轮询搜索结果的服务。 1.创建PollService(PollService.java) private static final String TAG = "PollService"; public static Intent newIntent(Contex

qq_48726341的博客 272

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: android 后台下载任务,断点续传
下一篇: Android获取U盘路径
lynn8570_blog
博客等级 码龄10年 254粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值