首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BroadcastReceiver在杀死应用程序后不会被调用

BroadcastReceiver在杀死应用程序后不会被调用
EN

Stack Overflow用户
提问于 2018-12-07 09:06:07
回答 3查看 2.3K关注 0票数 4

我做了一个一定是在后台运行的应用程序。该应用程序基本上登记来电和发送时间戳给我的服务器。问题是该应用程序在一段时间后被杀死时不能正常工作。我猜想操作系统只是简单地杀死了我的应用程序,但我不知道为什么。下面是如何在AndroidManifest.xml文件中注册我的应用程序

代码语言:javascript
运行
复制
    <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

代码语言:javascript
运行
复制
class CallReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // a lot of logic to send request using retrofit to my server
    }
}

所以问题是,经过一段时间后,应用程序可能(6-10小时)没有向服务器发送任何信息。为什么会这样呢?在再次打开应用程序之后,它又开始发送数据。

EN

回答 3

Stack Overflow用户

发布于 2020-02-12 21:42:42

在静态地在清单中注册我的BroadcastReceiver ( BR ),应用适当的意图过滤器,使用JobIntentService (并在清单中注册它)来处理从我的BR调用的工作之后,我仍然得到了不一致的结果。

一旦完成了上面列出的所有内容,即使应用程序已经关闭,您也应该能够发送一个亚行命令来激活广播和处理服务中的工作。这在某些时候对我起作用,但并不是所有的时间。

这篇文章描述了BRs的局限性。“在Android3.1中,如果用户从未启动相应的应用程序或用户通过Android菜单显式停止应用程序,则Android系统ex将禁止所有接收者默认接收意图”(AKA用户执行强制停止)

当我通过调试程序启动应用程序,然后在我的设备上滑动它(或者当我在IDE中结束调试会话时),我的ADB命令永远不会激活我的BR。但是,调试结束后,当我打开设备上的应用程序并将其关闭时,我可以通过亚行命令激活我的BR。

这是因为当您调试一个应用程序,然后手动地在设备上滑动它关闭,Android认为这是一个强制停止,因此,为什么我的BR不能被激活,直到我重新打开设备上的应用程序而不进行调试。

在互联网上搜索了几个小时,却找不到我的解决方案,所以我想我应该把它发到这里,以防某个可怜的不幸的灵魂遇到和我一样奇怪的功能。

快乐编码:)

票数 2
EN

Stack Overflow用户

发布于 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

票数 1
EN

Stack Overflow用户

发布于 2020-05-15 12:19:58

这是我的2美分:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53666321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档