我制作了一个必须在后台运行的应用程序。该应用程序基本上注册了来电并将时间戳发送到我的服务器。问题是,一段时间后将其杀死,该应用无法正常运行。我以为OS只会杀死我的应用程序,但是我不知道为什么。
这是我在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小时)后,App不会将任何信息发送到服务器。为什么?再次打开应用程序后,它将再次开始发送数据。
答案 0 :(得分:2)
更新:
来自here
在允许接收方被阻止并杀死候选人之前,系统允许10秒的超时时间
因此,广播接收器的预期寿命很短(10秒)。您可以为网络通话创建服务。
原文:
来自https://developer.android.com/guide/components/services
注意:如果您的应用程序的目标API级别为26或更高,则当应用程序本身不在前台时,系统会对运行后台服务施加限制。
因此,如果您希望服务在后台运行,则必须显示一条通知以使其成为前台服务,这就是为什么android不会杀死它的原因。
另一读,说明相同:
在Android 8.0之前,创建前台服务的常用方法是创建后台服务,然后将该服务提升为前台。使用Android 8.0会很复杂。系统不允许后台应用创建后台服务。因此,Android 8.0引入了新方法startForegroundService()来在前台启动新服务。系统创建服务后,应用程序将有五秒钟的时间调用服务的startForeground()方法,以显示新服务的用户可见通知。如果该应用未在该期限内调用startForeground(),则系统将停止该服务并声明该应用为ANR。
源:https://developer.android.com/about/versions/oreo/background
答案 1 :(得分:2)
在清单中静态注册我的BroadcastReceiver(BR),应用适当的意图过滤器,使用JobIntentService(并将其注册在清单中)处理从我的BR调用的工作之后,我仍然得到不一致的结果。 / p>
完成上述所有操作后,即使该应用已关闭,您也应该能够发送ADB命令来激活广播并处理服务中的工作。有时候,这对我有用,但并非一直如此。
This article描述了对BR的限制。 “从Android 3.1开始,如果用户从未启动过相应的应用程序,或者用户通过Android菜单明确停止了该应用程序,则默认情况下,Android系统会禁止所有接收者接收意图。”(< strong>又称为用户执行强制停止)
当我通过调试启动应用程序,然后在设备上将其关闭时(或在IDE中结束调试会话时)滑动时,我的ADB命令从不激活我的BR。但是,调试会话结束后,当我在设备上打开应用程序并在关闭状态下滑动时,可以通过ADB命令激活我的BR。
发生这种情况的原因是,当您调试应用程序,然后在设备上手动滑动关闭它时,Android将此视为强制停止,因此为什么无法激活我的BR,直到我在未调试的情况下重新打开设备上的应用程序。
使互联网清理了好几个小时,无法找到我的解决方案,所以我想把它发布在这里,以防万一某个不幸的不幸灵魂遇到了与以前相同的奇怪功能。
快乐编码:)
答案 2 :(得分:0)
这是我的2美分:
尽管NEW_OUTGOING_CALL列在
https://developer.android.com/guide/components/broadcast-exceptions,
您的应用仍被认为是后台应用,执行时placed under strict conditions。 (他们从Android-O开始这样做。)
不确定这是bug还是功能,但是它是Android,总会发现一些小故障。
这可能是特定于设备的问题,请尝试使用其他类型的设备和android版本吗?
也许您需要检查以下内容: https://stackoverflow.com/a/50110586/1562087