服务和Android应用程序生命周期

时间:2016-02-26 08:00:43

标签: android android-service android-lifecycle android-service-binding

我有点困惑。我已经读过使用启动服务的最大好处是它独立于应用程序,所以,即使android杀死你的应用程序,你的服务仍然存在。我的问题是:

1)如果我的服务在与应用程序相同的进程中运行,那么该服务也将存在吗?

2)我正在使用BroadcastReceiver来检测设备连接的变化,因此,如果应用程序被终止但服务不是,那么我是否还会收到连接更改?

3)如果我想从服务获取当前的连接状态,我可以使用getApplicationContext()来执行此操作,还是可以返回null?在第二种情况下,我怎样才能获得网络的当前状态?

4)与连接类似,每次应用程序将其状态从前台更改为后台(应用程序暂停/恢复时),我都会通过Otto的总线发送事件。因此,我的服务订阅了这些更改,以便了解当前的应用程序状态。如果我的申请被杀,我可以相信那些事件吗?或者他们无法发送?

3 个答案:

答案 0 :(得分:2)

首先,如果你使用前景Service,它不太可能被突然杀死。话虽如此:

  

如果我的服务在与应用程序相同的进程中运行,那么该服务也将存在吗?

嗯,不。您的Service是应用程序的一个组成部分。如果它还活着,那么申请也是如此(另见第三个问题)。 但是如果您从START_STICKY返回START_REDELIVER_INTENTonStartCommand(),那么如果系统终止(不是强制停止),它将被重新创建。

  

我正在使用BroadcastReceiver来检测设备连接的变化,因此,如果应用程序被终止但服务不是,我是否还会收到连接更改?

对于静态BroadcastReceiver(在Manifest中注册):这取决于您的应用程序的终止方式。如果用户强制停止它,则接收器将仅在用户再次启动您的应用程序后再次开始工作。在所有其他情况下:静态接收器将保持不变,如果接收器是动态创建和注册的,那么在及时关闭Activity / Service时应该注销它以避免内存泄漏,所以无论如何,这种接收器并不是全天候工作。

  

如果我想从服务获取当前的连接状态,我可以使用getApplicationContext()来执行此操作,还是可以返回null?

这个更容易:Service,就像Activity一样,扩展ContextWrapper。因此,如果它已启动并正在运行,您可以致电getApplicationContext()

  

每次应用程序将其状态从前台更改为后台时(在应用程序暂停/恢复时),我都会通过Otto的总线发送事件...如果我的应用程序被杀,我可以相信这些事件吗?或者他们无法发送?

我想在这里你可能会混淆ApplicationActivity。因为如果需要通知Service,那么您很可能会想到应用程序的可见部分以及类似的着名来电。

在这种情况下,您的活动可以在ServiceonPause()中通知onStop()。两者都保证自Version HONEYCOMB以来被调用。

现在我必须承认我不确定Otto的EventBus,但是一个肯定有用的选择是Service START_REDELIVER_INTENT并通过调用startService(myNotifyingIntent)来通知服务。< / p>

通常,您的申请流程不会因为当前Activity不再在前台而立即被杀死。因此Service很可能会收到您从onPause()发送的任何通知。

答案 1 :(得分:0)

1)服务默认死亡。但您可以覆盖 onStartCommand 并返回 START_STICKY 。还有另一面旗帜。所以请阅读更多相关信息 https://developer.android.com/reference/android/app/Service.html#START_STICKY

2)是的,我会从收件人那里接受更改。

3)getApplicationContext()不应该返回NULL。

4)如果您的应用程序已经被杀死,则应该调用onPause。所以服务在后台知道该应用程序。当你启动应用程序时,onResume调用,所以服务也会在前台知道该应用程序。

答案 2 :(得分:0)

您在Android中误解了ActivityApplication。您可以找到有关Service lifecycle here

的更多信息