广播机制
1.标椎广播
完全异步执行的广播,广播发出后,所有的广播接收器几乎在同一时刻接收到这条广播消息。
2.有序广播
同步执行的广播,此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并可以阻断正在传递的广播。
接收系统广播
1,动态接收
class ChangeReceiver 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,"network is available",Toast.LENGTH_SHORT).show();
else{
Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
}
}
}
private IntentFilter intentFilter;
private ChangeReceiver changeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
changeReceiver = new ChangeReceiver();
registerReceiver(changeReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(changeReceiver);
}
2,静态接收
1.创建广播接收器
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
}
}
2.在AndroidManifest.xml文件中进行静态注册
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
发送自定义广播
1.发送标椎广播
1. 创建广播接收器对广播进行静态接收
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到了",Toast.LENGTH_SHORT).show();
}
}
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
2. 写发送广播的逻辑
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage(getPackageName());
sendBroadcast(intent);
2.发送有序广播
注:由于我们在发送广播时给intent指定了包,所以广播在别的程序中接收不到,在测试时可换成同一程序测试接收顺序
参考博客
1.在写发送广播逻辑时吧sendBroadcast(intent);换成sendOrderedBroadcast(intent,null);
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
intent.setPackage("com.example.revise_5");
sendOrderedBroadcast(intent,null);
2.可设置广播接收器的优先级
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
2.设置是否截断
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到了",Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
使用本地广播
发出的广播只能在应用程序的内部传递,并且广播接收器只能接收来自本应用程序的广播,使用之前要导v4包
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager = LocalBroadcastManager.getInstance(this);
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.revise_5.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
localBroadcastManager.unregisterReceiver(localReceiver);
}
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"aaaaaaaaa",Toast.LENGTH_SHORT).show();
}
}
}
强制下线功能
demo_Broadcast