我做了一个一定是在后台运行的应用程序。该应用程序基本上登记来电和发送时间戳给我的服务器。问题是该应用程序在一段时间后被杀死时不能正常工作。我猜想操作系统只是简单地杀死了我的应用程序,但我不知道为什么。下面是如何在AndroidManifest.xml
文件中注册我的应用程序
<receiver
android:enabled="true"
android:name=".receiver.CallReceiver">
<intent-filter android:priority="99">
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
<intent-filter android:priority="100">
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
这是我的CallReceiver
class CallReceiver: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
// a lot of logic to send request using retrofit to my server
}
}
所以问题是,经过一段时间后,应用程序可能(6-10小时)没有向服务器发送任何信息。为什么会这样呢?在再次打开应用程序之后,它又开始发送数据。
发布于 2020-02-12 21:42:42
在静态地在清单中注册我的BroadcastReceiver ( BR ),应用适当的意图过滤器,使用JobIntentService (并在清单中注册它)来处理从我的BR调用的工作之后,我仍然得到了不一致的结果。
一旦完成了上面列出的所有内容,即使应用程序已经关闭,您也应该能够发送一个亚行命令来激活广播和处理服务中的工作。这在某些时候对我起作用,但并不是所有的时间。
这篇文章描述了BRs的局限性。“在Android3.1中,如果用户从未启动相应的应用程序或用户通过Android菜单显式停止应用程序,则Android系统ex将禁止所有接收者默认接收意图”(AKA用户执行强制停止)
当我通过调试程序启动应用程序,然后在我的设备上滑动它(或者当我在IDE中结束调试会话时),我的ADB命令永远不会激活我的BR。但是,调试结束后,当我打开设备上的应用程序并将其关闭时,我可以通过亚行命令激活我的BR。
这是因为当您调试一个应用程序,然后手动地在设备上滑动它关闭,Android认为这是一个强制停止,因此,为什么我的BR不能被激活,直到我重新打开设备上的应用程序而不进行调试。
在互联网上搜索了几个小时,却找不到我的解决方案,所以我想我应该把它发到这里,以防某个可怜的不幸的灵魂遇到和我一样奇怪的功能。
快乐编码:)
发布于 2018-12-07 09:33:10
更新:
来自这里
系统允许的超时时间为10秒,然后才考虑接收者被阻塞,候选人被杀死。
因此,广播接收机的预期寿命很低(10秒)。您可以为网络调用创建服务。
原件:
来自https://developer.android.com/guide/components/services
注意:如果您的应用程序目标是API 26级或更高级别,则当应用程序本身不在前台时,系统会对运行后台服务施加限制。
所以,如果你想让你的服务在后台生存,你必须显示一个通知才能让它成为前台服务,这就是为什么android不会杀死它。
另一种说法是相同的:
在Android8.0之前,创建前台服务的通常方法是创建后台服务,然后将该服务推广到前台。在Android8.0中,有一个复杂的问题:系统不允许后台应用程序创建后台服务。因此,Android8.0引入了在前台启动新服务的新方法startForegroundService()。在系统创建服务之后,应用程序有5秒的时间调用服务的startForeground()方法来显示新服务的用户可见通知。如果应用程序没有在时限内调用startForeground(),系统将停止该服务,并声明该应用程序为ANR。
来源:https://developer.android.com/about/versions/oreo/background
发布于 2020-05-15 12:19:58
这是我的2美分:
https://stackoverflow.com/questions/53666321
复制相似问题