Android组件-BroadCastReceiver

BroadCastReciver广播接收器

BroadcastReceiver 是 Android 开发中的一个重要组件,用于接收并处理来自系统或应用程序的广播消息。

其主要功能是允许应用程序在特定事件发生时执行代码,而无需在前台运行应用程序。

广播接收器被注册到系统之后,每当Android系统接收到与之匹配的广播消息时,会自动启动此BroadcastReceiver开始接收广播。

通过广播的动作action选出对应的广播接收器,再由广播接收器完成相应事件的响应。

广播消息类型:

1.系统事件(如电量低、电池充电完成、网络连接变化等),

2.应用程序自定义事件

广播使用场景

1.系统广播:如电话来电、监听网络变化、充电状态变化、耳机插入拔出等系统级事件。

2.应用内广播:应用程序内部组件之间的通信。例如,多个组件需要对某一事件作出响应,可以使用自定义广播进行通知。

3.跨应用广播:不同应用程序之间的消息传递。

典型应用:

电池电量低了,系统就发一个广播消息给所有的广播接收者,所有的接收者在得到这个消息之后,就知道现在电量不足,程序应该怎么办。

广播时效性问题(重中之重)

BroadcastReceiver类中的onReceive()方法必须要在5秒钟内执行完事件,否则Android系统会认为该组件失去响应,并提示用户强行关闭该组件。

因此,对于比较耗时的响应事件,可以另开一线程,单独进行事件的处理。因此,对于耗时操作,需要在单独的线程中处理。

使用 IntentService

IntentService 是一种适合在后台处理长时间任务的服务,它会在一个单独的工作线程中处理意图Intent,并在完成后自动停止。代码如下

Activity

import android.content.ComponentName;

  import android.content.Intent;

  import android.os.Bundle;

  import androidx.appcompat.app.AppCompatActivity;

  public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // 创建并发送自定义广播

        Intent intent = new Intent("com.example.CUSTOM_BROADCAST");

        sendBroadcast(intent);

    }

}

Receiver

import android.content.BroadcastReceiver;

  import android.content.Context;

  import android.content.Intent;

  

  public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override

    public void onReceive(Context context, Intent intent) {

        // 启动 IntentService 处理耗时操作

        Intent serviceIntent = new Intent(context, MyIntentService.class);

        context.startService(serviceIntent);

    }

}

IntentService

import android.app.IntentService;

  import android.content.Intent;

  import android.widget.Toast;

  public class MyIntentService extends IntentService {

    public MyIntentService() {

        super("MyIntentService");

    }

    @Override
执行耗时的后台操作!!!!

    protected void onHandleIntent(Intent intent) {

        // 执行耗时操作

        performLongRunningTask();

        // 操作完成后可以通过发送广播或其他方式通知 UI

    }

    private void performLongRunningTask() {

        try {

            Thread.sleep(5000); // 模拟耗时操作

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

}

发送广播

1.sendBroadCast

对于所有满足条件的BroadcastReceiver都会执行其onReceive方法。但若有多个满足条件的BroadcastReceiver,其执行onReceive方法的顺序是没有保证的。

// 发送标准广播

Intent intent = new Intent();

intent.setAction("com.example.MY_CUSTOM_ACTION");

intent.putExtra("key", "value");

sendBroadcast(intent);

// 示例代码

String Intent_Action =  “com.android.BroadcastReceiverDemo ”;

Intent intent = new Intent(Intent_Action);

Intent.putExtra(“参数”,“参数值”);

sendBroadcast(intent);

button.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

        // 创建Intent对象

        Intent intent = new Intent();

        // 设置IntentAction属性

        intent.setAction(“njut.computer.hello");

                // 保存数据到Intent

                intent.putExtra("msg", "这是一条简单的广播消息");

        // 发送广播

        sendBroadcast(intent);

    }

});

2.sendOrderedBroadcast

通过sendOrderedBroadcast方法发送出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行onReceive方法,优先级高的先收到,并可以对广播进行操作后,再传给下一个接收者,当然也可以不传,如果不传的话,后面的接收者就都收不到这个广播了。相同优先级的BroadcastReceiver执行onReceive方法的顺序是没有保证的。

// 发送有序广播

Intent intent = new Intent();

intent.setAction("com.example.MY_CUSTOM_ACTION");

intent.putExtra("key", "value");

sendOrderedBroadcast(intent, null);

// 广播截断,阻止后面的接收器接收广播,保证只有最高优先级的广播接收。

abortBroadcast();

3.sendStickyBroadcast

sendStickyBroadcast主要的不同是,Intent在发送后会一直存在,并且在以后调用与之相匹配的广播接收器Receiver时会把这个Intent对象直接返回给新注册的广播接收器Receiver。

BroadCastReceiver类在Manifest文件中的配置

<receiver android:name=".MyBroadcastReceiver"/>

<receiver android:name=".MyBroadcastReceiver2"

    android:exported="true">

    <intent-filter>

        <action android:name="njut.computer.hello"></action>
用一个全局唯一的字符串标识其要执行的action,通常使用应用程序包的名称    </intent-filter>
1.enabledtrue表示广播可用,为false表示禁用广播,禁用后广播将无法接收
2.exported设置成false表示只能是这个app内发送的广播才能接收

</receiver>

实现BroadCastReceiver类

MyBroadcastReceiver是一个用于接收广播消息的类。当有广播消息到达时,系统会调用 onReceive 方法对事件进行处理。

 
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
核心方法onReceive 非常重要,重要到极限

    public void onReceive(Context context, Intent intent) {

        String msg = intent.getStringExtra("message");

        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();

    }

}

onReceive方法重要参数(重中之重)

1.Context context提供了APP的运行环境,可以通过它进行一些操作,如启动服务、获取资源等。
2.Intent intent表示广播消息的意图对象,其中包含了广播的相关信息,如 action 和附带的数据。
3..获取广播的Action, action 是一个字符串,表示广播的类型
String action = intent.getAction();
4.判断广播类型并处理
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
    // 处理开机完成事件

}

注册 BroadcastReceiver

1.静态注册:常驻型。当应用程序关闭后,如果有信息广播过来,程序广播接收器也会被系统调用自动运行

<receiver android:name=".MyBroadcastReceiver">

<intent-filter>

接收开机启动广播!!!

        <action android:name="android.intent.action.BOOT_COMPLETED"/>

接收电量低广播!!!

        <action android:name="android.intent.action.BATTERY_LOW"/>

    </intent-filter>

</receiver>

2.动态注册:非常驻型广播,广播生命周期跟随着程序的生命周期

//实例化过滤器

IntentFilter filter = new IntentFilter();
//设置过滤器
filter.addAction(Intent.ACTION_BATTERY_LOW); 用于过滤要接收的广播类型。
//实例化广播接收器
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
//给广播注册过滤器

  registerReceiver(receiver, filter); 注册receiver,使其能够接收符合 filter 条件的广播。

3.取消注册:取消注册 receiver,使其停止接收广播,防止内存泄露。

写在MainActivity中的Destroy()函数中

@Override

  protected void onDestroy() {

    super.onDestroy();

    unregisterReceiver(myBroadcastReceiver2);

}

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成也萧何,败也萧何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值