Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 永久广播接收机_Android - Fatal编程技术网

Android 永久广播接收机

Android 永久广播接收机,android,Android,安装在我手机上的一个应用程序,我们称之为应用程序A,可以产生非常有趣的数据。我不控制应用程序A,但开发人员非常友好,在本地广播了有趣的信息,以便其他应用程序(如我正在构建的应用程序,应用程序B)可以使用其他应用程序生成的数据 我正在通过我的main活动的onResume()中的以下代码注册BroadcastReceiver: registerReceiver(new CustomBroadCastReceiver, new IntentFilter("com.intent.filter.DATA

安装在我手机上的一个应用程序,我们称之为应用程序A,可以产生非常有趣的数据。我不控制应用程序A,但开发人员非常友好,在本地广播了有趣的信息,以便其他应用程序(如我正在构建的应用程序,应用程序B)可以使用其他应用程序生成的数据

我正在通过我的
main活动的
onResume()
中的以下代码注册
BroadcastReceiver

registerReceiver(new CustomBroadCastReceiver, new IntentFilter("com.intent.filter.DATA"));
这工作得非常好,直到我的应用程序被强制停止或被Android停止(大概是为了保留电源/释放内存?)

然而,应用程序A整天整夜都在生成数据。根据这些数据,应用程序B计算进一步的结果,并在读数方向错误时发出警报。应用程序B中的
广播接收器
必须能够在任何时间点发出警报

目前的最佳实践是什么,使
广播接收器保持尽可能长的活动时间(甚至可能在用户强制停止(刷走)应用程序后仍然有效)


编辑:几个月后,我发现我的三星手机把我的应用程序放在了一个省电的应用程序列表中,它会定期强制关闭这些应用程序以保持电源。确保您的应用程序不在您自己手机上的类似列表中。

您需要在清单中注册收件人,而不是以编程方式注册。见:

然而,如果你的目标是Oreo+,你将无法再这样做了。应用程序A需要显式调用您的包,以便应用程序B清单中声明的接收者接收广播。你可以在这里阅读:

这对你的应用程序共享数据来说不是一个好方法(因此谷歌正在逐步淘汰它)。每次在另一个应用程序中发生某些事情时,都必须将应用程序加载到内存中,这样做效率很低。想象一下,数十个或数百个应用程序对所有形式的广播都做同样的事情,这对电池寿命意味着什么


更好的方法是让应用程序A公开内容提供商中的数据,让你的应用程序醒来(不经常)并提取数据。

你需要在应用程序清单文件AndroidManifest.xml中注册你的BroadcastReceiver

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

这意味着即使你的应用关闭,系统也会启动你的BroadcastReceiver,除非你的应用被用户强制停止

不过,您需要记住的是,从android 8.0(Oreo)开始应用了一些限制

理论上,是什么阻止我每隔一小时左右用
AlarmManager
启动另一个
BroadcastReceiver
,然后在此
BroadcastReceiver
中注册原始接收器?这不起作用。一旦您的
onHandleIntent()
返回,您的进程将成为最需要回收的候选进程,因为从Android的角度来看,没有任何优先权。所需的时间会有所不同。事实证明,应用程序1的开发人员使用我可以自由定义的字符串调用
setPackage()
(应用程序1是开源的)。因此,我将这个字符串设置为我的包名,现在使用清单中的意图过滤器注册接收者。尽管如此,接收器整晚都没有更新。你知道为什么会这样吗?我是否需要考虑一些别的东西,而不仅仅是调用<代码> SETPACKAGE()/<代码>?我相信您需要使用<代码> SET组件()/>代码>来完全限定目标组件。你最好在应用程序1中添加一个钩子,强制它发送广播,这样你就可以更容易地进行测试。或者创建一个广播相同意图的测试工具。我怎样才能让应用程序无限期地唤醒,而不让这个唤醒过程在一两天后被扼杀?这是一个很好的问题。只是一个小提示:刷走不是强制停止。