Я использовал недавно запущенный 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")
}
Приложение работает нормально и принимает трансляцию, когда оно не удалено из вкладки недавних приложений. Но когда приложение удаляется с вкладки последних приложений или уничтожается системой, я не могу получать трансляции. Я не знаю, что я делаю неправильно. Есть ли другой способ добиться того же?
Я рассматривал возможность использования службы переднего плана, чтобы приложение не было убито, но потом подумал, что показывать постоянное уведомление только для обнаружения перехода активности пользователя — не очень хорошая идея.
Изменить: я видел, что некоторые приложения запрашивают специальное разрешение, например «Игнорировать оптимизацию батареи», и когда это разрешение дается, это приложение всегда работает и продолжает отправлять уведомление.
onDestroy
? Вы тестировали на нескольких устройствах? Для некоторых stackoverflow.com/a/42120277/1256219 требуется "защищенное приложение" - person brandall   schedule 02.04.2018PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_NO_CREATE);
pendingIntent = PendingIntent.getBroadcast(this, 4, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_UPDATE_CURRENT);
- person Radhey   schedule 09.04.2018