You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin实现每日零点重置textViewSteps为0

每日零点自动重置步数的Kotlin实现方案

需求:让textViewSteps在每日零点自动重置为0,无需保存当日步数,已完成基础计步功能,需实现resetSteps()函数及定时触发逻辑。

现有计步相关代码

activity_main.xml中的布局代码

<RelativeLayout
    android:id="@+id/stepsContainer"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="20dp"
    android:orientation="horizontal"
    android:weightSum="2">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/rounded_rectangle"
        android:orientation="horizontal"/>

    <TextView
        android:layout_marginTop="50dp"
        android:id="@+id/textViewSteps"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="0"
        android:textColor="@color/black"
        android:textSize="30sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/stepsDailyGoal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textViewSteps"
        android:layout_centerHorizontal="true"
        android:text="/10,000"
        android:textColor="@color/black"
        android:textSize="30sp"
        android:textStyle="bold" />

</RelativeLayout>

MainActivity.kt中的计步逻辑

override fun onSensorChanged(event: SensorEvent?) {
    if (running){
        totalSteps = event!!.values[0]
        val stepCount = totalSteps.toInt() - previousTotalSteps.toInt()
        binding.textViewSteps.text = ("$stepCount")
    }
}

// 待实现的重置函数
fun resetSteps(){}

实现步骤

1. 完成resetSteps()函数逻辑

重置的核心是同步基准步数与当前总步数,确保后续当日步数从0开始计数:

fun resetSteps() {
    // 同步基准步数为当前总步数,重置当日计数起点
    previousTotalSteps = totalSteps
    // 更新UI显示为0
    binding.textViewSteps.text = "0"
}

2. 配置每日零点定时触发机制

使用AlarmManager结合广播接收器实现跨进程定时任务,确保APP后台时也能触发重置:

步骤2.1 创建广播接收器

新建ResetStepReceiver.kt文件:

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.localbroadcastmanager.content.LocalBroadcastManager

class ResetStepReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // 发送本地广播通知MainActivity执行重置
        val resetIntent = Intent("ACTION_RESET_STEPS")
        LocalBroadcastManager.getInstance(context!!).sendBroadcast(resetIntent)
    }
}

步骤2.2 在MainActivity中注册广播并设置闹钟

在MainActivity.kt中添加以下代码:

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.provider.Settings
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import java.util.Calendar

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private var totalSteps = 0f
    private var previousTotalSteps = 0f
    private var running = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 注册本地广播接收器,接收重置指令
        LocalBroadcastManager.getInstance(this).registerReceiver(
            object : BroadcastReceiver() {
                override fun onReceive(context: Context?, intent: Intent?) {
                    resetSteps()
                }
            },
            IntentFilter("ACTION_RESET_STEPS")
        )

        // 设置每日零点重置闹钟
        setupDailyResetAlarm()

        // 其他初始化逻辑...
    }

    private fun setupDailyResetAlarm() {
        val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val intent = Intent(this, ResetStepReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            this,
            0,
            intent,
            PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
        )

        // 计算下次零点时间(当前已过零点则设置次日零点)
        val calendar = Calendar.getInstance().apply {
            set(Calendar.HOUR_OF_DAY, 0)
            set(Calendar.MINUTE, 0)
            set(Calendar.SECOND, 0)
            set(Calendar.MILLISECOND, 0)
            if (timeInMillis < System.currentTimeMillis()) {
                add(Calendar.DAY_OF_YEAR, 1)
            }
        }

        // 适配不同Android版本的闹钟设置
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            // Android 12+需检查精确闹钟权限
            if (alarmManager.canScheduleExactAlarms()) {
                alarmManager.setExactAndAllowWhileIdle(
                    AlarmManager.RTC_WAKEUP,
                    calendar.timeInMillis,
                    pendingIntent
                )
                // 设置每日重复触发
                alarmManager.setRepeating(
                    AlarmManager.RTC_WAKEUP,
                    calendar.timeInMillis + AlarmManager.INTERVAL_DAY,
                    AlarmManager.INTERVAL_DAY,
                    pendingIntent
                )
            } else {
                // 引导用户开启精确闹钟权限
                startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
            }
        } else {
            // 低版本直接设置重复闹钟
            alarmManager.setRepeating(
                AlarmManager.RTC_WAKEUP,
                calendar.timeInMillis,
                AlarmManager.INTERVAL_DAY,
                pendingIntent
            )
        }
    }

    // 其他函数:onSensorChanged、resetSteps等...
}

步骤2.3 添加权限声明

在AndroidManifest.xml中添加精确闹钟权限:

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />

内容的提问来源于stack exchange,提问作者evan.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:44:52