如何用 Kotlin 在 Android 手机开发一个小闹钟、计时器、秒表

以下是在 Android 上用 Kotlin 开发小闹钟、计时器和秒表的方法,分为核心功能实现和界面设计两部分:


闹钟功能实现

AlarmManager 和 BroadcastReceiver

kotlin 复制代码
// 设置闹钟
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)

val calendar = Calendar.getInstance().apply {
    set(Calendar.HOUR_OF_DAY, hour)
    set(Calendar.MINUTE, minute)
    set(Calendar.SECOND, 0)
}

alarmManager.setExact(
    AlarmManager.RTC_WAKEUP,
    calendar.timeInMillis,
    pendingIntent
)

// 接收广播
class AlarmReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val notification = NotificationCompat.Builder(context, "alarm_channel")
            .setContentTitle("闹钟")
            .setSmallIcon(R.drawable.ic_alarm)
            .build()
        
        val manager = context.getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        manager.notify(1, notification)
    }
}

计时器功能实现

CountDownTimer 使用

kotlin 复制代码
val timer = object : CountDownTimer(30000, 1000) { // 30秒倒计时,间隔1秒
    override fun onTick(millisUntilFinished: Long) {
        val seconds = millisUntilFinished / 1000
        binding.timerText.text = "$seconds秒"
    }

    override fun onFinish() {
        binding.timerText.text = "时间到!"
    }
}.start()

秒表功能实现

Handler 延迟消息

kotlin 复制代码
var seconds = 0
val handler = Handler(Looper.getMainLooper())
val runnable = object : Runnable {
    override fun run() {
        seconds++
        binding.stopwatchText.text = "$seconds秒"
        handler.postDelayed(this, 1000)
    }
}

// 开始秒表
handler.post(runnable)

// 暂停秒表
handler.removeCallbacks(runnable)

界面布局要点

  1. 闹钟界面

    • TimePicker 组件用于选择时间
    • ToggleButton 控制闹钟开关
  2. 计时器界面

    • NumberPicker 或 EditText 输入分钟/秒数
    • 环形进度条显示剩余时间比例
  3. 秒表界面

    • 大字号数字显示
    • 悬浮按钮控制开始/暂停/重置
XML 复制代码
<!-- 示例:计时器按钮布局 -->
<Button
    android:id="@+id/startButton"
    android:text="开始"
    android:onClick="@{() -> viewModel.startTimer()}" />

<Button
    android:id="@+id/resetButton"
    android:text="重置"
    android:onClick="@{() -> viewModel.resetTimer()}" />

数据持久化

  1. 使用 SharedPreferences 存储闹钟设置:
kotlin 复制代码
val prefs = getSharedPreferences("AlarmPrefs", MODE_PRIVATE)
prefs.edit().putInt("alarm_hour", hour).apply()
  1. 计时器状态恢复建议用 ViewModel:
kotlin 复制代码
class TimerViewModel : ViewModel() {
    val remainingTime = MutableLiveData<Long>()
}

注意事项

  • Android 8.0+ 需设置前台服务并创建通知渠道
  • 使用 WorkManager 处理设备重启后的闹钟恢复
  • 测试时注意屏幕关闭后的后台行为
  • 计时精度要求高时改用 SystemClock.elapsedRealtime()

完整项目可参考 GitHub 上的开源实现如 AlarmClock 或 TimerX。

相关推荐
脚踏实地,坚持不懈!31 分钟前
Linux 内核源码解析:从 secondary_startup_64 到 pick_eevdf 的完整调用栈分析
android·linux·arm开发
事圆则缓42 分钟前
面向对象六大基本原则:从概念到 Android 实战
android
程序员-珍2 小时前
关于协程相关问题
android·安卓
wulechun2 小时前
基于Python与PySide6的漫画自动化翻译工具:深入解析manga-translator-ui项目架构与本地部署实战指南
智能手机
wdfk_prog2 小时前
Wi-Fi Direct 教程 04:Interface 协议子系统初始化——WPA/EAPOL、WPS、DPP/NAN、GAS 与 P2P callback
android·运维·服务器·ubuntu·p2p·wps·wifi-direct
PiaoKe___2 小时前
云手机原理与 Python 自动化实战:ADB、REST API、WebSocket 群控入门
python·智能手机·自动化
警醒与鞭策10 小时前
【无标题】
android·unity·性能优化·游戏引擎·perforce
全速向光11 小时前
盖世游戏PC模拟器:手机也能畅玩电脑平台游戏
游戏·智能手机
传奇开心果编程12 小时前
【Jetpack Compose进阶学与练】第14课:系列收尾复习总结;Compose项目常见坑点汇总;学习路线与后续学习方向
android·学习·ui·kotlin·android jetpack
李游Leo14 小时前
《HarmonyOS 7 精准碰一碰跨设备协作开发实战》07:异常恢复、状态机与CrossDrop工程收尾【鸿蒙心迹】
android·harmonyos