应用程序被杀死后如何保持Intent Service的活动状态

11

我在我的应用中有一个意图服务。这个服务有一些工作要做-上传一些文件。它只在有事情要做的时候才会运行。

当满足某些条件时(例如没有网络连接),服务不会上传。因此,它注册自身到广播接收器上,以接收有关互联网连接更改的消息。

问题是,即使服务正在执行某些操作,应用程序关闭后也会停止运行,例如:

  1. 应用程序向服务发送意图
  2. 服务开始上传内容,一切正常
  3. X%已上传,应用程序被终止,服务也被终止
  4. 互联网连接发生变化 - 服务被唤醒。

如果服务在应用程序关闭后被唤醒,为什么它会随着应用程序关闭而被终止?是否有任何方法可以防止在应用程序关闭时终止服务?

我手动终止了应用程序。我知道Android随时可能会终止我的服务,我不想阻止它。我只想在用户关闭或终止应用程序后保持此服务运行。


你说的“killing”应用是什么意思? - Stefan de Bruijn
2
@StefandeBruijn 很难说。我的做法是使用主屏幕来显示正在运行的应用程序,然后退出我的应用程序。如果可能的话,我想让我的服务保持活动状态。我认为这是可能的,因为Android在广播接收器上唤醒了我的服务。 - Ari
你找到了这个问题的答案吗,@Ari? - Coas Mckey
你的意思是要防止服务被重新启动,还是希望即使应用程序被杀死,服务仍然继续运行? - Amr El Aswar
3个回答

1
因为你使用了IntentService,这意味着当活动销毁时,IntentService也将被销毁,所以你需要使用Service而不是IntentService,这样你就可以在后台上传文件。
可以通过广播接收器或将服务绑定到活动来操作服务和活动之间的关系。
编辑:
服务可以从任何线程触发。
IntentService必须从主线程触发。

Intent Service对我来说比Service更好,而且它是Intent Service并不是问题。 - Ari
但它在广播接收器事件上重新启动。 - Ari
尝试请求唤醒权限 <uses-permission android:name="android.permission.WAKE_LOCK" />PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); mWakeLock.acquire(); - Basbous
因为您使用了IntentService,这意味着IntentService将在活动销毁时销毁,这是不正确的。IntentService将在完成所有请求后自行停止。 - Binh Tran
@BinhTran 你们中间谁在说真话? - mr5
@mr5 Binh说的是实话,你链接的答案也是正确的。IntentService在执行完毕后就会结束,这意味着它不需要被显式地停止。在那个答案中,它说这不是用来持续运行的。 - mdelolmo

1

“它只在有事可做时才运行。”只是理论上的 :) - 也许这就是你想要实现的。

“问题是,即使服务正在执行某些操作,应用程序被杀死时也会被终止,例如:” 当然,会有情况下用户的操作将结束您的服务或意图服务。 是一个失败的答案。

“有没有办法防止应用程序被杀死时终止服务?” 只需在 Google 中搜索“家长控制”和“任务保护”关键字即可!


0

如果您不介意显示通知(在您的情况下,例如可以显示上传进度通知),则在IntentService(或Service)中可以调用:

startForeground(int id,Notification notification)

这应该可以防止在应用程序被杀死时终止您的服务。

根据文档:“如果杀死您的服务会对用户造成干扰(例如,如果您的服务正在执行背景音乐播放),则可以设置此标志,以便用户会注意到他们的音乐停止播放。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接