【安卓基础重点知识3】BroadcastReceiver

0 阅读3分钟

一、定义

是一种用于接收和响应广播消息的组件。广播消息可以由系统、应用程序或其他组件发送,而Broadcast Receiver负责接收并处理这些消息

二、组成部分

  • 注册广播接收器:通过静态或动态方法(优先动态广播)注册广播接收器,这样系统或其他应用程序发送匹配的广播时,广播接收器就会被激活

  • 处理广播:广播接收器在接收到广播时,会调用其onReceive(Context context, Intent intent)方法,在这个方法中,可以处理接收到的广播,例如读取广播中的数据、执行特定操作或出发其他组件的响应

三、静态广播注册及接收

1. 定义

  1. 在AndroidManifest.xml文件中声明

  2. 在应用安装时就被注册

  3. 适用于监听全局广播或应用程序的整个生命周期内都需要接收广播的场景

  4. 当应用程序处于非运行状态时,静态注册的广播接收器仍然可以接收到广播

2. 实践

步骤一:新建可自动生成,并且在AndroidManifeat.xml中也自动生成了相关代码,自己添加action

<!--AndroidMainfest.xml -->
<receiver
    android:name=".BroadCastReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
        <action android:name="com.example.day2.broadcastreceiver.wjy" />
    </intent-filter>
</receiver>

步骤二:创建Activity,在布局文件中添加Button用于测试

@Override
public void onClick(View v) {
    //配置action
    Intent intent = new Intent("com.example.day2.broadcastreceiver.wjy");
    intent.setPackage(getPackageName());
    intent.putExtra("info", "sos");
    sendBroadcast(intent);
}

步骤三:在接收器里进行数据的处理和展示

public class BroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast t = Toast.makeText(context,"静态广播:"+intent.getStringExtra("info"), Toast.LENGTH_SHORT);
        t.setGravity(Gravity.TOP,0,0);
        t.show();
    }
}

四、动态广播注册及接收

1. 定义

  • 在代码中通过Java来注册广播接收器

  • 运行时需要手动注册和注销

  • 场景:临时性的广播接收需求,比如只在特定条件下或者在特定Activity/Fragment中监听广播

2. 实践

需要创建广播接收器和Activity,广播接收器的创建与前文一致

package com.example.day2;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class DynamicReceiverActivity extends AppCompatActivity implements View.OnClickListener {

    private DynamicBroadcastReceiver DBroadcastReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_dynamic_receiver);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
        //配置intentFilter及其action
        DBroadcastReceiver = new DynamicBroadcastReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("WJY");
        registerReceiver(DBroadcastReceiver, intentFilter);
        findViewById(R.id.btn_dynamic_broadcast).setOnClickListener(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(DBroadcastReceiver);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent("WJY");
        intent.setPackage(getPackageName());
        intent.putExtra("key","动态广播啦");
        sendBroadcast(intent);
    }
}

补充:

安卓8.0以及以后做了禁止后台运行,不加setPackage()无法收到隐式广播

隐式广播 显式广播
定义 发送广播时不指定接收者的一种方式,系统会自动匹配符合指定条件的接收者进行消息传递 需要明确指定接收者的类名
特点
  1. 可以同时通知多个接收者,无需一一指定
  2. 发送者无法得知消息是否被接收
  3. 不同应用之间进行消息传递
  1. 只会通知指定的接收者,不会通知其他应用或组件
  2. 发送者可以得知消息是否被接收
使用方法 见前文
Intent intent = new Intent("WJY");
//设置包名和类名
intent.setComponent(new ComponentName("com.example.day2", "com.example.day2.DynamicBroadcastReceiver"));
sendBroadcast(intent);

本系列【安卓基础重点知识】是刚开始学习android的时候记录的,其中部分内容来自网页,忘记记录来源了,如需添加引用,联系我即可