以下是在 Android 上用 Kotlin 开发小闹钟、计时器和秒表的方法,分为核心功能实现和界面设计两部分:
闹钟功能实现
AlarmManager 和 BroadcastReceiver
// 设置闹钟
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 使用
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 延迟消息
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)
界面布局要点
闹钟界面
- TimePicker 组件用于选择时间
- ToggleButton 控制闹钟开关
计时器界面
- NumberPicker 或 EditText 输入分钟/秒数
- 环形进度条显示剩余时间比例
秒表界面
- 大字号数字显示
- 悬浮按钮控制开始/暂停/重置
<!-- 示例:计时器按钮布局 -->
<Button
android:id="@+id/startButton"
android:text="开始"
android:onClick="@{() -> viewModel.startTimer()}" />
<Button
android:id="@+id/resetButton"
android:text="重置"
android:onClick="@{() -> viewModel.resetTimer()}" />
数据持久化
- 使用
SharedPreferences
存储闹钟设置:
val prefs = getSharedPreferences("AlarmPrefs", MODE_PRIVATE)
prefs.edit().putInt("alarm_hour", hour).apply()
- 计时器状态恢复建议用
ViewModel
:
class TimerViewModel : ViewModel() {
val remainingTime = MutableLiveData<Long>()
}
注意事项
- Android 8.0+ 需设置前台服务并创建通知渠道
- 使用
WorkManager
处理设备重启后的闹钟恢复 - 测试时注意屏幕关闭后的后台行为
- 计时精度要求高时改用
SystemClock.elapsedRealtime()
完整项目可参考 GitHub 上的开源实现如 AlarmClock 或 TimerX。