10

我想知道当应用程序进入后台并进入前台时,在应用程序级别没有回调的原因可能是什么。Activity类的onPauseonResume仅在当前的顶级活动上调用。如果我想停止一些具有应用程序级别范围的后台任务,那么当应用程序进入后台时,我没有简单的方法可以停止它。对这些事件回调的需求很高。

为什么Android在应用程序的暂停和恢复时没有应用程序级回调?如果不在应用程序级别,它可以在任务(活动堆栈)级别在 Android 中实现吗?

真正的问题:

后台 Timertask 会定期使用来自 Web 的数据刷新 UI。当应用程序不再处于前台时,我想停止它。

目前我将重复代码放在BaseActivity. 这是在活动级别。任务在每个活动的每次暂停和恢复时停止和启动,并且应用程序进入 bg 或进入 fg 的事件隐藏在这些事件之一中,我不知道。我想知道是否有更好的方法,我的意思是知道应用程序何时停止对用户可见。

4

3 回答 3

4

使用 Handler 而不是 TimerTask。如果 Activity 未处于活动状态,则不会触发绑定到 Activity 的 Looper 的 Handler 的定时消息。

该模式是向 Handler 发送一条定时消息,该消息又会产生一个 Thread/AsyncTask,后者将在后台执行请求并更新 UI。线程创建/销毁的开销要多一些,但这无论如何都是 I/O 绑定的。如果该开销成为瓶颈,您可以创建一个线程池(尽管我怀疑它会)。

如果您真的想知道您的应用程序何时不再处于前台,您可以在两个活动之间使用 onStop/onResume 中的重叠。当从 A->B 开始时,B 的 onResume 将在 A 的 onStop 之前被调用。因此,您可以在 onResume 中增加一个全局计数器并在 onStop 中减少它。当且仅当没有活动可见时,该计数器才会变为 0。我成功地使用它来跟踪精确的访问以进行分析。不过,它确实需要一个用于所有活动的通用基类。

于 2011-09-16T21:53:50.440 回答
3

你说的是 android.app.Application 类吗?当您的应用程序启动时,在启动某些 Activity 或服务之前,会创建一个应用程序,并且只要您的应用程序保留在内存中,它就会一直存在。

您可以扩展此应用程序并在其中放置一些全局数据。在 <application android:name=".YourApp"> 的清单中指定扩展类的名称。

现在你应该明白了,Application 本身不会进入前台或后台,只有 Activity 可以。但是,从您的 Activity 中,您可以调用 getApplication 来获取您的单个应用程序实例(使用强制转换),并调用您自己的与焦点更改相关的方法,从而了解您的应用程序作为一个整体是在前台还是后台,并根据需要运行。

Service 也有 getApplication() 方法,它接收相同的 Application 对象。

大多数开发人员可能没有意识到他们可以使用单个应用程序对象来保存所需的应用程序数据,而不仅仅是一堆活动和服务。

于 2011-09-16T20:54:55.777 回答
0

如果您想做一些具有应用程序级别范围的后台任务,那么您应该在服务上启动一个新线程来为您完成此任务。

该服务独立于任何活动,因此将继续运行您的任务线程,直到您停止它。

于 2011-09-07T18:25:46.767 回答