终止应用后,BroadcastReceiver不会被调用

时间:2018-12-07 09:06:07

标签: android broadcastreceiver

我制作了一个必须在后台运行的应用程序。该应用程序基本上注册了来电并将时间戳发送到我的服务器。问题是,一段时间后将其杀死,该应用无法正常运行。我以为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不会将任何信息发送到服务器。为什么?再次打开应用程序后,它将再次开始发送数据。

3 个答案:

答案 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美分: