这一篇博客是在我全部学完了《第一行代码》第五章来写的。因为本章的内容并不是很多,但是绝对不是不重要,而是相当的重要,需要熟练掌握并灵活使用。
动态注册一个监听wifi变化的系统广播
注册广播的方式有两种,动态注册和静态注册。
动态注册就是在代码中注册;(活动启动才会发送)
静态注册就是在AndroidManifest中注册;(任何时候都会发送)
实现过程:
public class MainActivity extents Activity{
private IntentFilter intentFilter;
private WifiChangeReceiver wifiChangeReceiver;
@Override
protected void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.WIFI_STATE_CHANGE_ACTION);
wifiChangeReceiver = new WifiChangeReceiver();
registerReceiver(wifiChangeReceiver, intentFilter);
}
@Override
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(wifiChangeReceiver);
}
class WifiChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
WifiManager wifiManger = (WifiManger)getSystemService(Context.WIFI_SERVICE);
if(wifiManager.isWifiEnable()){
Toast.makeText(context, "wifi is Enable", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "wifi is UnEnable", Toast.LENGTH_SHORT).show();
}
}
}
}
因为监测wifi变化的广播是一个系统广播,所以要获取相应的权限,获取权限在AndroidMainfest.xml文件中加入如下获取权限的代码:
<uesr-permission android:name="android/permission.ACCESS_WIFI_STATE">
静态注册开机启动
静态注册需要新建一个继承BroadcastReceiver的实现类:
class BootCompleteReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
接下来注册开机启动的权限:
<uesr-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED">
注册接收器:
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETE">
</intent-filter>
</receiver>
实现自定义广播
1.标准广播
新建MyBroadcastReceiver继承Broadcast:
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context, Intent intent){
Toast.makeText(context, "receiver in MyBroadcastReceiver", Toast.LENGTH_SHORT);
}
}
在AndroidManifest.xml中对这个广播接收器注册:
<receiver android:name=".MyBroadcast">
<intent-filter>
<action android:name="com.zhaojy.com.zhaojy.androidstu_broadcasttest.MY_BROADCAST">
</intent-filter>
</receiver>
将activity_main中的代码修改为一个button,非常简单,不做演示。
最后再MainActivity中设置该按钮的点击事件用来触发广播:
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("com.zhaojy.androidstu_broadcasttest.MY_BROADCAST");
}
sendBroadcast(intent);
});
2.有序广播
广播是一种跨进程的通信方式,就像系统广播,在任何程序进行的时候都会进行发送接收。那么我们自定义的广播也是可以这样的,在一个应用程序中发出广播,在另一个程序中也是可以接受的到的。新建另一个项目AnotherBroadcastReceiver。
建立一个广播接收器:
class AnotherBroadcastReceiver extends Broadcast{
@Override
public void onReveiver(Context context, Intent intent){
Toast.makeText(context, "receiver in AnotherBroadcastReceiver", Toast.LENGTH_SHORT).show();
}
}
接下来在AndroidManifest.xml中注册该广播接收器:
<receiver android:name=".AnotherBroadcastReceiver">
<intent-filter>
<action android:name="com.zhaojy.androidstu_broadcasttest.MY_BROADCAST">
</intent-filter>
</receiver>
两个接收器接受的都是com.zhaojy.androidstu_broadcasttest.MY_BROADCAST的广播,当按钮按下的时候会发现出现了两条不一样的Toast信息,证明了广播的跨进程性。
但是如何发送有序广播呢,其实很简单,只要在发送广播的时候换一个发送的方式就可以了,将sendBroadcast(intent)换成sendBroadcast(intent,null)即可,这里多了一个参数是一个与权限相关的字符串,一般传入null;然后在AndroidManifest.xml文件中注册receiver的intent-filter标签下加入权限优先级的代码:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.zhaojy.androidstu_broadcasttest.MY_BROADCAST">
</intent-filter>
</receiver>
这样可以确保优先级高的接收器先接收到广播,因为是有序的,所以当先接收到广播的接收器收到广播以后可以选择截不截断该广播,如果选择截断就在onReceive中添加如下代码:
abortBroadcast();
即可截断该广播,即时后面有同样action的接收器也不会在截断后收到广播。
本地广播
本地广播的优势:
1.可以明确的知道正在发送的广播不会离开我们的程序,因此不用担心机密数据泄露的问题;
2.其他的程序无法将广播发送到我们的程序内部,因此不用担心会有安全漏洞的隐患;
3.发送本地广播比发送系统全局广播更高效。
发送本地广播需要注意的是LocalBroadcastManager这个类是属于support-v4包,因此没有该包的要自己手动导入该jar包,再能使用LoaclBroadcastReceiver的方法。
示例代码:
public class MainActivity extends Activity{
private IntentFilter intentFilter;
private LocalReceiver localReceiver
private LocalBroadcastaManager localBroadcastReceiverManager;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);//获取实例
Button button = (Button)findViewById(R.id.button);
button.setOnclickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent("com.zhaojy.androidstu_broadcasttest.LOCAL_BROADCAST");
localBroadcastReceiver.sendBroadcast(intent);//用本地管理器发送广播
}
});
intentFliter = new IntentFilter();
intentFilter.addAction("com.zhaojy.androidstu_broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册本地广播监听器
}
@Override
protected void onDestroy(){
super.onDestroy();
localBroadcastReceiver.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context,Intent intent){
Toast.makeText(context, "received local broadcast").show();
}
}
}