Объявленный манифестом BroadcastReceiver не получает явную трансляцию, когда приложение не запущено - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь заставить два приложения общаться через трансляции. Первое приложение отправляет трансляцию с использованием кода, подобного следующему:

Intent outIntent = new Intent("org.example.WHATEVER");
PackageManager pm = this.getPackageManager();
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0);
if (receivers != null)
    for (ResolveInfo receiver : receivers) {
        Log.d("Sender", String.format("Polling %s", receiver.activityInfo.packageName));
        outIntent = new Intent("org.example.WHATEVER");
        outIntent.setPackage(receiver.activityInfo.packageName);
        sendBroadcast(outIntent);
    }

Принимающая сторона регистрирует BroadcastReceiver в своем манифесте:

<receiver android:name="org.example.receiverapp.WhateverReceiver" >
    <intent-filter>
        <action android:name="org.example.WHATEVER" />
    </intent-filter>
</receiver>

Метод onReceive() записывает запись журнала при вызове.

Когда приложение-получатель работает (т. Е. У меня основное занятие было на экране, а затем удалено от него), оно обрабатывает трансляцию. Однако, если приложение-получатель не запущено (что я проверяю, нажав «Назад» и активировав «Долгое нажатие кнопки« Назад, чтобы убить приложение »в настройках разработчика»), оно не разбудит трансляция.

Я намеренно устанавливаю имя пакета для намерения, чтобы избежать проблем с заявленными декларацией получателями, которые больше не получают неявные широковещательные сообщения от Android 8 и выше. Кроме того, я использую Android 7 с обоими приложениями, ориентированными на API 23, поэтому любые ограничения в Android 8 в любом случае не должны иметь значения в этой настройке.

Я столкнулся с комментарием , автор которого предполагает, что некоторые разновидности Android могут не пробудить приложения для широковещательной передачи, что, по-видимому, и здесь (с LineageOS 14.1), хотя этот комментарий не не очень конкретный, и я не нашел ничего другого, подтверждающего это утверждение.

Это то, что здесь происходит? Если так, как я могу гарантировать, что приложение-получатель разбудит трансляция (по крайней мере, если оно направлено)? Если нет, то что здесь не так?

1 Ответ

0 голосов
/ 24 июня 2018

Чтобы сделать явное Intent, я обычно использую setComponent(), поскольку он гарантированно работает (как и все, что угодно):

Intent outIntent = new Intent("org.example.WHATEVER");
PackageManager pm = this.getPackageManager();
List<ResolveInfo> receivers = pm.queryBroadcastReceivers(outIntent, 0);
if (receivers != null)
    for (ResolveInfo receiver : receivers) {
        Log.d("Sender", String.format("Polling %s/%s",
                receiver.activityInfo.applicationInfo.packageName,
                receiver.activityInfo.name));
        ComponentName cn = new ComponentName(
                receiver.activityInfo.applicationInfo.packageName,
                receiver.activityInfo.name);
        outIntent = new Intent("org.example.WHATEVER");
        outIntent.setComponent(cn);
        sendBroadcast(outIntent);
    }

В некоторых случаяхsetPackage() делает Intent "достаточно явным", чтобы удовлетворять некоторому критерию Android.Видимо в этом случае это не так.¯\_(ツ)_/¯

...