3

我想在 android 应用程序中实现一个功能,即使我的应用程序没有运行,它也会在日期发生变化(上午 00:00)时执行特定代码。

4

2 回答 2

20

我可能会迟到回答这个问题,但我个人面临同样的问题。对于日期更改,您可以简单地使用带有动作“android.intent.action.DATE_CHANGED”的广播接收器,它会在日期更改时触发(用户隐式或显式)。我希望这对通过谷歌到达这里的人有所帮助。

于 2015-06-25T10:07:53.337 回答
3

为了完成@gaurav-jain 的回答,我在这里举了一个例子,在这种情况下,检测日期是否发生了变化:

abstract class DayChangedBroadcastReceiver : BroadcastReceiver() {

    private var date = Date()
    private val dateFormat by lazy { SimpleDateFormat("yyMMdd", Locale.getDefault()) }

    override fun onReceive(context: Context, intent: Intent) {
        val action = intent.action

        val currentDate = Date()

        if ((action == Intent.ACTION_TIME_CHANGED || action == Intent.ACTION_TIMEZONE_CHANGED) && !isSameDay(currentDate)) {
            date = currentDate
            onDayChanged()
        }
    }

    private fun isSameDay(currentDate: Date) = dateFormat.format(currentDate) == dateFormat.format(date)

    abstract fun onDayChanged()

    companion object {

        /**
         * Create the [IntentFilter] for the [DayChangedBroadcastReceiver].
         *
         * @return The [IntentFilter]
         */
        fun getIntentFilter() = IntentFilter().apply {
            addAction(Intent.ACTION_TIME_TICK)
            addAction(Intent.ACTION_TIMEZONE_CHANGED)
            addAction(Intent.ACTION_TIME_CHANGED)
        }
    }
}

DayChangedBroadcastReceiver在您的活动中创建:

private val dayChangedBroadcastReceiver = object : DayChangedBroadcastReceiver() {

        override fun onDayChanged() {
            // TODO Reload data
        }
    }

在您的活动/片段中注册:

 override fun onResume() {
        super.onResume()
        activity?.registerReceiver(dayChangedBroadcastReceiver, DayChangedBroadcastReceiver.getIntentFilter())
    }

在您的活动/片段中取消注册:

    override fun onPause() {
        super.onPause()
        activity?.unregisterReceiver(dayChangedBroadcastReceiver)
    }
于 2019-07-15T09:24:15.707 回答