广播的学习应该从三个方面入手,接收广播、发送广播和本地广播,接收和发送广播顾名思义很容易理解,那么什么是本地广播呢,说到本地广播我们不得不说一说什么是全局广播,全局广播就是我们发送的广播在其他任何应用程序都能收到,我们也能收到其他应用程序发送的广播,那这样就容易引起安全问题,比如我们的数据被其他程序截获,或者不断地收到其他程序的垃圾广播,那为了避免这些,我们就要使用本地广播,发送的广播只有自己能收到,收到的也都是自己的广播,这样就会非常的安全。
接收广播
接收广播有两种形式,分别是动态注册和静态注册监听网络广播
1、动态监听广播
public class MainActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
}
@Override
protected void onDestroy() {
unregisterReceiver(networkChangeReceiver);
super.onDestroy();
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Network is changed",Toast.LENGTH_SHORT).show();
}
}
1)实例化IntentFilter,并添加(网络是否发生变化的)广播类型
2)内部类NetworkChangeReceiver继承BroadcastReceiver,并重写父类的onReceive()方法,这样受到广播(网络状态发生变化)时就会执行onReceive()方法
3)实例化NetworkChangeReceiver,通过registerReceiver()进行注册,将NetworkChangeReceiver和IntentFilter都传进去
这样就实现了广播的监听,最后别忘记关掉广播,在onDestroy()方法中用unregisterReceiver()关闭广播
2、静态监听广播
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
}
}
别忘了在Android.manifest中注册
<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>
1)定义BroadcastReceiver 广播子类BootCompleteReceiver ,并重写onReceive()方法
2)在Android.manifest用 < uses-permission >进行声明
3)在< intent-filter >中添加相应的权限
发送自定义广播
在学习发送广播之前我们需要先了解广播的两种类型,标准广播和有序广播
标准广播:
有序广播:
看图就很容易理解两种广播的区别
3、自定义标准广播
首先在button的点击事件中用intent发送广播
public class MainActivity extends Activity {
LinearLayout linearLayout;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
linearLayout = new LinearLayout(this);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.CENTER);
setContentView(linearLayout);
button = new Button(this);
button.setText("发送广播");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
}
});
linearLayout.addView(button);
}
}
发送广播完了之后,我们需要写接收广播,定义MyBroadcastReceiver 类继承BroadcastReceiver ,重写onReceive()方法
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receive my broadcast",Toast.LENGTH_SHORT).show();
}
}
在Android.manifest中添加广播注册
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
这样就可以实现点击button,接收到广播,并进行提示了
4、自定义有序广播
在定义有序广播的时候,我们需要用priority的值来确定各个应用收到广播的优先级,所以我们现在各个应用的Android.manifest文件中添加广播,并用android:priority="xx"来表示优先级
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
设置了优先级后,优先级高的接收器有权截断广播,优先级低于他的就不会再收到广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receive my broadcast",Toast.LENGTH_SHORT).show();
abortBroadcast();//截断广播
}
}
还有最后一点,就是在发送广播的时候要用sendOrderedBroadcast()来取代sendBroadcast()就可以了
sendBroadcast(intent);//发送标准广播
sendOrderedBroadcast(intent,null);//发送有序广播
有没有很简单呢,嘿嘿~
使用本地广播
下面是个例子:
public class MainActivity extends Activity {
private LinearLayout linearLayout;
private Button button;
private IntentFilter intentFilter;
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
linearLayout = new LinearLayout(this);
linearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
linearLayout.setGravity(Gravity.CENTER);
setContentView(linearLayout);
button = new Button(this);
button.setText("发送广播");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
linearLayout.addView(button);
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取LocalBroadcastManager的实例
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast.MY_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receive my broadcast",Toast.LENGTH_SHORT).show();
}
}
}
本地广播其实就是先获取LocalBroadcastManager 的实例,然后将广播的发送、注册全部都用LocalBroadcastManager 的实例去完成就搞定了,哈哈很简单呐。
参考文献:第一行代码——Android / 郭霖. 2版 --人民邮编出版社