美文网首页
Android BroadcastReceiver的使用

Android BroadcastReceiver的使用

作者: mage1160 | 来源:发表于2021-11-05 15:19 被阅读0次

1、什么是广播 

     BroadcastReceiver的中文翻译是广播接收者,是Android四大组件之一。

      这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。

      另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。

2、广播的三大要素

      1、广播(Broadcast) - 用于发送广播;

      2、广播接收器(BroadcastReceiver) - 用于接收广播;

      3、意图内容(Intent)-用于保存广播相关信息的媒介。

3、广播分类

      1、标准广播

             一种异步执行的广播,发送使用sendBroadcast()方法发出,发送后,内容几乎同时达到多个广播接收者,广播接收者没有先后顺序,也不相互影响,这种广播效率比较高,但无法被截断

      2、有序广播

            一种同步执行的广播,发送使用sendOrderedBroadcast()方法发出,发送后,同一时刻,只能有一个广播接收者能收到这条广播,当该接收者处理完这条广播后,广播才会继续传递。所以这类广播有先后顺序,接收者也可以使用abortBroadcast()终止广播继续发送

4、如何使用

(1)标准广播

       发送广播的代码:

                Intent intent = new Intent();

                intent.putExtra("content","广播开始啦");

                intent.setAction("MYRECEIVER_ACTION");

                sendBroadcast(intent);

      接收广播:

            public class MyReceiver extends BroadcastReceiver {

                    @Override

                    public void onReceive(Context context, Intent intent) {

                            String action = intent.getAction();

                            if("MYRECEIVER_ACTION".equals(action)){

                            String content = intent.getStringExtra("content");

                            Toast.makeText(context,content,Toast.LENGTH_LONG).show();

                        }

                    }

                }

        注册广播 :

        广播注册分为两种,动态注册和静态注册

        静态注册:

        静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。

                <receiver android:name=".MyReceiver">

                        <intent-filter>

                                <action android:name="MYRECEIVER_ACTION"/>

                        </intent-filter>

                </receiver>

            动态注册:

            动态注册方式是在activity里面调用当前上下文对象的registerReceiver() 方法来注册,和静态的内容差不多。一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。

动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

            MyReceiver receiver= new MyReceiver();

            //创建过滤器,并指定action,使之用于接收同action的广播

            IntentFilter filter = new IntentFilter("MYRECEIVER_ACTION");

            //注册广播接收器

            registerReceiver(receiver, filter);

            关闭接收器

            unregisterReceiver(receiver);

问题

           Background execution not allowed: receiving Intent { act=MY_RECEVIER flg=0x10 (has extras) } to com.ugrow.mytest/.broadcast.MyReceiver

            android8.0及以上系统关于广播的规定:发现果然是对隐式广播做了限定

            8.0==》API 26==》O

解决办法 

             //参数1-Context 参数2-广播接收者所在的路径名

            ComponentName componentName=new ComponentName(SendActivity.this,"com.ugrow.mytest.broadcast.MyReceiver");

            intent.setComponent(componentName);

注意

            1、一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver,只有动态注册的广播接收者才需要解除注册。

            2、一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期。

            3、动态注册的时候 去掉intent.setComponent(componentName);

            4、广播的优先级  <intent-filter android:priority="1000">  值越大优先级越大

(2)有序广播

        发送有序广播

        //发送有序广播

        //创建Intent对象

        Intent intent =new Intent();

        String action ="MY_ACTIOIN";

        intent.setAction(action);

        intent.putExtra("content","有序广播开始了");

        //发送有序广播

        /**

        * 第一个参数:Intent

        * 第二个参数:receiverPermission  null

        */

        sendOrderedBroadcast(intent,null);

        接收广播

        广播接收者1

        public class MyOrderReceiverextends BroadcastReceiver {

                @Override

                public void onReceive(Context context, Intent intent) {

                        String action = intent.getAction();

                        if ("MY_ACTIOIN".equals(action)) {

                                String content = intent.getStringExtra("content");

                                Log.d("TAG","MyOrderReceiver=" + content);

                                //添加数据

                                Bundle bundle =new Bundle();

                                bundle.putString("name","this is MyOrderReceiver");

                                //传递

                                setResultExtras(bundle);

                            }

                        }

                    }

          广播接收者2

          public class MyOrderReceiver1extends BroadcastReceiver {

                @Override

                public void onReceive(Context context, Intent intent) {

                        String action = intent.getAction();

                        if ("MY_ACTIOIN".equals(action)) {

                        String content = intent.getStringExtra("content");

                         Log.d("TAG","MyOrderReceiver1=" + content);

                          //获取上一个广播传递的数据

                            Bundle bundle = getResultExtras(true);

                            String name = bundle.getString("name");

                            Log.d("TAG","MyOrderReceiver1=name=" + name);

                        }

                    }

            }

  广播注册

    <receiver android:name=".broad.MyOrderReceiver">

            <intent-filter android:priority="200">

                <action android:name="MY_ACTIOIN" />

            </intent-filter>

        </receiver>

        <receiver android:name=".broad.MyOrderReceiver1">

            <intent-filter android:priority="100">

                <action android:name="MY_ACTIOIN" />

            </intent-filter>

        </receiver>

     结束广播

    abortBroadcast();

相关文章

网友评论

      本文标题:Android BroadcastReceiver的使用

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