Не удалось обнаружить переход активности пользователя с помощью широковещательных приемников.

Я использовал недавно запущенный 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")
    }

Приложение работает нормально и принимает трансляцию, когда оно не удалено из вкладки недавних приложений. Но когда приложение удаляется с вкладки последних приложений или уничтожается системой, я не могу получать трансляции. Я не знаю, что я делаю неправильно. Есть ли другой способ добиться того же?

Я рассматривал возможность использования службы переднего плана, чтобы приложение не было убито, но потом подумал, что показывать постоянное уведомление только для обнаружения перехода активности пользователя — не очень хорошая идея.

Изменить: я видел, что некоторые приложения запрашивают специальное разрешение, например «Игнорировать оптимизацию батареи», и когда это разрешение дается, это приложение всегда работает и продолжает отправлять уведомление.


person Mehul Kanzariya    schedule 30.03.2018    source источник
comment
Вы снимаетесь с регистрации в onDestroy? Вы тестировали на нескольких устройствах? Для некоторых stackoverflow.com/a/42120277/1256219 требуется "защищенное приложение"   -  person brandall    schedule 02.04.2018
comment
Где вы использовали этот код. В службе или деятельности?   -  person Vinayak B    schedule 06.04.2018
comment
замените свои ожидающие намерения на это PendingIntent 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
comment
stackoverflow.com/questions/41277671/ взгляните на мой вопрос .. это может вам помочь   -  person Mr.Popular    schedule 09.04.2018


Ответы (2)


Вы должны сделать это в фоновом режиме и в файле манифеста установить для флага «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. Таким образом, если пользователь убьет ваше приложение, служба перезапустится, и вы сможете продолжить свою работу. (это не гарантировано, но это достойный компромисс)

Я надеюсь, что это помогает

person Kamalpreet Singh    schedule 05.04.2018

Согласно документации не следует ожидать вызова неявного получателя если ваш целевой API 26 или выше:

Примечание. Если ваше приложение нацелено на уровень API 26 или выше, вы не можете использовать манифест для объявления получателя неявных широковещательных рассылок (вещательных передач, которые не нацелены конкретно на ваше приложение), за исключением нескольких неявных широковещательных передач, на которые не распространяется это ограничение. В большинстве случаев вместо этого можно использовать запланированные задания.

Кажется, единственным хорошим решением является служба переднего плана. Вы можете все время держать его в фоновом режиме и перемещать на передний план только тогда, когда приложение закрыто с помощью Service.onTaskRemoved.

person Sir Codesalot    schedule 08.04.2018