一个应用程序,让我们称之为应用程序A,它安装在我的手机上产生非常有趣的数据。我并不控制应用程序A,但是开发人员非常友好地在本地广播有趣的信息,以便其他应用程序(如我正在构建的应用程序,Application B)能够处理其他应用程序生成的数据。
我正在通过下面的代码在我的BroadcastReceiver的onResume()中注册一个MainActivity
registerReceiver(new CustomBroadCastReceiver, new IntentFilter("com.intent.filter.DATA"));这非常好,直到我的应用程序被Android强制停止或停止(大概是为了保持电源/释放内存?)。
然而,应用程序A整天整夜地生成数据。根据这些数据,应用程序B计算进一步的结果,并应发出警报,一旦读数走错了方向。应用程序B中的BroadcastReceiver必须能够在任何时间点发出警报。
什么是当前的最佳实践-使BroadcastReceiver尽可能长时间地存活(甚至可能在用户对应用程序的强制停止(滑动)中幸存下来)?
编辑:几个月后,我发现我的三星手机把我的应用程序放在了一个应用程序的节电列表中,这些应用程序将被强制和定期地杀死以保持权力。确保你的应用程序不在你自己手机上的类似列表中。
发布于 2019-02-11 19:39:27
您需要在清单中注册接收方,而不是以编程方式注册。请参阅:https://developer.android.com/guide/components/broadcasts#manifest-declared-receivers
但是,如果您以Oreo+为目标,您将无法再这样做了。应用程序A需要显式地调用您的包,以便由应用程序B的清单中声明的接收方接收到广播。你可以在这里阅读:https://developer.android.com/about/versions/oreo/android-8.0-changes#back-all
对于你的应用程序来说,这不是一个分享数据的好方法(因此谷歌正在逐步淘汰它)。每次在另一个应用程序中发生一些事情时,都必须将应用程序加载到内存中,这是效率低下的。想象一下几十个或数百个应用程序对各种广播都做同样的事情,以及这对电池寿命意味着什么。
一个更好的方法是应用程序A在内容提供商中公开数据,而您的应用程序唤醒(不经常)并提取数据。
发布于 2019-02-11 19:43:29
您需要在应用程序清单文件AndroidManifest.xml中注册您的AndroidManifest.xml
<receiver android:name=".CustomBroadCastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.intent.filter.DATA"/>
</intent-filter>
</receiver>系统包管理器在安装应用程序时注册接收器。然后,>接收器成为应用程序的独立入口点,这意味着,如果应用程序当前没有运行,系统可以启动应用程序并传送广播。https://developer.android.com/guide/components/broadcasts#manifest-declared-receivers
这意味着即使应用程序关闭,系统也会启动您的BroadcastReceiver,除非您的应用程序被用户https://stackoverflow.com/a/9240705/1905761强制停止。
您需要记住,一些限制是从Android8.0(奥利奥) https://developer.android.com/guide/components/broadcasts#changes-system-broadcasts开始实施的。
https://stackoverflow.com/questions/54637719
复制相似问题