0

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

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

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

    你能提出什么建议?

已编辑:
此外,此任务应等到应用程序结束其其他工作(发送、接收数据),如果仅在特定活动中执行(例如其他工作未执行的 home 或 main)则更好

4

1 回答 1

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...
        }
    }
}
于 2012-06-11T14:57:57.413 回答