Подтвердить что ты не робот

Создайте IntentFilter в android, который соответствует ALL intents

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

Любые идеи?

4b9b3361

Ответ 1

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

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

Ответ 2

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