Фильтр намерений по категориям с 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);