简单记录Broadcast Receiver(广播接收器)的简单实用
1. 广播分类
1.1 Normal broadcasts 标准广播
完全异步的广播,所有的广播接收器几乎同时受到广播且无法截断。
1.2 Ordered broadcast 有序广播
显然对比与标准广播,有序广播就是有序的,可以设置各个接收器的优先级,可以被截断。
2. 注册全局广播接收器
全部广播代表,整个Android系统中的所有广播接收器都可以收到的广播
2.1 动态注册广播接收器
接受系统广播
主要步骤如下:
- 自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
class NetWorkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
networkInfo = connectivityManager.getActiveNetworkInfo();//需要申请权限
if (networkInfo != null && networkInfo.isAvailable())
Toast.makeText(context,"网络开启了",Toast.LENGTH_SHORT).show();
else
Toast.makeText(context,"网络关闭了",Toast.LENGTH_SHORT).show();
}
}
- 在代码中新建一个自定义广播接收器的实例,并在Activity中注册,注册时需要传入该广播接收器所接受的广播类型。
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkInfo networkInfo;
private NetWorkReceiver netWorkReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
netWorkReceiver = new NetWorkReceiver();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//设置广播接收器接受的内容
registerReceiver(netWorkReceiver,intentFilter);//注册广播接收器
}
}
- 在Activity的onDestroy方法中要取消注册广播接收器。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(netWorkReceiver);
}
此时变设置好了一个接受系统广播的广播接收器,当数据网络开关出现变化时,会接受到相应的广播并发出Toast信息。
2.2 注册静态广播接收器
静态广播接收器还有一个特性,那就是在系统没有启动的时候就能够接受广播并对他进行处理
2.2.1 接受系统广播(开机启动)
- 同样自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"开机了!",Toast.LENGTH_LONG).show();
}
}
- 在AndroidManifest.xml文件中注册(如果使用as自动创建的则自动注册)
<application
>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//广播接收器注册
<receiver android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action
android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
2.3 发送自定义广播并接收
自定义的广播使用静态注册
2.3.1 发送标准广播
- 广播接收器注册
步骤同静态广播接收器一致,不过在AndroidManifest.xml文件中不仅仅注册时,广播接收器的<intent-filter>标签里应该填写自己自定义的广播名
......
<intent-filter>
<action
android:name="com.override0330.example"></action>
</intent-filter>
......
- 发送广播-使用Intent发送:
......
Intent intent = new Intent("com.override0330.example");
sendBroadcast(intent);
......
2.3.2 发送有序广播
- 广播接收器注册
步骤同发送标准广播一致,但是多加入一个优先级的设置
......
<intent-filter android:priority="98">//设置优先级为98,最高为100
<action
android:name="com.override0330.example"></action>
</intent-filter>
......
- 发送有序广播
Intent intent = new Intent("com.override0330.example");
sendOrderBroadcast(intent, null);//null参数为一个与权限相关的字符串,一般情况传入null
- 截断广播
在想要截断的广播接收器的onReceive里使用
abortBroadcast();//截断该广播
3.使用本地广播
本地广播区别于全局广播,它只在本应用程序中传递,如果掌握了全局广播,那么本地广播的使用是非常简单的。而且貌似本地广播只能使用标准广播。
将上图中我们使用的注册广播接收器和发送广播的方法改为使用由LocalBroadcastManager的方法:
//获取LocalBroadManage实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
//注册本地广播接收器
localBroadcastManager.registerReceiver(localBroadReceiver,intentFilter);
4. 总结
广播的使用还是相当简单的,但是它的底层实现还有待我的研究√
网友评论