哪里是开始长期运行,应用程序范围的后台任务的最佳位置

时间:2015-04-16 18:41:43

标签: android

我有一个长时间运行的后台任务,我希望在应用程序启动时启动并在应用程序关闭时关闭。我已经非常了解活动生命周期以及在创建和销毁活动时调用的内容。

我来自iOS背景,在那里我们有一些在应用程序启动和关闭期间进行的调用。 Android世界中有类似的东西吗?我搜索了很多,我发现的所有内容都是与活动相关的答案,而不是整个应用程序。

(Android对我来说相对较新,所以我可能只是不知道要搜索的正确术语。)

修改

我会尝试更具体一点。我有一个后台任务,需要在用户使用该应用程序时持续运行。当应用程序处于活动状态时,它将从服务器连续流式传输数据。当应用程序在后台时,它不需要运行。将此后台进程的启动/关闭与任何单个活动联系起来似乎没有意义,因为它可能与应用程序变为活动时启动的活动不同。

我(可能是错误的)假设操作系统在应用程序恢复和暂停时负责启动/停止后台线程。如果是这样的话,那么我真正需要做的就是在应用程序首次启动时启动后台任务,即当它被加载到内存中并在第一次会话时变为活动状态。

4 个答案:

答案 0 :(得分:3)

  

将此后台任务的启动/关闭与任何单个活动联系起来似乎没有意义,因为它可能与应用程序变为活动时启动的活动不同。

这是合理的。但是,实施起来有点困难。

  

我(可能是错误的)假设操作系统在应用程序恢复和暂停时负责启动/停止后台线程。

你完全倒退了。 Android不会直接或通过像AsyncTask这样的薄包装器为您自己分叉的任何线程付出一点关注。

除了这一点混淆之外,您似乎也在等待用户切换到另一个应用程序"使用" app shutdown"。在单任务操作系统中,这些可能是相同的。它们在Windows,OS X,Linux,Android等中并不相同。

所以,你似乎在寻找的是让后台线程在你的UI处于前台时运行这个流工作,然后在你的UI处于后台时停止。问题是在Android中确实没有直接的方法来实现它。

一个接近的近似值是创建并注册一个自定义Application类,覆盖onTrimMemory(),并在到达TRIM_MEMORY_UI_HIDDENTRIM_MEMORY_BACKGROUND时停止后台工作,TRIM_MEMORY_MODERATETRIM_MEMORY_COMPLETE - 您先遇到的那些。如果,当其中一个到达时,您确定您的流线程仍未完成,请将其关闭。

就启动而言,您可以在同一个onCreate()单例上使用Application。问题是,这将在任何进程创建时调用,其中可能包括您没有UI的情况(例如,您正在响应某些系统广播,例如ACTION_BOOT_COMPLETED),或者您的进程可能会您的UI部分不依赖于流式传输。如果您没有这些方案,那么onCreate()中的Application就可以了。否则,启动onCreate()中所需的任何活动的流式传输。

虽然通常我们使用Service来管理长时间运行的线程,但是我们明确希望在UI处于后台后继续线程的情况。由于您不希望这样,您可以跳过该服务。

答案 1 :(得分:1)

这取决于你想要做什么。当您第一次对应用程序感兴趣时,您可以@Override onCreate()。

或者您可能想要使用onResume(),因为只要用户将应用程序带到前台,就会调用它。 但这实际上取决于你的后台任务究竟在做什么以及你想用它做什么,以获得提供更多细节所需的确切答案。

以下是可以帮助您的活动生命周期概述: activity life cycle

答案 2 :(得分:0)

您可以扩展默认的Application类并实现它的onCreate()方法,以检测应用程序何时启动。虽然应用程序关闭时没有相应的方法。

不要忘记在清单文件中指定它。

答案 3 :(得分:0)

在Android中,除非系统内存不足,否则应用程序不会关闭。您不会收到有关此问题的警告,它只会调用您服务的onDestroy生命周期方法。如果要在屏幕上显示“活动”时执行此操作,请使用onStart和onStop。如果要在Activity驻留在内存中时执行此操作,请使用onCreate和onDestroy。