@Allen-miss
2017-05-18T11:47:38.000000Z
字数 4713
阅读 709
Broadcast
无序广播
则是一种同步执行的广播,在广播发出之后,同一时刻只有一个广播接收器内容接收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播,并且前面的广播接收器还可以拦截正在传递的广播,这样后面的广播接收器就无法收到广播消息了。流程图如上
动态注册
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);
}
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.isAvailable()){
Toast.makeText(context,"网络可用",Toast.LENGTH_LONG).show();
}else{
Toast.makeText(context,"网络不可用",Toast.LENGTH_LONG).show();
}
}
}
//在onDestroy中注销广播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
}
AndroidMainifest.xml加入权限
<uses-permission android:name="android.permission.access_network_state" />
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
}
}
AndroidMainifest.xml加入权限
<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>
不要在onReceive中添加过多的逻辑或者进行任何耗时的操作,在广播接收器中不允许开线程,当onReceive()运行了较长的时间而没有结束时,程序就会报错。因此广播接受者跟多的扮演的是一种打开程序其他组件的角色,比如创建一条状态通知栏,或者启动一个服务等。
//自定义一个广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
}
}
//在清单文件注册action
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.seele.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
//在activity发送广播
TextView SendBroadCast = (TextView) findViewById(R.id.send_broadcast);
SendBroadCast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.seele.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
}
});
2.发送有序广播
SendBroadCast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.seele.broadcasttest.MY_BROADCAST");
// sendBroadcast(intent);
//发送有序广播第一个参数是Intent,第二个参数是与权限相关的字符串,这里传入的是null
sendOrderedBroadcast(intent,null);
}
});
设置广播的优先级
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<!--设置广播的优先级android:priority="100"-->
<intent-filter android:priority="100">
<action android:name="com.example.seele.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
拦截广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
//拦截广播
abortBroadcast();
}
}
abortBroadcast();就是拦截广播的方法,拦截后别的广播就无法接收;
使用本地广播
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取实例
localBroadcastManager = LocalBroadcastManager.getInstance(this);
TextView SendBroadCast = (TextView) findViewById(R.id.send_broadcast);
SendBroadCast.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcast,LOCAL_BROADCAST");
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast,LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
//注册本地广播监听
registerReceiver(localReceiver,intentFilter);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"receiver local broadcast",Toast.LENGTH_SHORT).show();
}
}
代码大部分一样,不一样的就是LocalBroadcastManager本地广播管理器
广播实践
源码下载