AlarmManager.setExact() 在错误的时间启动?

2023-12-26

我安排挂起的意图在 5 秒内发送,但它在 23 秒内开始。 API=19(AlarmManager.setExact(...)):

10-23 16:43:44.638  11903-11903/? D/MainActivity﹕ Fri Oct 23 16:43:44 GMT+05:00 2015: scheduled in 5000 ms
10-23 16:44:07.728  11903-11903/? D/MainActivity﹕ Fri Oct 23 16:44:07 GMT+05:00 2015: fired

private PendingIntent pendingIntent;
    private int SCHEDULE_REQUEST_CODE = 1;
    private static final String SCHEDULER_ACTION = "android.intent.action.FOTA_SCHEDULE_CHECK";

    private void log(String message) {
        StringBuilder sb = new StringBuilder();
        sb.append(new Date().toString());
        sb.append(": ");
        sb.append(message);
        sb.append("\n");

        Log.d(getClass().getSimpleName(), sb.toString());
        tv.append(sb.toString());

        tv.append("\n");
    }

    private BroadcastReceiver schedulerReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            log("fired");
        }
    };

    private void schedule() {
        registerReceiver(schedulerReceiver, new IntentFilter(SCHEDULER_ACTION));

        Intent scheduleIntent = new Intent(SCHEDULER_ACTION);
        pendingIntent = PendingIntent.getBroadcast(this, SCHEDULE_REQUEST_CODE, scheduleIntent, 0);

        AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

        // first invocation (once, exact)
        int delay = 5 * 1000; // 5s
        log("scheduled in " + delay + " ms");
        alarmManager.setExact(AlarmManager.RTC, System.currentTimeMillis() + delay, pendingIntent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        unschedule();
    }

    private void unschedule() {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);

        pendingIntent = null;

        unregisterReceiver(schedulerReceiver);
    }

我遇到了同样的问题,但是挂起的意图在 5 秒后启动,而不是我尝试设置的 2 秒。

alarmManager.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 2 * 1000, pIntent);

如果我设置5秒或更长时间,alarmManager准确地开始。我不知道在生产环境中我会得到什么严格的间隔,所以我选择 1 分钟作为短时间间隔。

所以,我的应用程序使用了postDelayed()代替AlarmManager对于短时间间隔,并且AlarmManager很长一段时间。

代码示例:

if (delay == 0) {
    Intent intent = new Intent(context, SoundService.class);
    intent.putExtra(SoundService.SOUND, sound);
    context.startService(intent);
} else if (delay <= 60) {
    (new Handler()).postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = new Intent(context, SoundService.class);
            intent.putExtra(SoundService.SOUND, sound);
            context.startService(intent);
        }
    }, delay * 1000);
} else if (delay > 60) {
    final int SDK_INT = Build.VERSION.SDK_INT;
    Intent intent = new Intent(context, AlarmBroadcastReceiver.class);
    intent.setAction("action_play: " + sound);
    intent.putExtra(SoundService.SOUND, sound);
    PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    long runTime = System.currentTimeMillis() + delay * 1000;
    if (SDK_INT < Build.VERSION_CODES.KITKAT) {
        alarmManager.set(AlarmManager.RTC_WAKEUP, runTime, pIntent);
    } else if ((SDK_INT >= Build.VERSION_CODES.KITKAT) && (SDK_INT < Build.VERSION_CODES.M)) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, runTime, pIntent);
    } else if (SDK_INT >= Build.VERSION_CODES.M) {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, runTime, pIntent);
    }
}

Where SoundService- 具有声音播放功能的服务,delay- 播放前的延迟(以秒为单位),AlarmBroadcastReceiver -

public class AlarmBroadcastReceiver extends BroadcastReceiver {
final String LOG_TAG = this.getClass().getName();

@Override
public void onReceive(Context ctx, Intent intent) {
    if (intent.getAction().startsWith("action_play:")){
        Intent playIntent = new Intent(ctx, SoundService.class);
        playIntent.putExtra(SoundService.SOUND, intent.getStringExtra(SoundService.SOUND));
        ctx.startService(playIntent);
    }
}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AlarmManager.setExact() 在错误的时间启动? 的相关文章

  • 单击弹出菜单时为什么导航栏出现在全屏应用程序中

