Android学习笔记——广播

本文深入解析了Android系统中的广播机制,包括标准广播和有序广播的区别,动态与静态注册广播接收器的方法,以及如何发送和接收广播。同时,还介绍了本地广播的概念和使用LocalBroadcastManager进行广播管理的具体操作。
标准广播和有序广播

在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 );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值