BroadCastReciver广播接收器
BroadcastReceiver 是 Android 开发中的一个重要组件,用于接收并处理来自系统或应用程序的广播消息。
其主要功能是允许应用程序在特定事件发生时执行代码,而无需在前台运行应用程序。
广播接收器被注册到系统之后,每当Android系统接收到与之匹配的广播消息时,会自动启动此BroadcastReceiver开始接收广播。
通过广播的动作action选出对应的广播接收器,再由广播接收器完成相应事件的响应。
广播消息类型:
1.系统事件(如电量低、电池充电完成、网络连接变化等),
2.应用程序自定义事件
广播使用场景
1.系统广播:如电话来电、监听网络变化、充电状态变化、耳机插入拔出等系统级事件。
2.应用内广播:应用程序内部组件之间的通信。例如,多个组件需要对某一事件作出响应,可以使用自定义广播进行通知。
3.跨应用广播:不同应用程序之间的消息传递。
典型应用:
电池电量低了,系统就发一个广播消息给所有的广播接收者,所有的接收者在得到这个消息之后,就知道现在电量不足,程序应该怎么办。
广播时效性问题(重中之重)
BroadcastReceiver类中的onReceive()方法必须要在5秒钟内执行完事件,否则Android系统会认为该组件失去响应,并提示用户强行关闭该组件。
因此,对于比较耗时的响应事件,可以另开一线程,单独进行事件的处理。因此,对于耗时操作,需要在单独的线程中处理。
使用 IntentService
IntentService
是一种适合在后台处理长时间任务的服务,它会在一个单独的工作线程中处理意图Intent,并在完成后自动停止。代码如下
Activityimport 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);
}
} Receiverimport 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);
}
} IntentServiceimport 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();
// 设置Intent的Action属性
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.enabled为true表示广播可用,为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); |
3.取消注册:取消注册 receiver,使其停止接收广播,防止内存泄露。
写在MainActivity中的Destroy()函数中 @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcastReceiver2);
} |