Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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_Android Intent_Broadcastreceiver_Intentfilter - Fatal编程技术网

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();
}