计算用户在您的应用上花费多少时间的最佳方法 (Kotlin)
Best way to count how much time user spend on your app (Kotlin)
我想计算用户在我的应用中花费的时间然后存储它,当用户再次使用该应用时我们添加新的时间
我的应用程序中有多个活动,我正在使用 MVVM,所以我认为最好将逻辑放在 MVVM 中
问题是如何计算时间
有什么想法吗??
在视图的 onStart()
中告诉视图模型开始计时,在 onStop()
中告诉它停止并坚持下去。
在视图模型中,当被告知开始计时时,将 System.currentTimeMillis()
的值存储在 属性 中。当被告知停止时,从对 System.currentTimeMillis()
的另一个调用中减去该值,并通过将其添加到先前从模型中检索到的记录值来将其持久化到模型中。
根据评论编辑:
下面介绍了如何使用协程创建一个定期更新 LiveData 的计数器。由于协程中的延迟并不十分精确,我让它每秒触发四次,以防止计时器不时显着丢失或增加一秒。
private val _secondsUpTime = MutableLiveData<Int>()
val secondsUpTime: LiveData<Int> = _secondsUpTime
private var startTime = -1L
private var counterJob: Job? = null
fun notifyAppStarted() {
startTime = System.currentTimeMillis()
counterJob = viewModelScope.launch {
val lastPersistedLifetime = repo.lifetimeMillis
while (true) {
val totalTime = System.currentTimeMillis() - startTime + lastPersistedLifetime
_secondsUpTime.value = (totalTime / 1000).toInt()
delay(250)
}
}
}
fun notifyAppStopped() {
if (startTime < 0) {
Log.e(TAG, "Tried to notify app stopped without notifying app started first.")
return
}
counterJob?.cancel()
val totalTime = System.currentTimeMillis() - startTime + repo.lifetimeMillis
repo.lifetimeMillis = totalTime // persist to the repository
}
我想计算用户在我的应用中花费的时间然后存储它,当用户再次使用该应用时我们添加新的时间
我的应用程序中有多个活动,我正在使用 MVVM,所以我认为最好将逻辑放在 MVVM 中
问题是如何计算时间
有什么想法吗??
在视图的 onStart()
中告诉视图模型开始计时,在 onStop()
中告诉它停止并坚持下去。
在视图模型中,当被告知开始计时时,将 System.currentTimeMillis()
的值存储在 属性 中。当被告知停止时,从对 System.currentTimeMillis()
的另一个调用中减去该值,并通过将其添加到先前从模型中检索到的记录值来将其持久化到模型中。
根据评论编辑:
下面介绍了如何使用协程创建一个定期更新 LiveData 的计数器。由于协程中的延迟并不十分精确,我让它每秒触发四次,以防止计时器不时显着丢失或增加一秒。
private val _secondsUpTime = MutableLiveData<Int>()
val secondsUpTime: LiveData<Int> = _secondsUpTime
private var startTime = -1L
private var counterJob: Job? = null
fun notifyAppStarted() {
startTime = System.currentTimeMillis()
counterJob = viewModelScope.launch {
val lastPersistedLifetime = repo.lifetimeMillis
while (true) {
val totalTime = System.currentTimeMillis() - startTime + lastPersistedLifetime
_secondsUpTime.value = (totalTime / 1000).toInt()
delay(250)
}
}
}
fun notifyAppStopped() {
if (startTime < 0) {
Log.e(TAG, "Tried to notify app stopped without notifying app started first.")
return
}
counterJob?.cancel()
val totalTime = System.currentTimeMillis() - startTime + repo.lifetimeMillis
repo.lifetimeMillis = totalTime // persist to the repository
}