Android 开发

Android 入门(6)-广播详解与实战

2018-09-04  本文已影响0人  正经龙

广播

一听见这个名字就能想到,小的时候走街串巷的大喇叭,学校里做操上课的铃声,一个个大喇叭中传播着我们的青春,广播从小就深入人心。Android广播也不例外,当你的一个活动在行进过程中,需要告诉别的活动一个比较重要的信息,例如你在登陆简书网app的时候需要用到qq,那么通知qq的这个过程其实也是广播,你的后台清理程序一件关闭所有后台程序其实也是广播,广播在Android中非常常用,所以,我们有必要掌握这种实用又方便的工具。

广播分为标准广播有序广播

标准广播

广播接收器同时收到广播


标准广播

有序广播

广播按顺序传递,任意节点可截断广播的传递


有序广播

广播的实现

广播的实现又两种方式,一种是动态创建广播接收器,一种是静态写入广播接收器,第二种开机启动,第一种静态创建

现在通过一个小的项目来进行一下讲解

1.动态创建广播接收器

首先创建一个新的项目,命名为BoardCast_1,其他全部默认。
这个小项目需要实现的功能是实现一个广播接收器,能够监测到网络的连接状态。

首先进入到MainActivity.java 文件中,我们需要动态注册一个广播接收类,用于接收我们的网络状态广播。首先实现内部类NetworkChangeReceiver

class NetWorkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isAvailable()){
                Toast.makeText(context,"network is avaliable",Toast.LENGTH_SHORT).show();
            }
            else{
                Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
            }
        }
    }

广播接收类就实现了一个功能,那就是当网络发生变化的时候弹出信息,提示我们网络状态发生变化即可。
这里我们使用了ConnectivityManager监测当前网络状况
接下来我们需要创建一个广播管理者,让广播管理者与我们的广播实例绑定起来,并且在活动销毁的时候结束绑定。这些我们依然是在MainActivity类中实现。
我们在OnCreate中实现绑定,在OnDestory中实现解绑

IntentFilter intentFilter;
    NetWorkChangeReceiver netWorkChangeReceiver;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        netWorkChangeReceiver = new NetWorkChangeReceiver();
        registerReceiver(netWorkChangeReceiver,intentFilter);

    }

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

android.net.conn.CONNECTIVITY_CHANGE是系统自带的网络变化事件

点击运行,按home键退出,当我们在设置中开启飞行模式的时候能够看到提示,打开的时候也可以看到提示,即我们第一个小项目完成。


关闭网络 打开网络

静态创建广播接收器

静态创建广播接收器,通过IDE创建独立的广播接收器,在属性页上设置对应的权限与声明,即可实现静态创建。

1右键包,创建新的Receiver

创建新的Receiver

创建名为BootCompleteReceiver的广播接收器


广播接收器

然后实现OnReceive函数

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
        Toast.makeText(context,"you open the mobile phone",Toast.LENGTH_SHORT).show();
    }

最后打开AndroidMainifest.xml文件进行权限许可与广播接收的类型声明

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
监听开机广播权限声明
-----------------------
        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>监听开机广播
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

这样当下次开机的时候就会显示信息“you open the mobile phone”

发送广播

发送广播同样又两种形式,发送标准广播与发送有序广播,发送标准广播的函数为sendBroadcast(Intent intent),发送有序广播的函数为sendOrderBroadcast(Intent intent,权限控制(可以为null))

上部分我们知道了可以在AndroidMainifest.xml中给接收器声明接收的广播类型,我们在有序广播中的OnReceive中调用abortBroadcast就可以实现截断广播。

发送本地广播

在一般的动态广播接收器中,申明一个新的类型LocalBroadcastManager,通过这个类型管理绑定本地广播与本地接收器,广播就不会被非本程序的程序恶意监听

声明
    LocalBroadcastManager localBroadcastManager;
新建
  localBroadcastManager = new LocalBroadcastManager.getInstence(this);
绑定
  localBroadcastManager.registerReceiver(localReceiver,intentFilter);
解绑
localBroadcastManager.unregisterReceiver(localReceiver)
上一篇下一篇

猜你喜欢

热点阅读