Android开发_4:广播

此博客为学习Android开发的笔记型博客,若有任何不妥及需要补充之处,希望各位大神给予指正

广播

标准广播
在这里插入图片描述

有序广播
在这里插入图片描述

接收广播

通过BroadcastReceiver类接收广播

动态注册BroadcastReceiver:

1.在活动中新建内部类NetChangeReceive:

    class NetChangeReceive extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
           Toast.makeText(context,"myBroadCast Received",Toast.LENGTH_SHORT).show();
        }
    }

新建intentfilter,并添加action “android.net.conn.CONNECTIVITY_CHANGE” 监听网络变化

			//intentfilter:意图过滤器,声明期望收到的intent类型
        intentFilter=new IntentFilter();
        netChangeReceive=new NetChangeReceive();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(netChangeReceive,intentFilter);
        //注册接收器:第一个参数为广播接收器,第二个参数为intentfilter

静态注册BroadcastReceiver

右键包->new ->other->BroadcastReceiver

public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"NetWorkChanged",Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onReceive: ");
    }
}

静态注册的接收器,不管程序是否运行都能对广播进行接收
静态注册的接收器需要在配置文件中注册,但由于我们是直接new的BroadcastReceiver,Android Studio已经帮我们注册好了。

 <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
 </receiver>

新建intent-filter,添加action “android.net.conn.CONNECTIVITY_CHANGE”

<intent-filter>
                <action android:name="com.example.myBroadCast"/>
 </intent-filter>

需要说明的是:在Android8.0开始,对清单文件中的静态广播接收者增加了限制。像网络状态这种敏感的广播不能再进行监听。所以上面的静态广播接收者代码,你写出来后也是不会执行的。

发送自定义广播

发送标准广播

发送广播就需要我们之前提到的intent了。
新建一个按钮并添加事件:
隐式声明一个intent,然后用sendBroadcast方法把它广播出去就好了

Intent intent=new Intent("com.example.myBroadCast");
sendBroadcast(intent);

这里我们广播了一个action:com.example.myBroadCast
修改之前的静态广播接收器:
将intent-filter中的action改为com.example.myBroadCast
对静态广播接收器的限制仅限于像网络状态这种敏感广播,像这种我们自己定义的广播,它的接收就不受限制。

发送有序广播

发送有序广播仅需要将“sendBroadcast”方法改为“sendOrderBroadcast”方法即可。

Intent intent=new Intent("com.example.myBroadCast");
sendOrderBroadcast(intent,null);

sendOrderBroadcast方法接受两个参数,第一个参数仍然为intent,第二个参数是一个与权限相关的字符串,这里传null就好了。

有序广播的传递是有先后顺序的,现在我们就来设置它:
在配置文件中,我们修改MyReceiver的intent-filter:

            <intent-filter android:priority="100">
                <action android:name="com.example.myBroadCast"/>
            </intent-filter>

我们添加了android:priority字段,表示receiver的优先级,值越大,优先级越高。

当然,有序广播还是可以被截断的:
我们修改MyReceiver的onReceive方法:
我们调用abortBroadcast()方法,将有序广播截断。

public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"NetWorkChanged",Toast.LENGTH_SHORT).show();
        Log.d(TAG, "onReceive: ");
        abortBroadcast();
    }

使用本地广播

之前发送的广播和系统广播都是全局广播,能够被所有的程序接收到。这就引来了很大的安全问题。
现在我们想要让广播变成本地广播,即只能在程序内部传播。

我们使用localBroadcastManager来对广播进行管理
总的来说就是:
sendBroadcast(intent) 改为
localBroadcastManager.sendBroadcast(intent)

registerReceiver改为
localBroadcastManager.registerReceiver

unregisterReceiver改为
localBroadcastManager.unregisterReceiver

这里我们使用了动态广播接收器,因为本地广播为程序内部的广播,程序已经运行,所以无需考虑静态广播接收器

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值