Android四大组件基础学习之Broadcast Receiver

系列文章目录

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.演示效果

当无网络时:


三、总结

       感谢大家的观看与支持,我会持续更新自己的学习过程,希望能给大家提供帮助,会继续更新其他组件,下期文章见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值