系列文章目录
Android四大组件基础学习
Android四大组件基础学习之Activity-优快云博客
第一章
第二章
Android四大组件基础学习之Service-优快云博客
第三章 Android四大组件基础学习之Broadcast Receiver
第四章 Android四大组件基础学习之Content Provider
————————————————
文章目录
目录
前言
通过一个基础案例来学习Android四大组件,一共分为4章,陆续更新中,如果有做的不好的地方、文章上的错误,或者是建议,欢迎大家在评论区或者私信我,感谢大家的包容和理解!
一、Broadcast Receiver(广播接收者)介绍
1.广播机制概述
广播机制是一种高效的事件发布与订阅模式。它允许系统或应用将特定事件以广播的形式发送出去,任何感兴趣的接收者都可以捕获并处理这些事件。
例如,当设备的电池电量发生变化、网络连接状态发生改变,或者用户插入耳机等事件发生时,系统会发出对应的广播。应用可以通过注册相应的Broadcast Receiver,接收这些广播并做出相应的响应,如提示用户电池电量低、调整网络使用策略、控制音频输出设备等。
2.Broadcast Receiver定义
Broadcast Receiver是安卓四大组件之一,它是一个应用程序组件,用于接收和处理广播Intent。广播Intent是一种特殊的Intent,它可以被多个接收者同时接收和处理。
3.Broadcast Receiver的使用场景
一般用于监听系统事件、应用间通信、应用内通信等。
二、Broadcast Receiver的创建及使用
1.Broadcast Receiver的注册
Broadcast Receiver的注册分为静态注册和动态注册,静态注册是像注册Activity一样在清单文件注册,而动态注册是在Activity中通过代码注册。
注:当你使用匿名内部类实例化 BroadcastReceiver
并定义 onReceive
方法时,这个广播接收器的逻辑是独立的,不会与静态注册的广播接收器冲突。匿名内部类的广播接收器只会处理你动态注册时指定的广播动作。类似于函数重写。
2.Broadcast Receiver的创建
假设我们需要监听网络状态变化,当网络不可用时,提示用户。
与之前相同,先创建一个broadcastReceiver包来存放文件。创建名为NetworkStateReceiver的广播接收者。
3.Broadcast Receiver的使用
(3.1)编写NetworkStateReceiver,用于检测网络状态,当没网络连接时,提示信息
NetworkStateReceiver.java:
package com.example.broadcastReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
import com.example.activity.MainActivity;
import java.util.Objects;
public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//日志输出
Log.d("NetworkStateReceiver", "启动成功");
//判断接收到的广播是否是网络连接状态变化的广播
if (Objects.equals(intent.getAction(), ConnectivityManager.CONNECTIVITY_ACTION)) {
//检查当前设备是否连接到网络
boolean isConnected = isConnected(context);
if (!isConnected) {
//网络不可用,显示提示
Toast.makeText(context, "网络不可用,请检查网络设置", Toast.LENGTH_SHORT).show();
}
}
}
private boolean isConnected(Context context) {
//获取安卓系统中的 ConnectivityManager 服务,用于管理网络连接
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获取网络状态和类型。存储在activeNetworkInfo
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
//返回网络连接是否建立
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
}
(3.2)在MainActivity实例化广播接收者,并注册使用
MainActivity.java:
package com.example.activity;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import com.example.broadcastReceiver.NetworkStateReceiver;
public class MainActivity extends AppCompatActivity {
private TextView tvWelcome;
private Button btnLogout;
private NetworkStateReceiver networkStateReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvWelcome = findViewById(R.id.tv_welcome);
btnLogout = findViewById(R.id.btn_logout);
String username = getIntent().getStringExtra("username");
tvWelcome.setText("欢迎你," + username);
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent); // 跳转到 LoginActivity
finish();
}
});
}
@Override
protected void onResume() {
//实例化广播接收者
networkStateReceiver = new NetworkStateReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
super.onResume();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//注册广播
registerReceiver(networkStateReceiver, filter, Context.RECEIVER_EXPORTED);
}
}
@Override
protected void onPause() {
super.onPause();
//注销广播
unregisterReceiver(networkStateReceiver);
}
}
(3.2)别忘了在清单文件注册NetworkStateReceiver
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!--添加检测网络状态权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Activity"
tools:targetApi="31">
<receiver
android:name="com.example.broadcastReceiver.NetworkStateReceiver"
android:enabled="true"
android:exported="true"></receiver>
<service
android:name="com.example.service.LoginStatusService"
android:enabled="true"
android:exported="true" />
<activity
android:name=".LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="false" />
</application>
</manifest>
4.演示效果
当无网络时:
三、总结
感谢大家的观看与支持,我会持续更新自己的学习过程,希望能给大家提供帮助,会继续更新其他组件,下期文章见!