在Android 5.1中每秒调度一次闹钟

我想在我的应用程序中每秒运行一次报警服务。它在5.1版本以下工作正常。 但在5.1设备中不会触发。 我正在使用commonsware清醒的意图服务。logcat消息是说“ 可疑短间隔1000毫秒;扩展到60秒 ”。 我怎样才能轮询5.1的每一秒? 有人可以build议我怎么做到这一点?

更多的解释:

我的用例是我需要每隔30分钟进行一次操作。 AFAIK对于这个使用报警pipe理器是有效的方式,但在这里

1)我需要向用户显示倒数计时器。 (定时器任务,倒数计时器,ScheduledExecutorService对此非常有用)
2)即使应用程序在后台,我也需要每隔30分钟(通过通知)通知用户(警报服务就足够了)

但在这里,我的问题是当应用程序在后台,当你从最近刷出应用程序(即应用程序进程被终止)没有任何服务或定时器,处理程序,执行器服务将无法正常工作。 在这种情况下,如何在完成30分钟后通知用户。 如果我以错误的方式思考,请引导我。

谢谢,
切塔尼亚

  • 在Android上closures屏幕
  • Android:唤醒和解锁手机
  • Android蓝牙和WakeLock关系
  • Android Espresso,测试前唤醒设备。 如何使用自定义清单进行测试?
  • 即使我正在发布它,WakeLock仍然保持错误
  • 如何使Android设备始终处于唤醒模式?
  • Android:前台服务与wakeLock
  • 三星“应用程序优化”function在3天后杀死后台应用程序
  • 这是Android棒棒糖的正常行为。

    可疑短时间间隔1000毫秒; 扩大到60秒

    告诉你系统不再喜欢那么短的时间间隔。

    问题#161244记载:

    这是按预期工作的,虽然目前还没有充分的文件logging(我们也知道这个问题的一面)。

    一般而言:短期和近期的警报在电池中惊人地昂贵; 需要短期或近期工作的应用程序应使用其他机制来安排其活动。

    所以不要为此使用AlarmService 。 喜欢一个线程或ExecutorsTimerTask或其他:

     // Using Handler new Handler().postDelayed(runnable, TimeUnit.SECONDS.toMillis(1)); // Using Executors Executors.newSingleThreadScheduledExecutor().schedule(runnable, 1, TimeUnit.SECONDS); 

    为什么要这么做?
    改用一个处理程序:

     Runnable runnable = new Runnable() { @Override public void run() { // do your stuff here, called every second mHandler.postDelayed(this, 1000); } }; // start it with: mHandler.post(runnable); 

    并使用以下来停止您的1秒定时器:

     mHandler.removeCallbacks(runnable); 

    同时使用1 2:

    • 使用AlarmManager每30分钟提醒用户

    • 如果您需要显示更新的活动位于前台, 那么还可以使用postDelayed()等便宜的操作来为用户定期提供更新

    我不明白你的使用情况,但每秒设置警报是矫枉过正。 你可以使用Timer 。 看看这个class级。

    这是Android 5.1的一个报告问题 ,只要您尝试设置小于60000毫秒的时间间隔的警报,就会发生这种情况。

    发生此警告是因为设置非常低的时间间隔会使您的电池快速耗尽。

    该平台上的项目成员说:

    一般而言:短期和近期的警报在电池中惊人地昂贵; 需要短期或近期工作的应用程序应使用其他机制来安排其活动。

    这就是为什么不build议在你的情况下使用Alarm

    根据你的问题更新。 即使用户手动将其从最近的应用程序列表中移除,您也希望保持后台服务的清醒。 这可以通过使用START_STICKY标志(如下所示)简单地完成。 将此代码添加到onStartCommand方法中的服务中:

     @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("LocalService", "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } 

    来源: 答案

    尝试这些步骤。

    1. 1分钟后使用Alarmmaager定期
    2. 在该警报pipe理器内使用一个处理器,几秒钟后调用并执行您的任务。

    记得

    它不是一个好主意,因为警报pipe理器不知道设备的当前情况,例如,它不考虑设备是否连接到电源插头,空闲或连接到networking。另外,警报pipe理器浪费资源因为它不关心设备何时有更多的可用资源。

    我已经成功地将最小AlarmManager时间间隔从1分钟改为30秒。

    在您的设备上将/system/framework/services.jar复制到您的计算机上。 从中提取classes.dex,以Winrar打开为例。

    下载baksmali

    java -jar baksmali.jar -o extractfolder classes.dex

    编辑extractfolder \ com \ android \ server \ AlarmManagerService $ Constants.smali

    将所有值0xea60(hex中的60000ms / 1min)replace为希望最小时间间隔为30秒的很多毫秒0x7530

    保存并返回到classes.dex

    java -Xmx512M -jar smali.jar extractfolder -o classes.dex

    在Winrar中再次打开services.jar,删除classes.dex并将新创build的classes.dex拖放到services.jar中。

    复制回/system/framework/services.jar

    重新启动设备。

    同样在我的三星设备上,软件包名称中包含警报或警报(未testing)字样,将其添加到白名单中。 当我这样做的时候,我的警报就被触发了。