在android的广播接收器中检测日变化事件

Posted

技术标签:

【中文标题】在android的广播接收器中检测日变化事件【英文标题】:Detect day change event in broadcast receiver in android 【发布时间】:2014-12-07 13:03:34 【问题描述】:

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

【问题讨论】:

Date and time change listener in Android? 的可能重复项 ***.com/questions/14888773/…的可能重复 【参考方案1】:

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

【讨论】:

它在 android x 中不起作用。你能分享一下工作示例代码吗?【参考方案2】:

为了完成@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)
    

【讨论】:

逻辑和代码都很好,但我认为它不适用于所有你应该在过滤器中添加 Intent.ACTION_DATE_CHANGED 并像这样有趣的检查 getIntentFilter() = IntentFilter().apply addAction (Intent.ACTION_TIME_TICK) addAction(Intent.ACTION_DATE_CHANGED) addAction(Intent.ACTION_TIMEZONE_CHANGED) addAction(Intent.ACTION_TIME_CHANGED) 并检查条件,如 if ((action == Intent.ACTION_TIME_CHANGED || action==Intent.ACTION_TIMEZONE_CHANGED || action == Intent.ACTION_DATE_CHANGED)&& !isSameDay(currentDate)

以上是关于在android的广播接收器中检测日变化事件的主要内容,如果未能解决你的问题,请参考以下文章

广播接收器,如 iOS 中用于检测互联网连接变化的组件

如何检测服务和广播接收器中的关键事件

Android 基础知识 -- BroadcastReceiver

如何使用广播接收器检测蓝牙状态变化?

替换“vpn.connectivity”广播事件

BroadcastReceiver--Android广播机制