Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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_Broadcastreceiver - Fatal编程技术网

Android 引导完成的广播接收器不适用于动态注册

Android 引导完成的广播接收器不适用于动态注册,android,broadcastreceiver,Android,Broadcastreceiver,我创建了一个广播接收器,并使用以下方法在清单中注册它工作正常 静态方式注册广播接收机(工作正常) <receiver android:name="DeviceRestartListener" android:enabled="true" android:exported="false" > <intent-filter> <action android:name="android

我创建了一个广播接收器,并使用以下方法在清单中注册它工作正常

静态方式注册广播接收机(工作正常)

<receiver
        android:name="DeviceRestartListener"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            </category> -->
        </intent-filter>
    </receiver>

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

没有编译和运行时错误。但在设备重新启动后,接收器未接收广播


谢谢

即使在清单中静态声明或使用应用程序上下文动态注册,所有广播接收器也不会工作。例如,意图行为,如

      Intent.ACTION_SCREEN_OFF
      Intent.ACTION_BOOT_COMPLETED

必须动态注册。在清单中声明这些操作时,不会激发它们。一些故意的行为,比如

    Intent.ACTION_TIME_CHANGED;
    Intent.ACTION_TIME_TICK;
    Intent.ACTION_TIMEZONE_CHANGED;
将在通过窗口标记不为null的上下文动态注册时激发。(如活动或对话框)

与此类似,一些意图操作如下

      Intent.ACTION_SCREEN_OFF
      Intent.ACTION_BOOT_COMPLETED

仅当它们使用清单静态注册时才起作用

在代码中注册接收者

当我们在代码中注册接收者时,我们必须在应用程序被销毁时(实际上,当注册它的活动或服务被销毁时)注销它


在清单中注册接收人

当我们在清单中声明它时,即使您的应用程序未运行,您也会使它可用

何时使用哪种方法注册

注册BroadcastReceiver的方法取决于应用程序对系统事件的处理方式。我认为,基本上有两个原因让你的应用程序想了解系统范围内的事件:

  • 你的应用程序围绕这些活动提供某种服务

  • 您的应用程序希望对状态更改做出优雅的反应

  • 第一类的示例是设备启动后需要立即工作的应用程序,或者在安装应用程序时必须开始某种工作的应用程序。Battery Widget Pro或App2SD是这类应用的好例子。对于此类型,必须在清单文件中注册BroadcastReceiver

    第二类事件的示例是表示应用程序可能依赖的环境发生变化的事件。假设您的应用程序依赖于已建立的蓝牙连接。你必须对状态变化做出反应——但只有当你的应用程序处于活动状态时。在这种情况下,不需要静态注册的广播接收机。一个动态注册的会更合理


    还有一些事件甚至不允许您静态注册。例如,每分钟广播一次Intent.ACTION\u TIME\u TICK事件。这是一个明智的决定,因为静态接收器会不必要地耗尽电池电量。

    “但接收器在设备重新启动后不会接收广播”——为什么会这样?毕竟,一旦进程终止,您的
    BroadcastReceiver
    实例就不再存在,更不用说重新启动了。