我想知道当应用程序进入后台并进入前台时,在应用程序级别没有回调的原因是什么。 Activity
班级的onPause
和onResume
仅在当前热门活动中调用。如果我想停止一些具有应用程序级别范围的后台任务,那么当应用程序进入后台时,我没有简单的方法可以阻止它。对这些事件回调的需求很高。
为什么Android在暂停和恢复应用程序时没有应用程序级回调?如果不是在应用级别,它可以在任务(活动堆栈)级别在Android中实现吗?
后台Timertask定期刷新来自Web的数据的UI。当应用程序不再处于前台时,我想停止它。
目前我正在将重复代码放在BaseActivity
中。这是活动水平。任务在每次活动的每次暂停和恢复时停止并开始,应用程序转到bg或来到fg的事件隐藏在其中一个事件中,我无法知道。我想知道是否有更好的方法,我知道应用程序何时停止对用户可见。
答案 0 :(得分:4)
使用Handler代替TimerTask。如果活动未激活,则不会触发绑定到Activity的Looper的Handler的定时消息。
模式是向Handler发送一个定时消息,然后处理器将生成一个Thread / AsyncTask,它将在后台执行请求并更新UI。线程创建/销毁的开销稍微增加,但无论如何都是I / O绑定。你可以创建一个线程池,如果这个开销成为一个bototleneck(虽然我怀疑它会)。
如果确实想知道您的应用程序何时不在前台,您可以在两个活动之间使用onStop / onResume中的重叠。当从A-> B开始时,B的onResume将在A的onStop之前被调用。因此,您可以在onResume中递增全局计数器并在onStop中递减它。当且仅当没有活动可见时,该计数器才会变为0。我成功地使用它来跟踪精确的访问以进行分析。但是,它确实需要为您的所有活动提供公共基类。
答案 1 :(得分:3)
你在谈论android.app.Application类吗? 您的应用程序启动时,在启动某些活动或服务之前会创建一个应用程序,只要您的应用程序保留在内存中,它就会存在。
您可以扩展此应用程序并添加一些全局数据。在清单中指定 < application android:name =“。YourApp”>扩展类的名称。
现在你应该明白,应用程序本身不会转到前台或后台,只有Activity可以。 但是,从您的Activity中,您可以调用getApplication来获取单个Application实例(使用强制转换),并调用与焦点更改相关的自己的方法,从而了解您的应用程序整体是在前景还是后台,并根据需要运行。
Service也有getApplication()方法,它接收相同的Application对象。
大多数开发人员可能没有意识到他们可以拥有单个Application对象来保存所需的应用程序数据,而不仅仅是一堆活动和服务。
答案 2 :(得分:0)
如果你想做一些具有应用程序级别范围的后台任务,那么你应该这样做 在Service上启动新线程,为您完成此任务。
服务独立于任何活动,因此将继续运行您的任务线程 直到你停止它。