广播接受者是作为系统的监听者存在着的,它可以监听系统或系统中其他应用发生的事件来做出响应。如设备开机时,应用要检查数据的变化状况,此时就可以通过广播来把消息通知给用户。又如网络状态改变时,电量变化时都可以通过广播来通知用户。要做比喻的话,广播就像是我们的感官,能够有效且快速的从外界获取信息来反馈给自身。
  1. 广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了。从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码。广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期。所以有的时候我们可以把它当做函数看也未必不可。
  2. 和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。
  3. 每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。

二、广播事件监听的两种方法

使用广播进行事件监听有两种方法,静态注册和动态注册,又或者称冷插拔和热插拔。静态注册就是将广播接收器的相关信息写在应用的配置文件中。当有广播事件发生时,组件管理服务就会从安装包管理服务中获取已安装应用的广播组件信息。动态注册则是通过Context.registerReceiver和Context.unregisterRecever,动态将广播接收器与所需要监听的事件绑定。

  1. 静态注册
    首先是在应用的配置文件中写入注册消息,同样是跟其他组件一样写在application标签之内
    <receiver android:name=".ColdReceiver"><!-- 你的Receiver名称 -->  
       <intent-filter>  
          <action android:name="android.intent.action.COLD_BROADCAST"/>  <!-- 你广播要接受的intent名称 -->
          <category android:name="android.intent.category.DEFAULT" />  
       </intent-filter>  
    </receiver>

    然后我们建一个ColdReceiver的类,继承BroadcastReceiver,里面代码如下

    public class ColdReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            //跳转到service中
            intent = new Intent("android.intent.action.BroadcastService"); 
            intent.addFlags(1);
            //开启service
            context.startService(intent);
            //日志打印
            Log.d("TEST","静态注册");
        }
    
    }

    上面的Service启动看到了吗,这里我用了上次说过的快捷跳转。其中service的配置和内容如下

    <service android:name=".BroadcastService"><!-- 你自定义的service文件   (在<application></application>里面加)-->
            <intent-filter>
                    <action android:name="android.intent.action.BroadcastService" /><!-- 用intent启动时的快捷名(也可以用常规的方式启动) -->
                    <category android:name="android.intent.category.default" />
            </intent-filter>
            </service>
    View Code

相关文章:

  • 2021-06-27
  • 2022-12-23
  • 2021-07-20
  • 2022-12-23
  • 2021-10-03
  • 2021-12-22
  • 2021-09-15
  • 2021-08-13
猜你喜欢
  • 2021-09-28
  • 2022-12-23
  • 2021-12-04
  • 2021-12-04
  • 2021-12-04
  • 2022-12-23
  • 2021-08-16
相关资源
相似解决方案