美文网首页
发送广播

发送广播

作者: shenlong77 | 来源:发表于2017-06-08 15:04 被阅读0次

    发送广播只是需要发送自己定义的广播,那种类似于系统广播等已有的广播是不需要自己手动的发送的。
    无论广播注册的形式是什么样的,发送广播都是一样的方法。

    发送标准广播

    标准广播的意思是:注册了这个广播的所有接收者收到这条广播的顺序是一样的,不存在先后顺序,也不可以截断这条广播
    发送广播也是通过intent来实现的
    在intent中可以传递参数,传递的参数可以给接收者接收

     Intent intent=new Intent();
    //设置action
    intent.setAction("com.zyl.receiver");
    //传递参数
    intent.putExtra("name","name");
    sendBroadcast(intent);
    

    在接收者中接收参数,onReceive有两个参数,
    第一个是上下文,如果是服务发的广播,那么context就是对应的service对象。如果是活动发的广播,那么context就是activity对应的对象。
    这个参数可以做相应的接口回调的功能。
    第二个参数就是发送的intent,可以获取intent中携带的参数,intent设置的action等等。

    public class MyReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("receiver",intent.getStringExtra("name"));
        }
    }
    
    发送有序广播

    如果多个广播接收者同时注册了一个广播,那么有序广播就会按照这些广播接收者的优先级一次发送广播。
    1 设置优先级的方法
    priority值越大,越先接收到广播
    如果是静态注册

    <receiver android:name=".broadcast.MyReceiver">
                <intent-filter android:priority="100">
                    <action android:name="com.zyl.receiver"/>
                </intent-filter>
    </receiver>
    

    如果是动态注册

            myReceiver=new MyReceiver();
            //设置action
            IntentFilter intentFilter=new IntentFilter();
            intentFilter.addAction("com.zyl.receiver");
            intentFilter.setPriority(100);
            //注册广播
            registerReceiver(myReceiver,intentFilter);
    

    2 发送有序广播
    2.1 发送的方法
    发送有序广播时intent的设置不变,可以设置action,设置传递的参数
    发送广播的方法变成sendOrderedBroadcast,他有两个重载,一个是接收两个参数的,一个是接收七个参数的
    接收两个参数的

     /*
    2个参数的
    1:intent
    2:权限,设置为null就可以
    */
    sendOrderedBroadcast(intent,null);
    

    接收七个参数的

    /*
    7个参数的
    1:intent
    2:权限,设置为null就可以
    3 一个广播接收者的对象
    4 handler:设置为null就可以
    5 code:随意传入一个int类型值
    6 需要传递的String类型的数据,如果没有就设置为null
    7 需要传递的Bundle类型的数据,如果没有就设置为null
    */
    sendOrderedBroadcast(intent,null,null,null,0,"一段数据",bundle);
    

    2.2 截断广播
    当优先级高的接收者接收到广播时,可以截断广播
    在onReceive中调用abortBroadcast()方法,优先级在它后面的接收者就都不会收到广播了,但是无论在onReceive中的什么位置调用abortBroadcast(),不影响它自己的onReceive方法执行完

    public class FirstReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            abortBroadcast();
        }
    }
    

    2.3 传递参数
    有序广播在传递参数时,即可以通过intent方式传递参数,也可以在发送广播时传递参数
    如果发送的方式是发送两个参数的方法,则只能通过intent传递数据
    如果是接收七个参数的方法,则即可以通过intent方式传递参数,也可以在发送广播时传递参数
    下面详细说明这种方法
    1 七个参数的第六个可以携带一个String类型的数据,第七个可以携带一个Bundle类型的数据。
    发送这样一条广播

    Intent intent=new Intent();
    intent.setAction("zyl");
    intent.putExtra("name","name");
    Bundle bundle=new Bundle();
    bundle.putInt("key",111);
    sendOrderedBroadcast(intent,null,null,null,0,"一段数据",bundle);
    

    此时有两个广播接收者
    第一个

    public class FirstReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //getResultData()方法接收第六个参数
            String value=getResultData();
           //getResultExtras(true)方法接收第七个参数
            Bundle bundle=getResultExtras(true);
            int num=bundle.getInt("key");
            Log.i("receiver",value+num);
        }
    }
    
    <receiver android:name=".broadcast.FirstReceiver">
                <intent-filter android:priority="100">
                    <action android:name="zyl"/>
                </intent-filter>
    </receiver>
    

    第二个

    public class SecondReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String value=getResultData();
            Bundle bundle=getResultExtras(true);
            int num=bundle.getInt("key");
            Log.i("receiver",value+num);
        }
    }
    
    <receiver android:name=".broadcast.SecondReceiver">
                <intent-filter android:priority="50">
                    <action android:name="zyl"/>
                </intent-filter>
    </receiver>
    

    用getResultData和getResultExtras分别接收String类型和Bundle类型的参数。
    如果广播没有被截断,同时优先级高的接收者没有对参数进行处理,则所有接收者都会接收到相同的参数。
    ☆☆☆☆如果广播被截断,则后面的接收者不会接收到这条广播,更不会收到数据。
    ☆☆☆☆如果优先级高的接收者对数据进行处理

    public class FirstReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String value=getResultData();
            Bundle bundle=getResultExtras(true);
            int num=bundle.getInt("key");
            Log.i("receiver",value+num);
            //FirstReceiver先收到广播,它收到的数据就是sendOrderedBroadcast中携带的数据
            //setResultData方法更改String类型的数据,即第六个参数的数据
            setResultData("no");
            Bundle bundle1=new Bundle();
            bundle1.putInt("num",222);
            //setResultExtras更改第七个参数的数据,即bundle类型的数据
            setResultExtras(bundle);
        }
    }
    
    public class SecondReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //这时getResultData收到的就是FirstReceiver中setResultData方法发送的数据
            String value=getResultData();
            //getResultExtras收到的就是FirstReceiver中setResultExtras方法发送的数据
            Bundle bundle=getResultExtras(true);
            int num=bundle.getInt("key");
            Log.i("receiver",value+num);
        }
    }
    

    所以FirstReceiver收到的就是一段数据和111
    SecondReceiver收到的就是no和222
    如果还有其他的接收者,接收到的也都是FirstReceiver修改后的参数,
    如果其中某个接收者再次修改了参数,那么就会按照修改的继续往下传,以此推类。
    2.4 sendOrderedBroadcast中的第三个参数
    第三个参数传入一个广播接收者的对象,这个对象很特殊
    首先,它不需要在清单文件中注册,也不需要动态注册,什么都不需要
    其次,如果广播发送过程中没有被截断,那么它将最后收到这条广播,如果广播发送过程中被截断,他也会接着收到这条广播

    public class FInalReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
    
        }
    }
    
    Intent intent=new Intent();
    intent.setAction("zyl");
    intent.putExtra("name","name");
    Bundle bundle=new Bundle();
    bundle.putInt("key",111);
    sendOrderedBroadcast(intent,null,new FInalReceiver(),null,0,"一段数据",bundle);
    

    如果没有人截断广播,那么收到广播的顺序就是
    FirstReceiver,SecondReceiver,FInalReceiver
    如果FirstReceiver截断广播,那么收到广播的顺序就是
    FirstReceiver,FInalReceiver
    FInalReceiver也和FirstReceiver,SecondReceiver可以接收前面传来的String类型的数据或者Bundle类型的数据,或者是intent携带的参数。

    相关文章

      网友评论

          本文标题:发送广播

          本文链接:https://www.haomeiwen.com/subject/zwttqxtx.html