四大组件之BroadcastReceiver

1、关于BroadcastReceiver

广播接受器用来接收一些轻量级的消息然后进行后续的事务,这些消息可以是来自系统的也可以是来自应用的;

2、如何注册BroadcastReceiver

要接收广播就需要将BroadcastReceiver进行注册,注册分为静态和动态的,两者的区别是静态的一直在监听目标广播,而动态的会在注册BroadcastReceiver的组件生命周期结束时就失效了,并且在使用结束的时候要取消注册,不然会有异常;

2.1、静态注册

静态注册可以通过以下方式来注册,Receiver可以自己命名;

在action中可以添加自己想去监听的广播;

        <receiver android:name=".ReceiverA">
            <intent-filter >
                <action android:name="android.intent.action.MY_RECEIVE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

可以在onReceive()中去做接收到广播之后的事;

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i("TAG", "A中接收到的消息"+msg);
        Bundle bundle=new Bundle();
        bundle.putString("msg",msg+"ReceiverA");
        setResultExtras(bundle);
    }

2.2、动态注册

动态注册的时候自己手动重写BroadcastReceiver类,然后跟静态注册中一样重写onReceive()这个方法就行,不同之处在于不会在AndroidManifest.xml文件中进行注册,通过以下代码进行手动注册,手动取消注册;

    ReceiverA myReceiver = new ReceiverA();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_sendBroadcast).setOnClickListener(this);
        //初始化广播
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.MY_RECEIVE");
        //注册广播
        registerReceiver(myReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册
        unregisterReceiver(myReceiver);
    }

3、如何发送自定义广播

发送自定义广播很简单,只要Intent中的action跟BroadcastReceiver注册的文件中的action相同就会让BroadcastReceiver接收到广播;

            case R.id.btn_sendBroadcast:
                Intent intent = new Intent("android.intent.action.MY_RECEIVE");
                intent.putExtra("msg", "发送给广播的消息");
                sendBroadcast(intent);
                break;

4、广播的分类

Receiver分为两种,一种是有序的,一种是无序的。通过priority设置优先级的是有序的,proority范围为-1000到1000,数值越大优先级越大;

4.1、有序广播

        <receiver android:name=".ReceiverA">
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.MY_RECEIVE" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

发送有序广播需要一个权限参数

    <permission
        android:name="scott.permission.MY_RECEIVER_PERMISSION"
        android:protectionLevel="normal" />

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

通过以下代码发送有序广播,后面部分的参数必须和添加的权限参数的name一致;

 case R.id.btn_sendBroadcast:
                Intent intent = new Intent("android.intent.action.MY_RECEIVE");
                intent.putExtra("msg", "发送给广播的消息");
                sendOrderedBroadcast(intent,"scott.permission.MY_RECEIVER_PERMISSION");
                break;

当我们获取到广播之后可以通过obortBroadcast()来对广播进行拦截,优先级低于该优先级的Receiver将接收不到发送的广播;

    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.i("TAG", "A中接收到的消息"+msg);
        abortBroadcast();
    }

4.2、普通广播

普通广播就是我们上面创建的那种,没有设置优先级的,只要BroadcastReceiver拦截的是同一种广播,不管是有几个BroadcastReceiver,它们都会同时获取到发送的广播;

5、接收系统广播

接收系统广播就两点,一个是添加权限,一个是在广播注册中注明具体拦截的广播,然后就是在获取到广播后要做的事,以下是拦截开机广播的例子;

    //获取开机广播的权限
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                //开机后的广播
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("TAG", "接受到开机广播后启动服务");
    }

猜你喜欢

转载自blog.csdn.net/qq_40801158/article/details/82225366
今日推荐