无法使用广播接收器检测用户活动转换

Meh*_*iya 8 android broadcastreceiver android-location activity-recognition

我最近使用Google推出的Activity Transition API来检测用户何时进出车辆.下面是我用来实现相同的代码.

 val intent = Intent(context, ActivityTransitionReceiver::class.java)
    val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)

    transitions.apply {
        add(ActivityTransition.Builder()
                .setActivityType(DetectedActivity.IN_VEHICLE)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
                .build())

        add(ActivityTransition.Builder()
                .setActivityType(DetectedActivity.IN_VEHICLE)
                .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
                .build())
    }

    var transitionRequest = ActivityTransitionRequest(transitions)

    // myPendingIntent is the instance of PendingIntent where the app receives callbacks.
    val task = ActivityRecognition.getClient(context).requestActivityTransitionUpdates(transitionRequest, pendingIntent)

    task.addOnSuccessListener {
        // Handle success
        context.toast("Task added successfully")
    }

    task.addOnFailureListener {
        // Handle error
        context.toast("Error adding task")
    }
Run Code Online (Sandbox Code Playgroud)

该应用程序工作正常,并在未从最近的应用程序选项卡中删除时接收广播.但是,当应用程序从最近的应用程序选项卡中删除或被系统杀死时,我无法接收广播.我不知道我做错了什么.还有其他方法可以达到同样的目的吗?

我考虑使用前台服务,以便应用程序不被杀死,但后来认为显示永久通知只是为了检测用户活动过渡不是一个好主意.任何帮助将不胜感激.谢谢.

编辑:我已经看到一些应用程序要求特殊权限,例如"忽略电池优化",当获得此权限时,该应用程序似乎始终有效并且不断发送通知.

小智 0

您应该在后台服务中执行此操作,并在清单文件中将“stopWithTask”标志设置为 false。

这样,当用户从最近的应用程序中删除您的应用程序时,您的服务将不会被终止。

https://developer.android.com/reference/android/content/pm/ServiceInfo.html

当用户从最近的应用程序中删除您的任务时,将调用服务中的回调:onTaskRemoved https://developer.android.com/reference/android/app/Service.html#onTaskRemoved(android.content.Intent)

您可以在此回调中进行一些清理或任何您想要的操作

最后,以 STICKY 身份启动您的服务。这样,如果用户终止您的应用程序,服务将重新启动,您可以继续工作。(这不能保证会发生,但这是一个不错的妥协)

我希望它有帮助