Android 定期运行任务,但有一些异常

Android 定期运行任务,但有一些异常,android,handler,Android,Handler,我需要android应用程序在一天中特定的时间做一些事情,例如在晚上8:00应用程序应该注销。我不想使用,因为即使应用程序未运行,它也会被触发。此外,如果关闭了时间表分散器,则重新启动电话。使用Runnable将非常好,但如果手机进入睡眠状态,它将无法工作。 所以我需要的是: 应用程序在保存在首选项中的指定时间执行某些操作 只有当应用程序正在运行并登录时,即使手机处于休眠状态,也应该发生这种情况 你能提出什么建议 编辑: 此外,此任务应等待应用程序结束其其他工作结束、接收数据,如果仅在其他工作未

我需要android应用程序在一天中特定的时间做一些事情,例如在晚上8:00应用程序应该注销。我不想使用,因为即使应用程序未运行,它也会被触发。此外,如果关闭了时间表分散器,则重新启动电话。使用Runnable将非常好,但如果手机进入睡眠状态,它将无法工作。 所以我需要的是:

应用程序在保存在首选项中的指定时间执行某些操作

只有当应用程序正在运行并登录时,即使手机处于休眠状态,也应该发生这种情况

你能提出什么建议

编辑:
此外,此任务应等待应用程序结束其其他工作结束、接收数据,如果仅在其他工作未执行的特定活动(如home或main)中执行,则效果更佳。在手机睡眠时唤醒手机的唯一方法是使用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...
        }
    }
}

奇怪的请求,您可能想添加更多您正在尝试的内容,因为我担心这似乎仍然是AlarmManager的工作。您可以使用引导意图来重置警报,从而使反对无效。你的建议的问题是你需要什么服务?它的行为类似于alarmmanager,但不是alarmmanager。听起来需要更多的努力才值得。也许在适当的地方使用管理器,但检查应用程序是否正在运行?好的,我可以检查应用程序是否在警报关闭后登录,但如果当时完成了其他工作,我该如何延迟注销?对不起,我不理解这个问题。例如:BroadcastReceiver已在manifest.xml上注册。应用程序当前向服务器发送数据。警报响了。现在广播接收机打开了。它检查用户现在是否登录到应用程序。因为是这样,应用程序应该注销它。但只有到那个时,向服务器发送数据的当前任务才结束。如何从BroadcastReceiver检查应用程序正在执行的操作?若我在activity onResume中注册BroadcastReceiver,并在activity onPause中注销,我可能会错过,那个么应用程序应该注销用户。如何从BroadcastReceiver中确定哪个活动在前台?若我以某种方式确定现在正在运行该活动,那个么我无法中断应用程序与服务器的通信。在这种情况下,我如何在与服务器端通信时延迟用户注销正如我在回答中所说,您需要在可以从BroadcastReceiver访问的静态变量中跟踪应用程序正在做什么,以便它知道应用程序是否空闲。我在回答中添加了一个代码示例。希望这能说明问题