标准广播和有序广播
在Android系统中,标准广播是一种完全异步执行的广播,广播发出后,所有的广播接收器几乎会在同一时刻接收到这条广播消息,没有先后顺序之分。
有序广播则是一种同步执行的广播。在广播发出后,同一时刻只有一个广播接收器能够接收到这条广播,当这条广播中的逻辑执行完毕后,广播才会继续传递。此时广播接收器有先后顺序,在前面的广播接收器可以拦截正在传递的广播。
动态注册广播和静态注册广播接收器
动态注册广播的意思是在代码中进行注册,静态注册的意思是在AndroidManifest中注册。不管是动态注册还是静态注册都需要有一个自己的广播接收器,需要继承BroadcastReciver并重写它的onReceive()方法,当收到要接收的广播时,onReceive()方法就会执行。
class MyRecevier extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"received broadcast",Toast.LENGTH_SHORT).show();
}
}
1.动态注册广播
动态注册广播,只需要调用Context的registerReceiver()方法就好了,该方法需要两个参数,第一个参数是就是上面的BroadcastReceiver,第二个参数是IntentFilter,用来过滤Intent。
当调用完registerReceiver()方法后广播动态注册就算完成了 ,值得注意的是,需要调用unregisterReceiver()方法取消注册。
public class MainActivity extends AppCompatActivity {
private IntentFilter mIntentFilter;
private NetRecevier mNetRecevier;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntentFilter=new IntentFilter();
mIntentFilter.addAction("com.example.broadcast.CONNECTIVITY_CHANGE");
mNetRecevier =new NetRecevier();
registerReceiver(mNetRecevier,mIntentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mNetRecevier);
}
class NetRecevier extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"network state change",Toast.LENGTH_SHORT).show();
}
}
1.静态注册广播
静态注册广播时在AndroidManifest.xml文件中的< application >标签里定义< receviver >标签,并在该标签中完成注册和添加意图过滤器的操作。就能完成广播接收其的注册。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
其中enabled表示是否启用该广播,exported表示是否接收本程序外的广播,priority表示上文所述的有序广播的优先级(该属性非必须)。
发送广播
发送标准广播
发送广播只需要生成一个和IntentFilter对应的Intent,然后调用Context中的sendBroadcast(Intent i)方法即可发送广播。
private void sendLocalBroadcast(){
Intent intent=new Intent("com.example.broadcast.MY_BROADCAST");
sendBroadcast(intent);
}
发送有序广播
和发送标准广播一样,只需要将sendBroadcast方法改为sendOrderedBroadcast(intent,null)即可
另外上文中提到的priority属性,该数值表示广播接收器的优先级,属性值越高就能先接收到广播,最高值为100。
在BroadcastReceiver的onReceive()方法中调用abortBroadcast()方法即可实现广播的拦截,后续接收器将无法收到广播。
本地广播
本地广播发出的广播只能在应用程序内部进行传递 ,而且广播接收器也只能接收来自本应用程序发出的广播 。
本地广播和一般广播的不同主要是LocalBroadcastManager。LocalBroadcastManager可以通过以下方法获得:
LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(Context context);
之后对广播进行操作只需借用localBroadcastManager就行。
localBroadcastManager.sendBroadcast(Intent);
localBroadcastManager.registerReceiver(BroadcastReceiver ,IntentFilter);
localBroadcastManager.unregisterReceiver(BroadcastReceiver );