成功注册 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)
希望这对遇到相同情况的人有所帮助。
我目前正在开发一个需要知道用户当前是否静止的应用程序。我遵循了 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)
希望这对遇到相同情况的人有所帮助。