由于初学,了解的还不是很全面,写一点,记录下来
1.标准广播
1.1 接收广播
比如系统网络改变会发送一条action为“android.net.conn.CONNECTIVITY_CHANGE”的广播
那么活动中如何去接收这条广播呢
1.1.1动态广播注册
自定义广播接收器继承BroadcastReceiver重新onReceive()方法
public 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.isConnected()){
Toast.makeText(context,"已连接",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context,"未连接网络",Toast.LENGTH_SHORT).show();
}
}
}
在活动中注册和取消注册
//在活动的onCreate()方法中
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//动态添加action,这是系统网络变化会发送的一条广播的action
networkchangeReceiver = new NetworkchangeReceiver();
registerReceiver(networkchangeReceiver,intentFilter);//注册广播
//别忘了取消注册,一般在onDestroy或者onPause方法中
unregisterReceiver(networkchangeReceiver);//取消注册
1.1.2静态注册广播
所谓静态注册广播,就是在AndroidManifest.xml中的intentFilter添加action,其它与动态注册一样
通过file+ new创建一个BroadcastReceiver会在AndroidManifest自动生成一个< receiver>
<receiver
android:name=".NetworkchangeReceiver "
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>
1.2发送自定义广播
发送自定义广播就是自己定义一个action,想获取这条广播的接收器添加这个action就好
Intent intent = new Intent("com.example.diybroadcast.my");发送一条action为com.example.diybroadcast.my的广播
sendBroadcast(intent);
接收这条广播的方法如1.1
2有序广播
2.1有序广播的发送
有序广播较无序广播的发送方式有所区别
Intent intent = new Intent("com.example.diybroadcast.my");
sendOrderedBroadcast(intent,null);//第二个参数是一个与权限有关的字符串,传入null也可
2.2接收有序广播
如果不设置优先级的话,有序广播和无序广播并没有区别
那如何设置接收器的优先级呢,其实很简单
给intent-filter添加android:priority属性就好
比如:
<receiver...>
<intent-filter android:priority="100">//利用priority设置优先级,数字越大,级别越高
<action android:name="..."></action>
</intent-filter>
</receiver>
2.3有序广播的截断
优先级比较高的就可以先接收到广播,可以截断广播,截断后这条广播就会停止,后面的优先级低的广播接收器就接收不到这条广播了
其实很简单,在优先级高的接收器的receive()方法里调用abortBroadcast()方法就好。
3本地广播
除了比标准广播多了一个本地广播管理器LocalBroadcastManager ,其它都差不多
本地广播管理器LocalBroadcastManager 的作用就是,广播发送和接收器注册都需要通过LocalBroadcastManager 来实现
由于是向本地发送,所以活动启动才有意义,所以本地广播都是动态注册
完整测试代码如下,其中button是用来发送广播的
public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager;
private LocalReceiver localReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);//单例获取本地广播管理者
Button button = (Button)findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.hugh.zhao");
localBroadcastManager.sendBroadcast(intent);//利用localBroadcastManager发送本地广播
}
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.hugh.zhao");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);//利用localBroadcastManager注册广播接收器
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);//利用localBroadcastManager取消注册广播接收器
}
class LocalReceiver extends BroadcastReceiver{ //自定义本地广播接收器
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(MainActivity.this,"received from this app",Toast.LENGTH_SHORT).show();...