Android四大组件之BroadcastReceiver

本文深入解析BroadcastReceiver在Android中的作用,包括其定义、静态与动态注册方法,分类(无序、有序、本地和粘性),以及发送和接收广播的技巧。理解并掌握这些概念有助于提升Android开发效率和应用生命周期管理。
摘要由CSDN通过智能技术生成

Android基础知识梳理-四大组件之BroadcastReceiver

定义

Broadcast(广播):一种广泛应用在应用程序之间传输信息的机制;

BroadcastReceiver(广播接收器):用于接收来自系统和其他应用的广播,并对其进行响应的组件。

注册

1.定义广播接收者

继承BroadcastReceiver,实现自定义的广播接收者,实现onReceive()方法用于接受广播

public class ExampleBroadcastReceiver extends BroadcastReceiver {
    private static final String TAG = ExampleBroadcastReceiver.class.getSimpleName();
    
    private static final String ACTION_BOOT = "android.intent.action.BOOT_COMPLETED";
    
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_BOOT.equals(intent.getAction())) {
            Log.i(TAG, "receive boot completed broadcast");
            Toast.makeText(context, "system boot completed.", Toast.LENGTH_LONG).show();
        }
    }
} 

onReceive()方法执行完成之后,ExampleBroadcastReceiver生命周期结束可能会被系统回收,所以onReceive()中不建议进行异步操作;另外,由于ANR限制,onReceive()方法必须在10秒内执行完成。

2.静态注册

在AndroidManifest.xml中注册

<manifest ...>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
	<application ...>
	    <receiver
            android:name=".broadcast.ExampleBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
	</application>
</manifest> 
  • 静态方式注册广播,即使应用未启动,也能接收到广播,所以可以利用广播作为应用的自启动和保活机制。
  • android:name:表示自定义的广播接收者类
  • action:指定了接收的广播类型,这里表示接受系统开机启动广播
  • uses-permission:声明我们需要使用到接收开机状态的权限

3.动态注册

public class ExampleActivity extends AppCompatActivity {
    private ExampleBroadcastReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myReceiver = new ExampleBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.BOOT_COMPLETED");
        registerReceiver(myReceiver, filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
} 
  • 在Activity的onCreate()中通过registerReceiver注册广播,并指定监听的广播类型;最后在onDestory()中关掉广播监听
  • 动态方式注册广播,用户可以在需要使用时进行注册,不再使用后关闭掉广播监听,使用上更为灵活

分类

广播可以分为无序广播(默认)、有序广播本地广播粘性(Sticky)广播

无序广播

无序广播是一种异步执行方式,所有广播接收者几乎都能同时接收到该广播,没有先后顺序,直到没有接收者再接受广播则广播结束。

  • 发送广播

    public void sendCustomBroadcast(View view){      
      Intent intent = new Intent("com.example.broadcast");     
      sendBroadcast(intent);
    } 
    

有序广播

有序广播是一种同步执行方式,广播发送之后,同一时刻只会有一个广播接收者在执行广播接收,广播执行者按照优先级顺序进行广播接收,而且在接收的过程中可以截断广播,后面的接收者就无法再接收到该广播。

  • 声明广播接收者优先级

    <manifest ...>
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    	<application ...>
    	    <receiver
                android:name=".broadcast.ExampleBroadcastReceiver"
                android:enabled="true"
                android:exported="true">
                <intent-filter android:priority="100">
                    <action android:name="com.example.broadcast"/>
                </intent-filter>
            </receiver>
    	</application>
    </manifest> 
    

    IntentFilter中通过android:priority指定优先级,值越大优先级越高

  • 发送广播

    public void sendOrderBroadcast(View view){      
      Intent intent = new Intent("com.example.broadcast");     
      sendOrderBroadcast(intent);
    } 
    
  • 截断广播

     @Override
    public void onReceive(Context context, Intent intent) {
        abortBroadcast();
    } 
    

    在广播接收者的onReceive()方法中,可以通过调用abortBroadcast()方法截断广播,优先级较低的广播接收者就无法再接收到该广播

本地广播

本地广播是一种局部广播,只能在本应用内部传播,广播接收者也只能接收本应用内部的广播,由于这一特点,所以本地广播不支持静态注册方式。

  • 注册本地广播接收者

    public class ExampleActivity extends AppCompatActivity {
        private ExampleBroadcastReceiver myReceiver;
        
        private LocalBroadcastManager localBroadcastManager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            myReceiver = new ExampleBroadcastReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.action.BOOT_COMPLETED");
            localBroadcastManager = LocalBroadcastManager.getInstance(this);
            localBroadcastManager.registerReceiver(intent, filter);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            localBroadcastManager.unregisterReceiver(myReceiver);
        }
    } 
    

    通过LocalBroadcastManager.getInstance()或者本地广播管理的实例,使用该实例来注册广播接收者

  • 发送广播

    private void sendBroadcast() {
        Intent intent = new Intent("com.example.broadcast");     
    	localBroadcastManager.sendBroadcast(intent);
    } 
    

粘性广播

前面了解了几种广播类型,我们可以知道,当所有广播接收者处理完广播接收之后则广播结束。也就是说,只有在发送前已完成注册的广播接收者才能接收到该广播。那么如果我们在某种情况下,广播接收者注册晚于广播发送时间,但是我们又想接收到该广播,该如何处理呢?这里就需要使用到粘性广播

  • 粘性广播在发送之后会保存刚发送过的广播,当有新注册的广播接收者注册后可以继续使用该广播,直到该广播被移除;

  • 粘性广播只会保存最后一次的广播,也就是说如果在某个广播接收者注册前,发送了多条同样的广播,那么广播接收者注册后只能接收到最后一条;

  • 粘性广播通过sendStickyBroadcast()发送广播,removeStickyBroadcast()移除广播,且需要添加权限<uses-permission android:name="android.permission.BROADCAST_STICKY"/>

最后

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。

所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。以上知识笔记全部免费分享,**如有需要获取知识笔记的朋友,可以点击下方二维码费领取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值