自学内容网 自学内容网

GDPU Andriod移动应用 Broadcast Receiver

聆听广播,跟着节拍吧。

计时器

新建一个名为PhoneStateMonitor的工程;

实现一个应用运行时长的计时器,并在界面上刷新计数器,要求包括:

(1)在Layout中包含两个TextView控件,横向分布,左边的TextView固定显示文本“运行时长”,右边的TextView显示计时时长(单位:分钟)

(2)通过静态方式注册系统广播android.intent.action.TIME_TICK,执行计时器的刷新。

注,本次可以不用重名原来自带的xml跟main活动,然后记得每题分模块写即可。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:padding="16dp"
    android:gravity="center_vertical">

    <!-- 左侧 TextView 显示 "运行时长" -->
    <TextView
        android:id="@+id/textViewLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="运行时长"
        android:textSize="20sp"
        android:layout_marginEnd="16dp"/>

    <!-- 右侧 TextView 显示计时时长 -->
    <TextView
        android:id="@+id/textViewTimer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="20sp"
        android:gravity="end"/>

</LinearLayout>

这里的Receiver内部类写在主活动里,当然你也可以另外写多一个Receiver文件。 

package com.example.phonestatemonitor


import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.widget.TextView

class MainActivity : Activity() {

    // 定义广播接收器,接收系统时间更新广播
    private lateinit var timeTickReceiver: TimeTickReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 获取布局中的 TextView 控件
        val textViewTimer: TextView = findViewById(R.id.textViewTimer)

        // 创建 TimeTickReceiver 实例并传递 textViewTimer
        timeTickReceiver = TimeTickReceiver(textViewTimer)

        // 注册系统广播
        val intentFilter = IntentFilter()
//        intentFilter.addAction("android.intent.action.TIME_TICK")
        intentFilter.addAction(Intent.ACTION_TIME_TICK)// 使用系统时间更新广播的正确 action
        registerReceiver(timeTickReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播接收器,避免内存泄漏
        unregisterReceiver(timeTickReceiver)
    }

    // 广播接收器类
    class TimeTickReceiver(private val textViewTimer: TextView) : BroadcastReceiver() {
        private var totalMinutes: Int = 0

        override fun onReceive(context: Context, intent: Intent) {
            // 更新计时器
            updateTimer()
        }

        private fun updateTimer() {
            totalMinutes += 1
            val timeString = String.format("%02d分钟", totalMinutes)
            // 更新 TextView 显示的计时
            textViewTimer.text = timeString
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.phonestatemonitor">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.T7">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

手机WIFI状态显示

 实现手机WI-FI状态显示:

(1)WI-FI只有“打开”和“关闭”两种状态;

(2)Layout中根据自己的想法设计合理的WI-FI状态显示方式;

(3)注意,要在AndroiManifest.xml添加wifi状态的权限,

(4)设计一个广播接收器来监听广播android.net.wifi.WIFI_STATE_CHANGED

(5)创建一个私有方法wifiStateUpdate(),里面包括:

创建一个wifiManager:

val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

获取WI-FI的状态:

val wifiState = wifiManager.wifiState

如果wifiState为WifiManager.WIFI_STATE_ENABLED,则显示“打开”,如果为wifiState为WifiManager.WIFI_STATE_DISABLED,则显示“关闭”。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

    <TextView
        android:id="@+id/statusWifi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/status_wifi_open"
        android:layout_gravity="center"
        android:layout_marginTop="50dp"
        android:textSize="30sp"
        android:textColor="#EF9DB9" />
</LinearLayout>

在res的values文件下找到strings.xml

<resources>
    <string name="app_name">T7</string>
    <string name="status_wifi_open">Wifi已打开</string>
    <string name="status_wifi_close">Wifi已关闭</string>
</resources>

在另一个模块或项目的模块,直接用默认的活动写即可。 

import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.wifi.WifiManager
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.widget.Toolbar
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {

    // 定义广播接收器,接收 Wi-Fi 状态更新广播
    private lateinit var wifiReceiver: WifiReceiver
    // 用于显示 Wi-Fi 状态的 TextView 控件
    private lateinit var wifiStatus: TextView

    private lateinit var wifiManager: WifiManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
//        val toolbar: Toolbar = findViewById(R.id.toolbar)
//        setSupportActionBar(toolbar)
        // 获取布局中的 TextView 控件
        wifiStatus = findViewById(R.id.statusWifi)
        wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        // 创建 wifiReceiver 实例
        wifiReceiver = WifiReceiver(wifiStatus)

        // 注册 Wi-Fi 状态广播接收器
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION) // Wi-Fi 状态变化的广播
        registerReceiver(wifiReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播接收器,避免内存泄漏
        unregisterReceiver(wifiReceiver)
    }

    // 广播接收器类,用于监听 Wi-Fi 状态变化
    class WifiReceiver(private val statusWifi: TextView) : BroadcastReceiver() {

        private lateinit var wifiManager: WifiManager

        override fun onReceive(context: Context?, intent: Intent?) {
            // 获取 WifiManager 实例
            wifiManager = context?.applicationContext?.getSystemService(Context.WIFI_SERVICE) as WifiManager
            // 更新 Wifi 状态
            wifiStateUpdate()
        }

        private fun wifiStateUpdate() {
            // 获取当前的 Wifi 状态
            val wifiState = wifiManager.wifiState
            val context = statusWifi.context

            // 根据 Wifi 状态更新 UI
            if (wifiState == WifiManager.WIFI_STATE_ENABLED) {
                // Wifi 已开启
                statusWifi.text = context.getString(R.string.status_wifi_open)
            } else if (wifiState == WifiManager.WIFI_STATE_DISABLED) {
                // Wifi 已关闭
                statusWifi.text = context.getString(R.string.status_wifi_close)
            }
            statusWifi.invalidate()
        }
    }
}

AndroidManifest.xml,注意这里要改一下跟你的项目模块名对上,别直接复制还倒打一耙怪到这来。 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.t7" >
    <!-- Wi-Fi 状态权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.T7" >
        <activity
            android:name=".MainActivity"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

打开虚拟手机的设置找到wifi项把它打开关闭,也可以从上面拉下来开启,类似平时用手机打开wifi的,然后观察界面显示。

 

手机电池电量提醒

