2012-06-11 23 views
0

我需要那个android应用程序做一些特定的时间蚂蚁的一天,例如在下午8:00应用程序应该注销。我不想使用AlarmManager,因为即使应用程序未运行,它也会启动。如果电话重新启动关闭的计划分散器,也是如此。与Runnable的Handler将是非常好的,但如果手机入睡,它不起作用。 所以,我需要的是:运行任务周期性,但有一些例外

  • 应用做一些事情在指定的时间(保存在偏好)
  • 这应该只有在应用程序运行时发生并记录在(中睡着了,甚至电话)

    你能提出什么建议?

编辑:
这个任务也应该等待,直到应用程序结束的其他工作(发送,接收数据),甚至更好,如果只在特定的活动执行(如家庭或主要在那里的其他工作不执行)

+0

奇怪的请求,你可能想要添加更多你正在尝试做的事情,因为恐怕这仍然像是一个AlarmManager的工作。您可以使用启动意图重置警报,以便异议无效。你的建议存在的问题是你需要一些像警报管理员那样的服务,但不是那种警报管理员。听起来像是更多的努力,然后它是值得的。也许使用管理器,但检查应用程序是否正在运行? – Nanne

回答

0

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

所以你想使用AlarmManager安排一个警报。然后,当警报关闭时,您可以检查自己是否应用程序已在运行并已登录(保存此信息是一些静态(ckass)变量)。如果应用程序尚未运行并已登录,则无需执行任何操作。

编辑:添加代码示例

创建可由所有类的应用程序中访问的公共静态(类)变量:

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

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

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... 
     } 
    } 
} 
+0

好吧,我可以检查应用程序是否在闹钟响起后登录,但是如果当时完成了其他一些工作,我该如何延迟登出 – Armuras

+0

对不起,我不明白这个问题。例如: –

+0

:BroadcastReceiver在manifest.xml上注册。当前应用程序将数据发送到服务器。警报被解雇。现在BroadcastReceiver已打开。它检查用户现在是否登录了应用程序。因为它是应用程序应该注销它。但只有当前任务(发送数据到服务器)结束。如何从BroadcastReceiver检查应用程序正在做什么? 如果我在activity-onResume()中注册BroadcastReceiver并在activity-onPause()中取消注册,那么我可能会错过应用程序应该注销用户。如何从BroadcastReceiver确定哪个活动处于前台? – Armuras