我有点困惑。我已经读过使用启动服务的最大好处是它独立于应用程序,所以,即使android杀死你的应用程序,你的服务仍然存在。我的问题是:
1)如果我的服务在与应用程序相同的进程中运行,那么该服务也将存在吗?
2)我正在使用BroadcastReceiver来检测设备连接的变化,因此,如果应用程序被终止但服务不是,那么我是否还会收到连接更改?
3)如果我想从服务获取当前的连接状态,我可以使用getApplicationContext()来执行此操作,还是可以返回null?在第二种情况下,我怎样才能获得网络的当前状态?
4)与连接类似,每次应用程序将其状态从前台更改为后台(应用程序暂停/恢复时),我都会通过Otto的总线发送事件。因此,我的服务订阅了这些更改,以便了解当前的应用程序状态。如果我的申请被杀,我可以相信那些事件吗?或者他们无法发送?
答案 0 :(得分:2)
首先,如果你使用前景Service
,它不太可能被突然杀死。话虽如此:
如果我的服务在与应用程序相同的进程中运行,那么该服务也将存在吗?
嗯,不。您的Service
是应用程序的一个组成部分。如果它还活着,那么申请也是如此(另见第三个问题)。 但是如果您从START_STICKY
返回START_REDELIVER_INTENT
或onStartCommand()
,那么如果系统终止(不是强制停止),它将被重新创建。
我正在使用BroadcastReceiver来检测设备连接的变化,因此,如果应用程序被终止但服务不是,我是否还会收到连接更改?
对于静态BroadcastReceiver
(在Manifest
中注册):这取决于您的应用程序的终止方式。如果用户强制停止它,则接收器将仅在用户再次启动您的应用程序后再次开始工作。在所有其他情况下:静态接收器将保持不变,如果接收器是动态创建和注册的,那么在及时关闭Activity
/ Service
时应该注销它以避免内存泄漏,所以无论如何,这种接收器并不是全天候工作。
如果我想从服务获取当前的连接状态,我可以使用getApplicationContext()来执行此操作,还是可以返回null?
这个更容易:Service
,就像Activity
一样,扩展ContextWrapper
。因此,如果它已启动并正在运行,您可以致电getApplicationContext()
。
每次应用程序将其状态从前台更改为后台时(在应用程序暂停/恢复时),我都会通过Otto的总线发送事件...如果我的应用程序被杀,我可以相信这些事件吗?或者他们无法发送?
我想在这里你可能会混淆Application
和Activity
。因为如果需要通知Service
,那么您很可能会想到应用程序的可见部分以及类似的着名来电。
在这种情况下,您的活动可以在Service
或onPause()
中通知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中误解了Activity和Application。您可以找到有关Service lifecycle here
的更多信息