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()
有兴趣的可以在看看文档了解,平时正常情况下用的不多。
就是像收音机一样,只要将频率调成广播台一致就可以收听到相对应的内容,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()
有兴趣的可以在看看文档了解,平时正常情况下用的不多。