一、前言:
在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。
二、Android广播可以分为两大类:
标准广播和有序广播,标准广播就是在发出去以后其他的程序几乎同时接收到这个广播的一种广播形式。有序广播就是会一个程序一个程序依次广播,所以有序广播可以在需要的时候将其截止,阻止其继续向下一个程序广播。
三、下面是一个使用广播的例子,其中包括标准广播和有序广播的实现方式、接收机的动态和静态注册、:
1.首先要接收系统的广播,我们需要注册一个广播接收器来接收这个广播,代码如下:
public class MainActivity extends AppCompatActivity {
private Button mBt;
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
//动态注册一个广播接收器
intentFilter = new IntentFilter ( );
//android.net.conn.CONNECTIVITY_CHANGE是系统发送的一条广播,通知网络的可用性
intentFilter.addAction ( "android.net.conn.CONNECTIVITY_CHANGE" );
networkChangeReceiver = new NetworkChangeReceiver ();
registerReceiver ( networkChangeReceiver,intentFilter );
//按钮是自动义广播的发送,连接的是MyBroadcastReceiver接收器
//点击按钮发送广播后,在MyBroadcastReceiver中执行动作
mBt = findViewById ( R.id.mBt );
mBt.setOnClickListener ( new View.OnClickListener () {
@Override
public void onClick(View view) {
Intent intent = new Intent ( "com.example.lyp.broadcast.MY_BROADCAST" );
sendBroadcast ( intent );//标准广播形式
//sendOrderedBroadcast ( intent,null );//有序广播形式
}
} );
}
@Override
//Activity销毁的后,取消动态广播接收器的注册
protected void onDestroy(){
super.onDestroy ();
unregisterReceiver ( 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 ( MainActivity.this,"网络状态可用!",Toast.LENGTH_SHORT ).show ();
}else {
Toast.makeText ( MainActivity.this,"网络状态不可用!",Toast.LENGTH_SHORT ).show ();
}
}
}
}
其中按键是自定义广播的发送按钮,点击按钮后将发送自定义的广播,暂且忽视它,其他代码是实现动态接收机的注册的,这里我们注册了一个接受系统网络可用性的广播,当启动程序,程序就会接受来自系统的网络可用性的广播。可以在系统设置里打开或者关闭数据开关,程序就会做出相应的提示。其中布局文件activity_main.xml很简答,就一个按钮,这里就不放代码了。
2.自定义的广播:
使用静态注册的方法注册广播接收器:
按照上图所示选择,弹出框:
这里我将名字取为 MyBroadcastReceiver,点击Finish。这样就OK了,将生成的代码并修改如下:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText ( context,"接收到我的广播",Toast.LENGTH_SHORT ).show ();
abortBroadcast ();//截断此广播继续传播
}
}
同时,会在AndroidManifest.xml中注册该广播:
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<!--
priority属性是指本广播的优先级,在此将本广播的优先级设置为100
-->
<intent-filter android:priority="100">
<!--
广播的内容
-->
<action android:name="com.example.lyp.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
在这个程序中,当我们点击按钮,系统会发出这个广播:"com.example.lyp.broadcast.MY_BROADCAST",在注册的接收器MyBroadcastReceiver中收到该广播,执行onReceive函数。在这个还是中调用abortBroadcast ()函数截止此广播接续传播。既然可以截止那就是有序广播,所以我在主代码MainActivity中将做如下修改:
mBt.setOnClickListener ( new View.OnClickListener () {
@Override
public void onClick(View view) {
Intent intent = new Intent ( "com.example.lyp.broadcast.MY_BROADCAST" );
//sendBroadcast ( intent );//标准广播形式
sendOrderedBroadcast ( intent,null );//有序广播形式
}
} );
将此广播设置为有序广播。
附加篇:本地广播
一、介绍:
本地广播是指只在本程序内部进行传递的广播,不会被来另外的程序收到,也不会接收其他程序的广播,相对于上面说的全局广播比较安全。不会将一些重要的信息传播出去。
二、实现:
本地广播主要是用LocalBroadcastManager管理的,代码如下:
public class MainActivity extends AppCompatActivity {
private Button mBt;
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main );
localBroadcastManager = LocalBroadcastManager.getInstance ( this );
mBt = findViewById ( R.id.mBt );
//点击按钮发送本地广播
mBt.setOnClickListener ( new View.OnClickListener () {
@Override
public void onClick(View view) {
Intent intent = new Intent ( "com.example.lyp.broadcast.LOCAL_BROADCAST" );
localBroadcastManager.sendBroadcast ( intent );
}
} );
//注册本地广播监听器,本地广播不能用静态方法注册
intentFilter = new IntentFilter ( );
intentFilter.addAction ( "com.example.lyp.broadcast.LOCAL_BROADCAST" );
localReceiver = new LocalReceiver ();
localBroadcastManager.registerReceiver ( localReceiver,intentFilter );
}
@Override
//Activity销毁的后,取消动态广播接收器的注册
protected void onDestroy(){
super.onDestroy ();
localBroadcastManager.unregisterReceiver ( localReceiver );
}
//本地广播接收器接收到广播后的动作
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText ( MainActivity.this, "收到本地广播!", Toast.LENGTH_SHORT ).show ();
}
}
}
其实和全局广播的动态注册相差无几,只是其中一部分函数功能使用LocalBroadcastManager进行定义,
另外,本地广播只能是用动态方法注册不能使用静态方法注册。静态注册广播的主要作用就是让程序在没有启动的时候也能收到系统发出的全局广播。