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

时间:2018-03-30 14:10:44

标签: android android-location android-broadcastreceiver 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")
    }

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

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

编辑:我看到有些应用会要求获得特殊权限,例如“忽略电池优化”,并且在获得此权限时,该应用似乎始终有效且不断发送通知。

2 个答案:

答案 0 :(得分:0)

您应该在后台服务和清单文件集中执行此操作" stopWithTask"标志为假。

这样,当用户从最近的应用中删除您的应用时,您的服务就不会被杀死。

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开始您的服务。这样,如果用户杀死您的应用,服务将重新启动,您可以继续执行您的工作。 (这不是保证会发生,但这是一个不错的妥协)

我希望它有所帮助

答案 1 :(得分:0)

根据documentation,如果目标API为26或更高,则不应期望调用隐式接收器:

  

注意:如果您的应用面向API级别26或更高级别,则无法使用   显示为隐式广播声明接收器(广播   除了少数隐含之外,没有专门针对您的应用程序)   免除该限制的广播。在大多数情况下,你   可以使用预定的工作。

唯一的好解决方案似乎是前台服务。您可以随时将其保留在后台,只有在使用Service.onTaskRemoved关闭应用时才将其移至前台。