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)!