android 中的广播 ,系统广播和自定义广播

Android中,Broadcast是一种在应用程序之间传输信息的机制。有个中文名字,广播。顾名思义,


就是像收音机一样,只要将频率调成广播台一致就可以收听到相对应的内容,android中也是这个


道理,也可理解为监听,只要注册了相对应的监听,一旦系统有这方面的信息,马上就会被注册的


广播发现,可以在onReceive(Context context, Intent intent)里做相应的处理。
常见的系统广播比如 开机监听 电量监听 短信监听 电话监听 锁屏监听 等等,注册了上述广播,


就意味着正常情况下,只要手机启动 电量满了或是电量低了 来短信了 有电话来了 屏幕锁了,我


们这边都能在相对应注册广播的地方收到信息,回调 BroadcastReceiver 中的onReceive(Context 


context, Intent intent)方法,并且有相对应的参数返回。


广播在使用之前需要先注册,广播的注册方式有两种,一种是在配置清单注册,手机开机后,全程


监控该app的生命周期,处于随时被触发状态;另一种是在app运行后在java代码里注册,通过


IntentFilter注册。


网络监听 java代码中注册
mConnManger = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
IntentFilter netFilter = new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
netFilter.addCategory(Intent.CATEGORY_DEFAULT);
mIsNetReceiver = new NetChangeListenerReceiver(mNetShow, mConnManger);
registerReceiver(mIsNetReceiver, netFilter);


解除广播绑定
unregisterReceiver(mIsNetReceiver);


这种注册,一般都是在activity中注册,通过activity的生命周期控制,比如在 onCreate() 和 


onDestroy()中,绑定和解除。或者通过 点击事件 来绑定广播,但为保险起见,在activity 结束


时要做非空解除广播判断。


一般情况下,系统级的广播都是在配置清单中注册,自定义的广播在java代码中注册。先说系统级


广播,在配置清单中注册后就可以直接使用了。比如锁屏广播,配置清单注册后,


<receiver android:name=".ScreenBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
</receiver>


如果不想一开始就监听屏幕锁屏解屏,比如说有个设置,里面有个锁屏开关,点击后才有锁屏解屏


的功能,该怎么做呢?这时候就用到了第二种方法,在代码中注册,当 按钮 点击事件触发,在点


击回调里做 广播的注册,


screenBroadcastReceiver = new ScreenBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//当屏幕锁屏的时候触发
intentFilter.addAction(Intent.ACTION_SCREEN_ON);//当屏幕解锁的时候触发
registerReceiver(screenBroadcastReceiver, intentFilter);


同时加入标示标记,当下次再点击时,解除广播注册,
unregisterReceiver(screenBroadcastReceiver);


还有一种广播,也是在java代码中注册,这种广播是自定义广播。常用的一个场景,在service中


有一操作,完成后需要在activity页面上做相应的操作,由于service不能直接操作,这时候就需


要通过广播发送信息,到activity接受数据,并作出想用UI界面改变。


具体来说,分两步走,首先是在activit中注册广播,第二步是在service中完成数据获取后,发送


广播。这里面有一个关键的地方,就是注册广播的标示,要保持唯一和一致。即 


intentFilter.addAction(flag);中的flag。
在activity中 注册


receiveBroadCast = new ReceiveBroadCast();
IntentFilter filter = new IntentFilter();
filter.addAction(flag);    //只有持有相同的action的接受者才能接收此广播
registerReceiver(receiveBroadCast, filter);


public class ReceiveBroadCast extends BroadcastReceiver
{
 
        @Override
        public void onReceive(Context context, Intent intent)
        {
            //得到广播中得到的数据,并显示出来
            String message = intent.getStringExtra("data");
            txtShow.setText(message);
        }
 
}




在service中发送广播数据


Intent intent = new Intent();  //Itent就是我们要发送的内容
intent.putExtra("data", "this is data ");  
intent.setAction(flag);   //设置action,和这个action相同的的接受者才能接收广播
sendBroadcast(intent);   //发送




发送后,activit中onReceive(Context context, Intent intent)方法马上做出相应处理。


广播又分为有序广播和普通广播,
a.普通广播
不可中断, 不能互相传递数据.
b.有序广播
可中断, abortBroadcast()
可以互相传递数据, getResultCode(), getResultData(), getResultExtras(), setResult()
有兴趣的可以在看看文档了解,平时正常情况下用的不多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值