永久广播接收器

时间:2019-02-11 19:27:43

标签: android

我的手机上安装的一个应用程序,叫做“ 应用程序A ”,会产生非常有趣的数据。我不受应用程序A的控制,但是开发人员非常乐于在本地广播有趣的信息,因此其他应用程序(例如我正在构建的应用程序应用程序B )可以处理数据由其他应用程序生成。

我正在通过以下代码在BroadcastReceiver的{​​{1}}中注册onResume()

MainActivity

这非常正常,直到我的应用程序被强制停止或被Android停止(大概是为了节省电源/释放内存?)。

但是,应用程序A整天整夜都产生数据。基于此数据,应用程序B会计算出进一步的结果,并在读数方向错误时立即发出警报。至关重要的是,应用程序B中的registerReceiver(new CustomBroadCastReceiver, new IntentFilter("com.intent.filter.DATA")); 可以在任何时间点发出警报。

目前最有效的做法是使BroadcastReceiver尽可能长寿(也许甚至在用户强行停止(刷掉)应用程序的情况下)?

2 个答案:

答案 0 :(得分:0)

您需要在清单中(而不是通过编程方式)注册接收者。看到: https://developer.android.com/guide/components/broadcasts#manifest-declared-receivers

但是,如果您以Oreo +为目标,您将无法再这样做。 App A需要明确调出您的程序包,广播才能由App B清单中声明的​​接收方接收。您可以在此处阅读有关内容: https://developer.android.com/about/versions/oreo/android-8.0-changes#back-all

这不是让您的应用共享数据的好方法(因此也说明了Google逐步淘汰数据的原因)。每当另一个应用程序中发生任何事情时,必须将您的应用程序加载到内存中效率很低。想象一下,数十或数百个应用程序在各种广播方式中都执行相同的操作,这对电池寿命意味着什么。

更好的方法是让App A在内容提供程序中公开数据,而您的应用程序(不经常)唤醒并提取数据。

答案 1 :(得分:0)

您需要在应用清单文件AndroidManifest.xml中注册BroadcastReceiver

<receiver android:name=".CustomBroadCastReceiver"  android:exported="true">
    <intent-filter>
        <action android:name="com.intent.filter.DATA"/>
    </intent-filter>
</receiver>
  

安装应用程序后,系统软件包管理器将注册接收者。然后> receiver成为您应用程序中的一个单独入口点,这意味着> system可以启动应用程序并在应用程序当前未运行时传送广播。   https://developer.android.com/guide/components/broadcasts#manifest-declared-receivers

这意味着即使您关闭了应用,系统也会启动BroadcastReceiver,除非您的应用被用户https://stackoverflow.com/a/9240705/1905761强制停止

尽管从Android 8.0(Oreo)开始应用了一些限制,但您需要记住 https://developer.android.com/guide/components/broadcasts#changes-system-broadcasts