BroadcastReceiver广播的使用

使用目的:通过广播接收者,可以进行组件之间进行通信、应用程序之间的通讯;

广播是用来传输数据的;

广播可以实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能接受这个广播。典型的应用就是android自带的短信,电话等等广播(这些都是系统广播);

系统也可能发送广播,安卓是基于事件触发的,任何状态的改变都会发出广播,比如收到短信、收到电话等;

接收系统广播,接收自定义广播;

广播以内部类的形式实现,写到Activity里面。


广播分为有序广播和无序广播;

广播的使用步骤注册广播、取消广播、发送广播、接收广播


一、注册广播:

订阅广播,有两种方法形式:xml配置、代码配置。注册一个广播接收者。

Xml文件配置订阅,不需要取消广播的订阅。注册广播需要设置action,只有和注册广播的动作一致的接收者才能收到广播。

        <receiver android:name="com.lantu.tuhuadmin.testreceiver.MyReceiver">
            <intent-filter>
                <action android:name="chenrushui" />
            </intent-filter>
        </receiver>

通过代码注册广播接收者:记住最重要的一行代码;通过代码注册一定要取消广播的订阅。

<pre name="code" class="java">        mReceiver = new MyReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("chenrushui"); //为intent设置动作
        intentFilter.addDataScheme("cast");//这里不需要: 添加数据约束。
        registerReceiver(mReceiver, intentFilter);
 

二、取消广播:

unregisterReceiver(mReceiver);不取消广播的订阅,可能导致内存泄露。

        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(mReceiver);
        }

三、发送广播:

sendBroadCast(new Intent());发送普通广播;所有的接收者可以同时受到广播;无法终断。

sendOrderBroadCast(new Intent());发送有序广播;有接收广播的优先顺序,而接收广播的优先顺序是由接收者自己指定的。接收广播的优先级的范围是-10001000.有序广播可以终断;但是有序广播可以明确的指定接收者,这样广播就不可以终断;

 sendOrderedBroadcast(intent, null, new MyReceiver2(), new Handler(), 0, null, null);

这两个方法是上下文身上的方法;

通过广播传递参数,广播里面传递的是Intent,可以携带数据;

发送广播时,要给Intent带上action,标识Intent的唯一性;intent.setAction()只有动作一致才能收到广播

在发送广播时,如果为Intent设置了data,那么对应的广播接收者一定要设置data才能接收到广播。intentFilter.addDataScheme("cast")

        findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("name", "陈如水");
                intent.setAction("chenrushui");
                intent.setData(Uri.parse("cast:11111"));
                sendBroadcast(intent);
            }
        });

四、接收广播:

写一个类继承自BroadCastReceiver,在子类的onReceive()方法中处理相应的业务逻辑。在广播接收者收到广播时,调用onReceive()方法。

        public class MyReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("chenrushui")) {
                    String dataString = intent.getDataString().split(":")[1];
                    Toast.makeText(context, "我已经接收到了广播 " + dataString, Toast.LENGTH_SHORT).show();
                }
            }
        }

有序广播案例: 设置广播的优先级、中断广播的实现、abortBroadcast()、android:priority="-1000"

清单文件中代码:

        <receiver android:name=".MyReceiver1">
            <intent-filter android:priority="1000">
                <action android:name="com.lantu.tuhu" />
                <data android:scheme="tel" />
            </intent-filter>
        </receiver>
        <receiver android:name=".MyReceiver2">
            <intent-filter android:priority="-1000">
                <action android:name="com.lantu.tuhu" />
                <data android:scheme="tel" />
            </intent-filter>
        </receiver>
MyReceiver1中的代码:

        public class MyReceiver1 extends BroadcastReceiver {
            private static final String TAG = "MyReceiver";
        
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("com.lantu.tuhu")) {
                    Log.i(TAG, "MyReceiver1" + "收到广播");
                }
                //直接调用这个方法中断广播,优先级低的广播接收者就都收不到广播了。
                abortBroadcast();
            }
        }
MyReceiver2中的代码:

        public class MyReceiver2 extends BroadcastReceiver {
            private static final String TAG = "MyReceiver";
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("com.lantu.tuhu")) {
                    Log.i(TAG, "MyReceiver2收到广播");
                }
            }
        }
接收的是否是系统广播,怎么判断?

只能通过action判断,并且代码中没有明确的广播发送者。

IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值