Создайте IntentFilter в android, который соответствует ALL intents
Возможно ли создать IntentFilter в Android, который соответствует всем вещам, которые транслируются по телефону (возможно, с помощью BroadcastReceiver)? И.Е. те, которые я вижу в ddms, когда я пользуюсь телефоном, в теге ActivityManager? После того, как я просмотрел документацию и посмотрел на источник структуры, мне остается думать, что это невозможно сделать? Чтобы вы указывали какие-то данные, перефразируя документы, "нужно указать какие-то данные, иначе вы получите только данные без данных". Приложение, которое я пишу, должно знать о каждом запущенном в системе приложении. До сих пор единственный способ, которым я смог это сделать, - опросить ActivityManager. Кажется, наилучшим способом было бы иметь решение, основанное на событиях, используя любую используемую логику ActivityManager, но все это гречески для меня внутри источника Framework ActivityManager.java, и кажется, что много вещей внизу (если не ВСЕ) сознательно инкапсулируется от меня.
Любые идеи?
Ответы
Ответ 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));
}
}