成功注册 BroadcastReceiver 到 requestActivityTransitionUpdates,但 onReceive 从未调用

Successfully registered a BroadcastReceiver to requestActivityTransitionUpdates, but onReceive never called

我目前正在开发一个需要知道用户当前是否静止的应用程序。我遵循了 Android 中的代码实验室教程(以及其他教程):https://developer.android.com/codelabs/activity-recognition-transition#0

我已经在清单文件中添加了所需的权限(并接受了它们。设置显示允许我的应用程序使用activity): manifest file

我创建了一个 class 继承自 BroadcastReceiver 并实现了一个基本版本的 onReceive 以查看它是否有效:

class ActivityController : BroadcastReceiver() {
val transitions = mutableListOf<ActivityTransition>()

companion object {
    const val REQUEST_CODE_INTENT_ACTIVITY_TRANSITION = 122
}

init {
    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.IN_VEHICLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.IN_VEHICLE)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.STILL)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.STILL)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build()

    transitions +=
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build()
}

override fun onReceive(p0: Context?, p1: Intent?) {
    Log.d("proj", "please work")
    Toast.makeText(MainActivity.instance()!!, "please work", Toast.LENGTH_LONG).show()
}
}

在我的 MainActivity.kt 的 onStart 方法中,我有以下代码,创建 ActivityController 的实例,将其注册为接收器并请求 activity 转换更新:

override fun onStart() {
    super.onStart()

    activityController = ActivityController()
    registerReceiver(activityController, IntentFilter(TRANSITIONS_RECEIVER_ACTION))
    val request = ActivityTransitionRequest(activityController.transitions)

    ActivityRecognition.getClient(this)
        .requestActivityTransitionUpdates(request, getPendingIntent())
        .addOnSuccessListener { Log.d("proj", "Request success") }
        .addOnFailureListener { Log.d("proj", "Request failure") }
}

private fun getPendingIntent(): PendingIntent {
    val intent = Intent(TRANSITIONS_RECEIVER_ACTION, null, this, ActivityController::class.java)
    return PendingIntent.getBroadcast(this, 0, intent, 0)
}

可以看到请求成功:successful request 但是永远不会调用 onReceive 函数。

这让我抓狂了一整天,如有任何帮助,我们将不胜感激:-)

好吧,所以我又玩了一会儿,让它工作了一些(p1: Intent? 出于某种原因,参数总是 returns null,但现在实际上调用了 onReceive)。我发现 activity 的变化对于我的目的来说太慢了(30-60 秒范围),但如果有人看到这个 post:

我遵循了 Foodie Dev 的教程:https://www.youtube.com/watch?v=2Em5ep_KYIY&ab_channel=FoodieDev

我意识到我没有在清单文件的 'activity' 子句中包含 'receiver' 子句:receiver in manifest

除了删除 MainActivity.jt 的 onCreate 中的 registerReceiver(...) 并稍微更改我的代码结构(比如在 onCreate 方法中访问客户端)之外,我认为这就是我所做的全部MainActivity.kt 而不是 onStart)

希望这对遇到相同情况的人有所帮助。