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

如何用Kotlin实现每日指定时间自动更新Fragment中TextView的内容?

每日名言自动更新实现方案

以下两种适配Android系统特性的Kotlin实现方案,无需复杂保活逻辑,兼容性和资源占用表现都比较好。

方案1:本地日期比对+生命周期回调(优先推荐,无需额外权限)

该方案不需要后台权限,仅依赖应用生命周期触发检查,覆盖90%以上的使用场景,逻辑简单稳定。
核心逻辑:

  • 用SharedPreferences持久化存储上次更新日期、当天选中的名言内容
  • 每次Fragment触发onResume生命周期时,比对当前日期和存储的上次更新日期,不一致则重新随机选取名言并更新存储内容,一致则直接读取已存储的名言展示,保证同一天展示内容固定

代码示例:

import android.content.SharedPreferences
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager
import java.util.*

class QuoteFragment : Fragment() {
    private lateinit var tvQuote: TextView
    private lateinit var sharedPref: SharedPreferences
    // 替换为你的名言列表
    private val quoteList = listOf(
        "天才是1%的灵感加99%的汗水",
        "成就伟业的唯一方法是热爱自己的事业",
        "生活就是你忙于做其他计划时发生的意外"
    )

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_quote, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        tvQuote = view.findViewById(R.id.tv_quote)
        sharedPref = PreferenceManager.getDefaultSharedPreferences(requireContext())
        updateQuoteIfNeeded()
    }

    override fun onResume() {
        super.onResume()
        // 每次回到当前页面都检查是否需要更新
        updateQuoteIfNeeded()
    }

    private fun updateQuoteIfNeeded() {
        val calendar = Calendar.getInstance()
        val today = "${calendar.get(Calendar.YEAR)}-${calendar.get(Calendar.MONTH)}-${calendar.get(Calendar.DAY_OF_MONTH)}"
        val lastUpdateDate = sharedPref.getString("last_quote_update_date", "")
        val savedQuote = sharedPref.getString("today_quote", "")

        if (today != lastUpdateDate) {
            // 新的一天,随机选取名言
            val newQuote = quoteList.random()
            tvQuote.text = newQuote
            // 持久化存储
            sharedPref.edit()
                .putString("last_quote_update_date", today)
                .putString("today_quote", newQuote)
                .apply()
        } else {
            // 同一天直接复用已存储的名言
            tvQuote.text = savedQuote
        }
    }
}

方案2:WorkManager定时调度(适合需要提前缓存/推送的场景)

如果需要用户不打开应用也提前更新好当日名言,或者需要推送当日名言,可以用Jetpack WorkManager实现系统级别的定时调度,完全符合Android后台权限限制,无需手动保活。
实现步骤:

  1. 首先在模块级build.gradle添加依赖
dependencies {
    implementation "androidx.work:work-runtime-ktx:2.8.1"
}
  1. 创建Worker类处理名言更新逻辑
import android.content.Context
import androidx.work.Worker
import androidx.work.WorkerParameters
import androidx.preference.PreferenceManager
import java.util.*

class DailyQuoteWorker(context: Context, params: WorkerParameters) : Worker(context, params) {
    private val quoteList = listOf(
        "天才是1%的灵感加99%的汗水",
        "成就伟业的唯一方法是热爱自己的事业",
        "生活就是你忙于做其他计划时发生的意外"
    )

    override fun doWork(): Result {
        val sharedPref = PreferenceManager.getDefaultSharedPreferences(applicationContext)
        val calendar = Calendar.getInstance()
        val today = "${calendar.get(Calendar.YEAR)}-${calendar.get(Calendar.MONTH)}-${calendar.get(Calendar.DAY_OF_MONTH)}"
        val newQuote = quoteList.random()
        sharedPref.edit()
            .putString("last_quote_update_date", today)
            .putString("today_quote", newQuote)
            .apply()
        return Result.success()
    }
}
  1. 在Application类中初始化周期任务,避免重复注册
import android.app.Application
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import java.util.Calendar
import java.util.concurrent.TimeUnit

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        setupDailyQuoteWorker()
    }

    private fun setupDailyQuoteWorker() {
        // 设置每天早上8点触发更新
        val currentTime = Calendar.getInstance()
        val targetTime = Calendar.getInstance().apply {
            set(Calendar.HOUR_OF_DAY, 8)
            set(Calendar.MINUTE, 0)
            set(Calendar.SECOND, 0)
            if (before(currentTime)) {
                add(Calendar.DAY_OF_MONTH, 1)
            }
        }
        val initialDelay = targetTime.timeInMillis - currentTime.timeInMillis

        val dailyWorkRequest = PeriodicWorkRequestBuilder<DailyQuoteWorker>(24, TimeUnit.HOURS)
            .setInitialDelay(initialDelay, TimeUnit.MILLISECONDS)
            .build()

        WorkManager.getInstance(this).enqueueUniquePeriodicWork(
            "DailyQuoteWork",
            androidx.work.ExistingPeriodicWorkPolicy.KEEP,
            dailyWorkRequest
        )
    }
}

配置完成后Fragment可以直接读取SharedPreferences中存储的名言展示即可。

注意事项

不要使用前台服务、自定义保活等方案实现,不仅容易被系统查杀,还会额外占用系统资源,体验极差。如果需要当天展示的名言固定,一定要将选中的名言持久化存储,不要每次打开应用都随机选取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:06:04