Android 清单与活动中的广播接收器寄存器
我需要一些帮助来理解,当我刚刚在清单中注册时,我的广播接收器什么时候可以工作,而不是必须从正在运行的活动或服务中注册 因此,例如,如果我使用以下意图过滤器注册一个独立接收器,它将在没有服务/活动引用的情况下工作:Android 清单与活动中的广播接收器寄存器,android,android-intent,broadcastreceiver,intentfilter,Android,Android Intent,Broadcastreceiver,Intentfilter,我需要一些帮助来理解,当我刚刚在清单中注册时,我的广播接收器什么时候可以工作,而不是必须从正在运行的活动或服务中注册 因此,例如,如果我使用以下意图过滤器注册一个独立接收器,它将在没有服务/活动引用的情况下工作: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.blk_burn.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.blk_burn.standalonereceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name="TestReceiver">
<intent-filter>
<action android:name="android.media.AUDIO_BECOMING_NOISY"/>
</intent-filter>
</receiver>
</application>
</manifest>
)
根据我在本网站上发现的情况,您必须从已经运行的活动或服务中注册此接收器,以使其正常工作()
- 有人能告诉我为什么在清单中调整您的意图过滤器时这不起作用,为什么您需要在后台运行一个引用/注册接收者的服务
- 是否有一个解决方案,以便我可以使用带有
android.intent.action.HEADSET_PLUG
的意向过滤器在我的应用程序清单中注册我的接收器
- 我如何识别哪些广播操作需要注册服务或活动,而不是在清单中使用正确的筛选器
如果您的接收器已在清单中注册,且您的应用程序未运行,则将创建一个新进程来处理广播。如果您在代码中注册它,它将与您注册它的活动/服务的生命周期相关联。对于某些广播,如果不存在新的应用程序进程,或者存在一些安全性、性能等方面的影响,则创建新的应用程序进程实际上没有意义,因此您只能在代码中注册接收器
至于HEADSET\u插头
广播,它的想法似乎是你已经运行的应用程序可以通过它对UI、音量等进行特定于应用程序的调整。如果你的应用程序没有运行,你不应该真的在意耳机被拔下
顺便说一句,没有一个地方对所有广播都总结了这些信息,但是每个意图都应该在JavaDoc中有一个关于如何注册和使用它的注释,但是很明显,它缺少地方。如果对Android源代码树进行grep操作,您应该能够编译一个列表。与往常一样,可以在清单文件androidmanifest.xml中配置广播接收器。以这种方式配置的广播接收器称为静态注册
您可以使用以下元素在清单文件中注册接收方:
<receiver
android:name=".ConnectivityChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
何时使用哪种方法注册
注册BroadcastReceiver的方法取决于应用程序对系统事件的处理方式。我认为,基本上有两个原因让你的应用程序想了解系统范围内的事件:
- 你的应用程序围绕这些活动提供某种服务
- 您的应用程序希望对状态更改做出优雅的反应
第一类的示例是设备一启动就需要工作的应用程序,或者在安装应用程序时必须开始某种工作的应用程序。Battery Widget Pro或App2SD是这类应用的好例子。对于此类型,必须在清单文件中注册BroadcastReceiver
第二类的示例是表示应用程序可能依赖的环境发生变化的事件。假设您的应用程序依赖于已建立的蓝牙连接。你必须对状态变化做出反应——但只有当你的应用程序处于活动状态时。在这种情况下,不需要静态注册的广播接收机。一个动态注册的会更合理
还有一些事件甚至不允许您静态注册。例如,每分钟广播一次Intent.ACTION\u TIME\u TICK事件。这是一个明智的决定,因为静态接收器会不必要地耗尽电池电量。intent.Flag。。在源代码中找到它是有意义的。感谢第一段..脱帽致意:)您是否有任何官方文件支持您的声明(如果您的接收者在清单中注册,并且您的应用程序未运行,将创建一个新进程来处理广播。)?@BehzadBahmanyar下面的链接是我能找到的最接近的东西@BehzadBahmanyar在这个问题上也看到了Commonware的评论:说得很好,兄弟,解释得很好。
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
@Override
protected void onResume() {
this.mReceiver = new ConnectivityChangeReceiver();
registerReceiver(
this.mReceiver,
new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION));
super.onResume();
}