【问题标题】:Run Task periodicaly with some exceptions定期运行任务,但有一些例外
【发布时间】:2012-06-11 14:39:45
【问题描述】:

我需要 android 应用程序在一天中的特定时间执行某些操作,例如在晚上 8:00 应用程序应该注销。我不想使用AlarmManager,因为即使应用程序没有运行它也会触发。如果手机被关闭的时间表分散器重新启动。 Handler 带有 Runnable 会非常好,但如果手机进入休眠状态,它就不起作用。 所以我需要的是:

  • 应用程序在指定时间做某事(保存在首选项中)

  • 只有当应用程序正在运行并登录时才会发生这种情况(即使手机处于睡眠状态)

    你有什么建议?

已编辑:
此外,这个任务应该等到应用程序结束它的其他工作(发送、接收数据),如果只在特定活动中执行(比如 home 或 main ,其他工作没有执行)会更好

【问题讨论】:

  • 奇怪的请求,您可能想添加更多您正在尝试做的事情,因为恐怕这仍然像是一个 AlarmManager 的工作。您可以使用 boot-intent 重置警报,使异议无效。您的建议的问题是您需要一些类似于警报管理器的东西(服务?),但不是警报管理器。听起来更多的努力是值得的。也许使用管理器,但检查应用程序是否正在运行?

标签: android handler


【解决方案1】:

在手机处于睡眠状态时唤醒手机的唯一方法是使用 AlarmManager。没有其他办法(好吧,您可以保持唤醒锁定并防止手机进入睡眠状态,但这会不必要地耗尽电池,并且您的用户会生气)。

所以您想使用 AlarmManager 安排警报。然后,当警报响起时,您可以检查自己的应用程序是否已经运行并登录(保存此信息是一些静态(ckass)变量)。如果应用程序尚未运行并登录,则什么也不做。

编辑:添加代码示例

创建一个公共静态(类)变量,您的应用程序中的所有类都可以访问该变量:

public class Globals {
    public static boolean applicationIsBusyDoingSomethingUseful = false;
}

在您的应用程序中,每当它正在做一些有用的事情并且不想被您的基于计时器的警报中断或注销时,它应该将此变量设置为“true”并且当它完成其工作并且是不再做任何有用的事情,它应该将变量重置为“false”:

public void someUsefulWork() {
    // set flag while doing useful work
    Globals.applicationIsBusyDoingSomethingUseful = true;
    // do useful work
    // ...
    // end of useful work
    Globals.applicationIsBusyDoingSomethingUseful = false;
}

在您的 BroadcastReceiver 中,当闹钟响起时,您可以检查应用程序是否在做任何有用的事情。如果是,您只需忽略警报并等待下一个警报。如果它没有做任何有用的事情,则将用户注销。

public class MyAlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
        // Check if application is doing anything useful
        if (Globals.applicationIsBusyDoingSomethingUseful) {
            // Application is busy working, so ignore this alarm
        } else {
            // Log the user out or whatever...
        }
    }
}

【讨论】:

  • 好的,我可以在警报响起后检查应用程序是否已登录,但是如果当时完成了一些其他工作,我想如何延迟注销
  • 对不起,我不明白这个问题。
  • 例如:BroadcastReceiver 在 manifest.xml 上注册。当前应用程序将数据发送到服务器。警报响起。现在广播接收器已打开。它检查用户现在是否登录应用程序。因为它是应用程序应该注销它。但只有这样当前任务(向服务器发送数据)才会结束。如何从 BroadcastReceiver 检查应用程序正在做什么?如果我在activity-onResume() 中注册BroadcastReceiver 并在activity-onPause() 中注销我可能会错过,那么应用程序应该注销用户。如何从 BroadcastReceiver 确定哪个活动在前台?
  • 如果我以某种方式确定现在正在运行的活动,我不能中断(应用程序与服务器通信)。在这种情况下,我如何在与服务器通信结束时延迟用户注销)
  • 正如我在回答中所说,您需要在可以从 BroadcastReceiver 访问的静态变量中跟踪应用程序正在执行的操作,以便它知道应用程序是否处于空闲状态。我在答案中添加了一个代码示例。希望这会让事情变得清晰
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 2019-10-24
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2014-04-26
  • 2019-10-15
相关资源
最近更新 更多