目录
一、什么是广播?
二、广播的类型
标准广播
有序广播
三、接收系统广播
1、动态注册监听网络变化
如何注册广播接收器?
2、静态注册实现开机启动
使用快捷方式创建广播接收器
实现开机广播
一、什么是广播?
android广播机制就是在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。
二、广播的类型
Android中的广播主要可以分为两种类型:标准广播和有序广播。
标准广播
– 完全异步执行的广播,在广播发出之后, 所有的广播接收器 几乎 同一时刻收到– 广播效率高 ,但 无法被截断
有序广播
– 同步执行的广播,发出后 同一时刻只有一个广播接收器能够收到 这条消息– 优先级 :一个广播接收器逻辑 执行完毕之后 广播才会 继续传递 ,或被 截断不传
三、接收系统广播
Android内置了很多系统级别的广播,可以在应用程序中通过监听这些广播来得到各种系统的状态信息,如:手机开机后、电池电量发生变化时发出的广播,如果要接收到这些广播,需要使用广播接收器。
1、动态注册监听网络变化
注册广播的方式一般有两种:代码中注册和AndroidManifest.xml中注册,前者称为动态注册,后者称为静态注册。
如何注册广播接收器?
新建一个类继承BroadcastReceiver,并重写父类的onReceive()方法。每当有广播到来时,onReceive()方法会自动执行,具体逻辑在此方法中实现。
下面尝试实现一个监听网络变化的广播,新建一个BroadcastTest项目,然后修改MainActivity代码,如下:
首先定义了一个内部类NetworkChangeReceiver继承自BroadcastReceiver,并重写onReceive()方法,当网络变化时此方法会执行,getSystemService()方法得到了 ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接。
onCreate()中有个android.net.conn.CONNECTIVITY_CHANGE,为什么添加这个,当网络发生变化时,系统发出的是一个值为android.net.conn.CONNECTIVITY_CHANGE的广播,这样实现了监听网络变化的功能。
最后不要忘记,动态注册的广播接收器一定要取消注册!这里在onDestory()方法中通过unregisterReceiver()方法实现。
另外,系统为保护用户设备的安全和隐私,必须在配置文件中声明权限才可以使用,否则直接崩溃。
打开AndroidManifest.xml文件,加入以下代码即可:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ............... <uses-permission android:name="android.net.conn.CONNECTIVITY_CHANGE"/> ........
public class MainActivity extends AppCompatActivity {
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.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
}
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context,"当前有网络",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"当前没有网络",Toast.LENGTH_SHORT).show();
}
}
}
}
效果如下:
2、静态注册实现开机启动
动态注册的广播接收器可以自由控制注册和注销,很灵活,但是它有个缺点:必须在程序启动后才能接收到广播,因为逻辑注册在onCreate()中。
有什么方法可以让程序在未启动时就能接收到广播?静态注册可以解决。
下面让程序接收一条开机广播;
使用快捷方式创建广播接收器
使用Android Studio提供的快捷方式来创建一个广播接收器:右键com.example.broadcasttest包--> New --> Other --> Broadcast Receiver,弹出如下窗口:
这里将广播命名为BootCompleteReceiver,Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enabled属性表示是否启用这个广播接收器。
然后修改其代码,如下:
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
}
}
另外,静态广播接收器一定在AndroidManifest.xml中注册才能使用,我们是使用的快捷方式创建的广播接收器,注册这一步已经自动完成。
实现开机广播
目前,BootCompleteReceiver还不能接收开机广播,需要修改AndroidManifest.xml文件,如下:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 是声明权限;
<intent - filter>标签里加入了相应的action。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
....................
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
......................
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
...................
</application>
</manifest>
广播还没有完成,下篇文章将要讲解自定义广播和使用本地广播。