惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
雷峰网
雷峰网
V
Visual Studio Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
月光博客
月光博客
A
About on SuperTechFans
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale

博客园 - MSTK

PCB检测算法YOLO-EMAC(2) PCB检测算法YOLO-EMAC(1) Android Studio提高Build速度 Android创建LiteOrmManager类(4) DecoView的使用 Android创建LiteOrmManager类(3) Android创建LiteOrmManager类(2) Android创建LiteOrmManager类(1) Android使用Snackbar Unable to add window -- token null is not valid; is your activity running? Android Studio集成通义灵码 MonoDETR(2) MonoDETR(1) The color "XXX" in values has no declaration in the base values folder; this can lead to crashes when the resource is queried in a configuration that does not match this qualifier LiteORM的使用(2) LiteORM的使用(1) 使用AlarmManager实现APP保活(2) CEC2017的30个函数 使用双进程实现Android APP保活 Process finished with exit code 137 (interrupted by signal 9: SIGKILL) GIT RE-BASIN: MERGING MODELS MODULO PERMUTATION SYMMETRIES (1) MMpretrain使用Tiny ImageNet数据集 Ubuntu使用dd命令实现硬盘级复制 PyCharm debug collecting data...
使用AlarmManager实现APP保活(1)
MSTK · 2025-03-26 · via 博客园 - MSTK

首先,定义两个类:Alarm_Scheduler和Alarm_Receiver,Alarm_Scheduler的代码如下:

public class Alarm_Scheduler {
    public static void schedule_alarm(Context context) {
        AlarmManager alarm_manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, Alarm_Receiver.class);
        PendingIntent pending_intent = PendingIntent.getBroadcast(
                context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

        // 高版本无法setExactAndAllowWhileIdle
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            if (!alarm_manager.canScheduleExactAlarms()) {
                try {
                    intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM);
                    intent.setData(Uri.parse("package:" + context.getPackageName()));
                    context.startActivity(intent);
                } catch (ActivityNotFoundException e1) {
                    try {
                        // 跳转到应用详情页备选
                        Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                        settingsIntent.setData(Uri.parse("package:" + context.getPackageName()));
                        context.startActivity(settingsIntent);
                    }
                    catch (ActivityNotFoundException e2) {
                        // 显示手动引导弹窗
                    }
                }
            }
        }

        // 设置精确唤醒(根据系统版本适配)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            alarm_manager.setExactAndAllowWhileIdle(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis() + TraceApplication.alarm_interval,
                    pending_intent);
        }
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            alarm_manager.setExact(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis() + TraceApplication.alarm_interval,
                    pending_intent);
        }
        else {
            alarm_manager.set(
                    AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis() + TraceApplication.alarm_interval,
                    pending_intent);
        }
}

首先获得一个AlarmManager的实例,再定义一个PendingIntent启动Alarm_Receiver.

‌setExactAndAllowWhileIdle是Android中用于设置精确闹钟的方法,它允许在设备处于低功耗模式(如Doze模式)时仍然能够触发闹钟‌.这种方法特别适用于需要确保在特定时间触发闹钟的应用场景.然而,高版本的Android系统(API版本31及以上)禁止使用这个方法,因此要判断Android系统的版本,对于高版本的系统引导用户进行设置,允许使用‌setExactAndAllowWhileIdle方法.

然后根据不同的系统版本设置闹钟,API版本23及以上的使用setExactAndAllowWhileIdle(),19~22使用setExact(),18及以下使用set().