我的应用程序中有一种棘手的情况。 我实现了一种每隔60秒与远程服务器联系的机制,以检查新数据是否可用。如果是这样,新数据将显示在应用程序中。到目前为止一切都很好。
我通过以下方式实现了这个机制:
onCreate()
方法。onDestroy()
方法中停止。这可以确保只要应用程序正在运行,轮询就会一直处于活动状态。另外,如果我从MainActivity启动另一个Activity,我也希望轮询能够运行。
我的问题:
当我通过后退按钮退出应用程序时,一切正常,轮询停止。但是当我通过 Home-Button退出我的应用程序时,轮询例程仍然存活,因为我的MainActivity的onDestroy()
没有被调用,但我希望它停止。
如果我更改了我的代码并停止了我的MainActivity的onPause()
方法中的轮询例程,我遇到的问题是,当我启动一个新的Activity时,轮询也会停止。 < / p>
我想要的是什么:
只要我的应用程序(不是我的MainActivity)在前台/用户可见,我希望轮询运行。一旦用户通过从应用程序中的任何位置按下主页按钮退出应用程序,或者通过按下MainActivity中的后退按钮,我希望轮询停止。
其他:
每次切换活动时我也不想重新启动和停止服务。由于我的应用程序的用户会经常切换活动,这只会是很多开销。此外,我希望“刷新”周期正好是60秒。当我总是重新启动服务并再次停止服务时,我无法保证。它需要在应用程序启动时启动一次,并在应用程序不再处于前台时停止。
如何实现?
当应用程序处于前台以及隐藏/关闭时,是否有某种简单的方法可以检查?
这是我的singelton-polling机制:
private Timer t;
private static Updater instance;
protected Updater() {
// Exists only to defeat instantiation.
}
public static Updater getInstance() {
if(instance == null) {
instance = new Updater();
}
return instance;
}
public void startPollingRoutine(int interval, int delay) {
t = new Timer();
// Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
update(); // some asynctask that does the updating
}
}, delay, interval);
}
public static void stopPollingRoutine() {
t.cancel();
}
在代码中:
Updater.getInstance().startPollingRoutine(60000, 0);
Updater.getInstance().stopPollingRoutine();
答案 0 :(得分:4)
我认为如何处理它的最佳方法是创建一些所有活动都将扩展的BaseActivity。并在onResume / onPause中执行此操作。或者您可以尝试使用服务。
答案 1 :(得分:1)
你需要创建一个服务并在你的主类中触发它将触发服务,除非你在destroy上明确地停止它意味着onBackpressed()/ onDetroy()并让它在onPause()方法中运行
答案 2 :(得分:1)
使用单例,让它有一个计数器变量。发送意图以开始新活动时增加它,并在onPause中减少它。 你可以判断民意调查是否必须停止;当单身人士的计数器为零时。
答案 3 :(得分:0)
谢谢大家的帮助和时间。 我终于找到了满足我所有要求的解决方案。
我按照本教程使其工作: http://www.mjbshaw.com/2012/12/determining-if-your-android-application.html
基本的想法是将Application类和保持引用扩展到特定时间有多少活动“活着”。