定期运行任务,但有一些例外

时间:2012-06-11 14:39:45

标签: android handler

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

  • 应用程序在指定时间执行某些操作(保存在首选项中)
  • 只有在应用程序正在运行并登录时才会发生这种情况(即使手机处于睡眠状态)

    你能提出什么建议?

EDITED


  此任务应该等到应用程序结束其他工作(发送,接收数据),如果仅在特定活动中执行(如家庭或其他工作未执行的主要工作),则更好。

1 个答案:

答案 0 :(得分:0)

在睡眠时唤醒手机的唯一方法是使用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...
        }
    }
}