Создать IntentFilter в Android, который соответствует всем намерениям - PullRequest
12 голосов
/ 08 марта 2010

Можно ли создать IntentFilter в Android, который соответствует ВСЕМ намерениям, которые транслируются на телефон (возможно, с помощью BroadcastReceiver)? И.Е. те, которые я вижу в ddms при использовании телефона, под тегом ActivityManager? После прочтения документации и просмотра исходного кода фреймворка, мне остается думать, что это невозможно? Чтобы перефразировать документы, вы должны указать какие-то данные, «необходимо указать какие-то данные, иначе вы получите только намерения без данных». Приложение, которое я пишу, должно знать о каждом приложении, которое запускается в системе. Пока что я смог сделать это только путем опроса ActivityManager. Кажется, лучшим способом было бы иметь решение, управляемое событиями, использующее любую лежащую в основе логику ActivityManager, но для меня это все понятно из исходного кода среды ActivityManager.java, и кажется, что многое из этого ниже (если не ВСЕ) намеренно заключен в капсулу от меня.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 08 марта 2010

Вы сказали это сами, в документации довольно четко указано, как работают фильтры намерений и что невозможно принимать все широковещательные сообщения.

Ни это, ни получение информации о задачах не поддерживаются открытыми API-интерфейсами.в Android SDK.

1 голос
/ 05 апреля 2017

Вы можете зарегистрировать получатель костюма для каждого типа события, который будет содержать ссылку на родительский получатель широковещания и вызывать его метод onReceive

class ChildBroadcastReceiver extends BroadcastReceiver {

    private BroadcastReceiver parent;

    public ChildBroadcastReceiver(BroadcastReceiver parent) {
        this.parent = parent;
    }
    @Override
    public void onReceive(Context context, Intent intent) {
        parent.onReceive(context, intent);
    }
}

Затем вы можете зарегистрироваться на все возможные события, используя отражение:

final BroadcastReceiver parent = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
           android.util.Log.d("GlobalBroadcastReceiver", "Recieved: " +   intent.getAction() + " " + context.toString());
      }
};

Intent intent = new Intent();
for(Field field : intent.getClass().getDeclaredFields()) {
    int modifiers = field.getModifiers();
    if( Modifier.isPublic(modifiers) &&
        Modifier.isStatic(modifiers) &&
        Modifier.isFinal(modifiers) &&
        field.getType().equals(String.class)) {

            String filter = (String)field.get(intent);
            android.util.Log.d("GlobalBroadcastReceiver", "Registered: " + filter);
            application.registerReceiver(new ChildBroadcastReceiver(parent), new IntentFilter(filter));
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...