    我有一个全屏应用程序 MainActivity java public class MainActivity extends AppCompatActivity TargetApi Build VERSION CODES KITKAT pr
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 上有哪些字体可用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道安卓有一个字体集合 http www ascenderfonts com store search
  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 使用 android AudioTrack 在左或右扬声器中播放声音

    我正在应用程序中的 AudioTrack 的帮助下播放声音 但我想在特定扬声器 耳朵中播放声音 即左扬声器或右扬声器或两个扬声器 以下代码是我用来播放声音的 private AudioTrack generateTone double fr
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • ProGuard 无法与 Windows 中使用的 Joda Time 一起编译

    实际上 这是一个答案 而不是一个问题 我确实在 Windows 上花了很多时间 使用 JodaTime 并使用 ProGuard 将其包含在我的 Android 项目中 混淆器配置 libraryjars C Users Reto Docu
  • 毕加索动画加载图像

    我有以下代码在毕加索中加载图像 使用可绘制的占位符在图像下载时显示 不过 我想要的是一个动画旋转进度条样式的旋转器 它可以在图像加载时不断地旋转 就像我在大多数专业应用程序中看到的那样 毕加索似乎不支持这一点 只支持静态图像可绘制 有没有办
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • Firebase ANR - 甚至不使用 firebase

    随着 GMS 的最新更新 引入了新的 ANR 如果您退出应用程序 然后返回 则 ANR 就会初始化 线程跟踪似乎指向 Firebase 但我什至从未开始使用 Firebase 我猜它一定是新的 GMS 包的一部分 06 11 00 34 0
  • 如何以编程方式启动 ssh 服务器 android,以及如何获取连接到设备的用户名和密码

    我正在开发像这样的应用程序sshdroid 我想在 Android 操作系统上打开 ssh 连接 并且我想从电脑连接应用程序 我使用了 JSCH lib 但是这个lib用于将android连接到pc 我的要求是pc到android 任何人都
  • 在为 Android 实现 Google 登录时,任务“:app:transformClassesWithDexForDebug”执行失败

    我正在尝试为 Android 实现 Google 登录 并且我正在按照以下说明进行操作 https developers google com identity sign in android start integrating https
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android:解析 XML 数据的最佳解析器 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在开发一个应用程序 其中我第一次要解析来自远程服务器的 xml 文件中的数据 但我无法选择哪个解析器是有效的或最适合解析的 因为我知道主要有
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • 当ScrollView滚动到底部时加载更多数据

    我有一个带有动态加载内容的滚动视图 有时可能会有很多内容 所以我想在用户滚动到底部时加载更多内容 我搜索了合适的方法 发现了两种 onScrollChanged and getScrollY 但我不知道如何将它用于我的目的 请给我一些建议

随机推荐

  • 使用移动设备的触摸事件模拟拖放事件

    前段时间 我在移动设备上的网络浏览器中进行拖放操作时遇到了困难 默认的 JavaScript 事件在移动设备上不起作用 您只能使用触摸事件 就我而言 我需要通过拖放来交换两个图像以及 ID 这里有一个例子 div display inlin
  • 从另一个 llvm::Module 获取函数声明

    在我的应用程序中 我有 2 个 LLVM 模块 运行时模块 其中包含void foo int a 函数定义 和可执行文件 我使用 LLVM C API 创建 在我的可执行模块中我创建int main int argc char argv 并
  • GNU make 不删除中间文件

    我的makefile如下 The names of targets that can be built Used in the list of valid targets when no target is specified and wh
  • 自动弹出标题,无延迟

    是否有机会执行 js onclick 函数 如果有人自动单击该图标 则会显示标题文本 或者当有人将鼠标移到其上时 标题将立即显示 现在元素的标题会在 1 秒后出现 你可以试试这个 纯css 没有js HTML div class hover
  • 什么是可标记元素?

    我已经阅读无障碍 http www w3 org TR aria in html fifth rule of aria use我偶然发现了一个我找不到准确信息的概念 HTML 可标记元素 我知道可标记元素背后的概念是可以由
  • 检查文件是否包含光栅或矢量元素? (pdf、eps、ai)

    有没有办法检查文件中是否包含光栅元素 我有兴趣对 pdf eps 和 ai 格式执行此操作 如果文件只是矢量 我将其转换为 svg 如果它有一些光栅元素 我必须将其转换为 png 文件 我正在使用 PHP 但我也可以使用任何命令行工具 例如
  • dict.viewkeys() 返回的数据类型是什么? [ 蟒蛇 2.7 ]

