Фильтр намерений по категориям с LocalBroadcastManager

Я следую рекомендациям по геозонам и не могу получить LocalBroadcastManager для намерений с работающими категориями. Намеренный отправитель отправляет 2 вида Интентов с той же категорией GeofenceUtils.CATEGORY_LOCATION_SERVICES:

-с действием GeofenceUtils.ACTION_GEOFENCES_ADDED

Intent broadcastIntent = new Intent();
String msg;
broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCES_ADDED)
               .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
               .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
LocalBroadcastManager.getInstance(mActivity).sendBroadcast(broadcastIntent);

-с действием GeofenceUtils.ACTION_GEOFENCE_ERROR

Intent broadcastIntent = new Intent();
String msg;
broadcastIntent.setAction(GeofenceUtils.ACTION_GEOFENCE_ERROR)
               .addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES)
               .putExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS, msg);
LocalBroadcastManager.getInstance(mActivity).sendBroadcast(broadcastIntent);

В приемнике я хотел бы иметь IntentFilter который фильтрует Интенты по категориям, а не по действиям, например:

geofenceReceiver = new BroadcastReceiver() {

@Override
public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra(GeofenceUtils.EXTRA_GEOFENCE_STATUS);
    Log.d(TAG, "geofenceReceiver got message: " + message);
}

IntentFilter intentFilter = new IntentFilter();
intentFilter.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
LocalBroadcastManager.getInstance(this).registerReceiver(geofenceReceiver, intentFilter);

Но onReceive никогда не срабатывает. Зачем?

1 ответ

Решение

OK I found the solution here http://developer.android.com/reference/android/content/IntentFilter.html:

A match is based on the following rules. Note that for an IntentFilter to match an Intent, three conditions must hold: the action and category must match, and the data (both the data type and data scheme+authority+path if specified) must match (see match(ContentResolver, Intent, boolean, String) for more details on how the data fields match).

Действие соответствует, если какое-либо из указанных значений соответствует действию Intent; если фильтр не указывает никаких действий, он будет соответствовать только тем Intents, которые не содержат действий.

Категории совпадают, если все категории в Intent соответствуют категориям, указанным в фильтре. Дополнительные категории в фильтре, которых нет в Intent, не приведут к сбою сопоставления. Обратите внимание, что в отличие от действия, IntentFilter без категорий будет соответствовать только Intent, который не имеет каких-либо категорий.

So I have to add both Actionс IntentFilter:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(GeofenceUtils.ACTION_GEOFENCES_ADDED);
intentFilter.addAction(GeofenceUtils.ACTION_GEOFENCE_ERROR);
intentFilter.addCategory(GeofenceUtils.CATEGORY_LOCATION_SERVICES);
Другие вопросы по тегам