private var syncStatusHandle: Any? = null
override fun onResume() {
super.onResume()
syncStatusHandle = ContentResolver.addStatusChangeListener(
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE or ContentResolver.SYNC_OBSERVER_TYPE_PENDING
)
{
Timber.d("sync event fired")
}
}
override fun onPause() {
super.onPause()
if (syncStatusHandle != null) {
ContentResolver.removeStatusChangeListener(syncStatusHandle)
}
}
这就是撰写的外观(它与文档中提到的几乎相同的方法:可互操作性apis
):
@Composable
fun SyncStatusManager(
onSyncEvent: (count: Int) -> Unit
) {
val context = LocalContext.current
val currentOnSyncEvent by rememberUpdatedState(onSyncEvent)
DisposableEffect(context) {
val syncStatusHandle = ContentResolver.addStatusChangeListener(
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE or ContentResolver.SYNC_OBSERVER_TYPE_PENDING
)
{
currentOnSyncEvent(it)
}
onDispose {
ContentResolver.removeStatusChangeListener(syncStatusHandle)
}
}
}
它在不同的组合中使用:
SyncStatusManager {
Timber.d("sync event should be fired, but it's not")
}
我试图使用启动效应,或者根本没有效果,但没有成功。当我触发同步时,回调应立即发射,但事实并非如此。
我想念什么吗?我是JetPack组成的新手。谢谢
(在两种情况下都授予必要的许可)
示例:
private fun myLifecycleObserver(onResume:()->Unit,onPause:()->Unit): LifecycleEventObserver =
LifecycleEventObserver { _, event ->
when (event) {
Lifecycle.Event.ON_RESUME -> onResume()
Lifecycle.Event.ON_PAUSE -> onPause()
else -> { /* ignore */ }
}
}
@Composable
fun SyncStatusManager(
onSyncEvent: (count: Int) -> Unit
) {
val context = LocalContext.current
val lifecycle = LocalLifecycleOwner.current.lifecycle
val currentOnSyncEvent by rememberUpdatedState(onSyncEvent)
var syncStatusHandleState by remember { mutableStateOf<Any?>(null) }
DisposableEffect(context, lifecycle) {
val lifecycleObserver =myLifecycleObserver(onResume = {
syncStatusHandleState = ContentResolver.addStatusChangeListener(
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE or ContentResolver.SYNC_OBSERVER_TYPE_PENDING
)
{
currentOnSyncEvent(it)
}
}, onPause = {
syncStatusHandleState?.apply {
ContentResolver.removeStatusChangeListener(this)
}
})
lifecycle.addObserver(lifecycleObserver)
onDispose {
lifecycle.removeObserver(lifecycleObserver)
}
}
}
<uses-permission android:name="android.permission.READ_SYNC_STATS" />