Android-Broadcast Receiver(广播接收器)

简单记录Broadcast Receiver(广播接收器)的简单实用

1. 广播分类

1.1 Normal broadcasts 标准广播

完全异步的广播,所有的广播接收器几乎同时受到广播且无法截断。

1.2 Ordered broadcast 有序广播

显然对比与标准广播,有序广播就是有序的,可以设置各个接收器的优先级,可以被截断。

2. 注册全局广播接收器

全部广播代表,整个Android系统中的所有广播接收器都可以收到的广播

2.1 动态注册广播接收器

接受系统广播

主要步骤如下:

  1. 自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
class NetWorkReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            networkInfo = connectivityManager.getActiveNetworkInfo();//需要申请权限
            if (networkInfo != null && networkInfo.isAvailable())
                Toast.makeText(context,"网络开启了",Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(context,"网络关闭了",Toast.LENGTH_SHORT).show();
        }
    }
  1. 在代码中新建一个自定义广播接收器的实例,并在Activity中注册,注册时需要传入该广播接收器所接受的广播类型。
public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private NetworkInfo networkInfo;
    private NetWorkReceiver netWorkReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        netWorkReceiver = new NetWorkReceiver();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//设置广播接收器接受的内容
        registerReceiver(netWorkReceiver,intentFilter);//注册广播接收器
    }
}
  1. 在Activity的onDestroy方法中要取消注册广播接收器。
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(netWorkReceiver);
    }

此时变设置好了一个接受系统广播的广播接收器,当数据网络开关出现变化时,会接受到相应的广播并发出Toast信息。

2.2 注册静态广播接收器

静态广播接收器还有一个特性,那就是在系统没有启动的时候就能够接受广播并对他进行处理

2.2.1 接受系统广播(开机启动)
  1. 同样自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"开机了!",Toast.LENGTH_LONG).show();
    }
}
  1. 在AndroidManifest.xml文件中注册(如果使用as自动创建的则自动注册)
<application
        >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        //广播接收器注册
        <receiver android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action
                    android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
    </application>
2.3 发送自定义广播并接收

自定义的广播使用静态注册

2.3.1 发送标准广播
  1. 广播接收器注册

步骤同静态广播接收器一致,不过在AndroidManifest.xml文件中不仅仅注册时,广播接收器的<intent-filter>标签里应该填写自己自定义的广播名

......
<intent-filter>
                <action
                    android:name="com.override0330.example"></action>
            </intent-filter>
......
  1. 发送广播-使用Intent发送:
......
Intent intent = new Intent("com.override0330.example");
sendBroadcast(intent);
......
2.3.2 发送有序广播
  1. 广播接收器注册

步骤同发送标准广播一致,但是多加入一个优先级的设置

......
<intent-filter android:priority="98">//设置优先级为98,最高为100
                <action
                    android:name="com.override0330.example"></action>
            </intent-filter>
......
  1. 发送有序广播
Intent intent = new Intent("com.override0330.example");
sendOrderBroadcast(intent, null);//null参数为一个与权限相关的字符串,一般情况传入null
  1. 截断广播

在想要截断的广播接收器的onReceive里使用

abortBroadcast();//截断该广播

3.使用本地广播

本地广播区别于全局广播,它只在本应用程序中传递,如果掌握了全局广播,那么本地广播的使用是非常简单的。而且貌似本地广播只能使用标准广播。
将上图中我们使用的注册广播接收器和发送广播的方法改为使用由LocalBroadcastManager的方法:

//获取LocalBroadManage实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
//注册本地广播接收器
localBroadcastManager.registerReceiver(localBroadReceiver,intentFilter);

4. 总结

广播的使用还是相当简单的,但是它的底层实现还有待我的研究√

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 广播接收器 是Android的四大组件之一,可见广播在Android中的重要性; 1. 什么是广播? 广播(Bro...
    Lost_Robot阅读 1,983评论 2 10
  • 现实中的广播:电台为了传达一些消息而发送广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了。 ...
    stevewang阅读 4,308评论 0 8
  • 广播接收器(Broadcast Receiver),是我们接触到的第二个组件。Broadcast(广播)是一种广泛...
    yzbkaka阅读 534评论 0 5
  • 作为Android的四大组件之一,广播机制一直萦绕在我们生活中,比如手机开机完成后会发出一条广播,手机电量不足时也...
    loser先生阅读 1,460评论 0 2
  • 绷带缠绕着眼睛,他坐在崖边。崖下是流云飞雪,崖上是青阳暖林。 他看不见。 一只飞鸟穿过流云,振翅一扑,流云化作云霭...
    时无一阅读 440评论 1 4