    我在学习dict viewkeys 今天 我发现我的python调用了它dict keys目的 我可以将其视为可迭代对象 但它不是生成器 因为我可以多次迭代它 以我有限的知识 我只知道String int float list dict t
  • html5画布kineticjs事件

    我似乎在使用事件获取时遇到问题动力学JS http kineticjs com以 1 或更小的行程在 Kinetic Line 上开火 我认为将所有行添加到一个组 然后将事件附加到一个组就足够了 但它不起作用 我已经简化了我想要完成的代码以
  • 重定向回同一页面时 CakePHP 缓存问题

    我正在使用 CakePHP 2 6 当我重定向回发出请求的同一视图时 我遇到了问题 该视图似乎已被缓存 因此在请求期间所做的任何更改都不会显示 直到再次刷新页面 这意味着 用户无法看到刚刚所做的更改 Flash 消息显示在下列的视图 这很糟
  • Vuetify 外部分页不显示页码

    我有一个 v data table 我正在尝试为其添加分页 我已按照示例文档进行操作here https vuetifyjs com en components data tables example paginate我看不出我做错了什么
  • 使用布尔运算符在 Z3 中定义约束

    比方说 我想使用 Z3 约束将字符串的每个字符限制为字符集 a zA Z0 9 我可以使用布尔运算符来指定吗 举个例子 input BitVec input s i 8 for i in range 10 for i in range 10
  • Shiny:如何在禁用操作按钮的情况下启动应用程序?

    我需要启动一个禁用 button2 的应用程序 仅应在按下 button1 后启用 我怎样才能做到这一点 我正在尝试使用启用 禁用shinyjs包裹 我可以在按 button1 后启用 button2 但是如何在禁用 button2 的情况
  • 代码更改后如何在没有 mvn clean install 的情况下构建项目?

    我在 eclipse 中有一个项目 一个带有 appengine sdk 和 maven 作为我的构建器的 java 应用程序 在我启动全新安装之前 class 文件不会刷新 因此我在代码中所做的每项更改都必须运行 mvn 干净安装 mvn
  • Maven 程序集插件:包含文件而不获取其路径文件夹

    我使用 maven assemble plugin 将依赖项 ZIP 也使用程序集插件生成 中的文件包含到最终版本 ZIP 文件中 问题是我想从依赖项中选择要获取的文件 但不复制这些文件所在的文件夹路径 只是文件 例如
  • 使用 Google Maps API 检索“商家”?

    这是一个例子 它附加了一些元素 例如 Reviews来自各个网站 qype viewlondon 等 Details由各个网站提供 Photos and other content 我不知道如何继续检索此类业务并关联我的网站上生成的任何项目
  • 使用AlwaysUseFullPath 属性了解使用DispatcherServlet 的URL 映射

    我尝试将 DispatcherServlet 中的 URL 配置为映射到不带扩展名的 URL 我终于明白了这一点 但我不明白为什么 URL 会这样工作 假设上下文为 foobar 如果 DispatcherServlet 的 url 模式为
  • GetValue、GetConstantValue 和 GetRawConstantValue 之间的区别

    两者有什么区别GetValue GetConstantValue and GetRawConstantValue上的方法PropertyInfo班级 不幸的是 MSDN 文档对这个主题不是很清楚 Both GetConstantValue
  • Xamarin - 跨平台单元测试

    我正在整合我的团队开发环境 为我们的第一个大型 Xamarin Forms 项目做好准备 从敏捷的角度涉及整个团队 在继续之前我需要验证一个假设 单元测试 我们计划使用适用于 Android 和 Windows Phone 的 TFS 以及
  • 使用 ARC 在 Lion 上查看基于 NSTableView EXC_BAD_ACCESS

    这很奇怪 我有一个超级简单的项目来学习 NSTableView 它在我的笔尖中设置 设置为基于视图的 tableView 我还设置了数据源并委托给我的控制器对象 然而 当我这样做并运行时 我得到一个 EXC BAD ACCESS 跟踪从我的
  • AlarmManager.setExact() 在错误的时间启动?

    我安排挂起的意图在 5 秒内发送 但它在 23 秒内开始 API 19 AlarmManager setExact 10 23 16 43 44 638 11903 11903 D MainActivity Fri Oct 23 16 43