 实现手机电池电量提醒

(1)要求能够按百分比显示电量;

(2)监听电量变化的广播

android.intent.action.BATTERY_LOW、android.intent.action.BATTERY_OKAY、android.intent.action.BATTERY_CHANGED三条信息;

(3)正常电量下,显示“正常电量”,同时计算并显示具体电量。

(4)当电量电量低于20%时,用红色字体显示电量,并且显示文本“请及时充电!”

(5)计算电量batteryPct。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <!-- 第一个 TextView: 显示文本1 -->
    <TextView
        android:id="@+id/textViewText1"
        android:layout_width="wrap_content"
        android:layout_height="50sp"
        android:text="@string/text1"
        android:textSize="30sp"
        android:gravity="start"
 />

    <!-- 第二个 TextView: 显示电池百分比 -->
    <TextView
        android:id="@+id/textViewBattery"
        android:layout_width="wrap_content"
        android:layout_height="47sp"
        android:text="@string/battery_percentage"
        android:textSize="30sp"
        android:layout_toEndOf="@id/textViewText1"
        android:layout_marginStart="4dp"
        android:layout_marginTop="3sp"
        android:gravity="end" />

    <!-- 一个黑色横向 View -->
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:layout_below="@id/textViewText1"
        android:layout_alignParentStart="true"
        android:background="@color/black" />

    <!-- 第三个 TextView: 显示电池提示信息 -->
    <TextView
        android:id="@+id/textViewTips"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/battery_normal_tips"
        android:textSize="40sp"
        android:gravity="center"
        android:layout_below="@id/textViewText1"
        android:layout_marginTop="20dp" />

</RelativeLayout>
<resources>
    <string name="app_name">Pct</string>
    <string name="text1">手机电量:</string>
    <string name="battery_percentage">100%</string>
    <string name="battery_normal_tips">正常电量</string>
    <string name="battery_charge_tips">请及时充电!</string>
</resources>
import android.app.Activity
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.os.BatteryManager
import android.widget.TextView
import android.widget.Toast

class MainActivity : Activity() {

    private lateinit var batteryLevel: TextView
    private lateinit var batteryTips: TextView
    private lateinit var batteryReceiver: BroadcastReceiver

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 获取布局中的 TextView 控件
        batteryLevel = findViewById(R.id.textViewBattery)
        batteryTips = findViewById(R.id.textViewTips)

        // 创建并注册广播接收器
        batteryReceiver = BatteryReceiver()
        val intentFilter = IntentFilter()
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED) // 电池变化
        intentFilter.addAction(Intent.ACTION_BATTERY_LOW)     // 电池低电量
        intentFilter.addAction(Intent.ACTION_BATTERY_OKAY)    // 电池恢复正常
        registerReceiver(batteryReceiver, intentFilter)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播接收器
        unregisterReceiver(batteryReceiver)
    }

    // 广播接收器类:处理电池变化的逻辑
    inner class BatteryReceiver : BroadcastReceiver() {

        override fun onReceive(context: Context?, intent: Intent?) {
            intent?.let {
                when (it.action) {
                    Intent.ACTION_BATTERY_CHANGED -> {
                        val batteryPct:Float? = getBatteryPercentage(it)
                        // 更新电池百分比显示
                        batteryPct?.let { pct ->
                            updateBatteryStatus(pct)
                        }
                    }
                    Intent.ACTION_BATTERY_LOW -> {
                        // 电池电量过低时显示提示信息
                        batteryTips.text = context?.getString(R.string.battery_charge_tips)
                        batteryTips.setTextColor(context?.resources?.getColor(android.R.color.holo_red_dark) ?: 0)
                    }
                    Intent.ACTION_BATTERY_OKAY -> {
                        // 电池恢复正常时显示提示信息
                        batteryTips.text = context?.getString(R.string.battery_normal_tips)
                        batteryTips.setTextColor(context?.resources?.getColor(android.R.color.black) ?: 0)
                    }
                    else -> {}
                }
            }
        }

        // 获取电池百分比
        private fun getBatteryPercentage(intent: Intent): Float {
            val level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
            val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
            return level * 100 / scale.toFloat()
        }

        // 更新电池状态
        private fun updateBatteryStatus(batteryPct: Float) {
            batteryLevel.text = "${batteryPct.toInt()}%" // 显示电池百分比

            if (batteryPct < 20) {
                batteryTips.text = "请及时充电!"
                batteryTips.setTextColor(getColor(android.R.color.holo_red_dark))
            } else {
                // 电量正常时,显示“正常电量”
                batteryTips.text = "正常电量"
                batteryTips.setTextColor(getColor(android.R.color.black))
            }
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pct">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.T7">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

怎么调节虚拟机的电量观察提示变化,点击这里。

然后滑动滑条即可观察到提示变化。 

 

实验心得

写到困了,却等不到的赞。 

 


原文地址:https://blog.csdn.net/visitorcsdn/article/details/143650367

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!