Проблемы с BroadcastReceiver и несколькими оповещениями о близости - PullRequest
0 голосов
/ 02 декабря 2011

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

Я использую эти вопросы в качестве руководства:

оповещение о множественной близости на основе услуги

набор 2 оповещений о сближении с одной и той же передачей

Где я регистрирую получателя:

final String NEAR_YOU_INTENT = "neighborhood.crodgers.example.activities.PROXIMITY_ALERT";
IntentFilter filter = new IntentFilter(NEAR_YOU_INTENT);
registerReceiver(new LocationReceiver(), filter);

Где добавляются оповещения о близости (Примечание: это делается в службе, отсюда и контекст):

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
final String NEAR_YOU_INTENT = "neighborhood.crodgers.example.activities.PROXIMITY_ALERT";
Context context = getApplication().getApplicationContext();

int requestCode = 12345; //Spaceballs, anyone? anyone?
for (String domain : domainNames)
{
    String[] itemNames = itemGetter();
    for (String item : itemNames)
    {
        HashMap<String, String> attributes = getAttributesForItem(domain, item);                    

        Intent intent = new Intent(NEAR_YOU_INTENT);
        intent.putExtra(ADDRESS, attributes.get(ADDRESS));
        intent.setAction(""+requestCode);
        PendingIntent proximity = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        manager.addProximityAlert(Double.parseDouble(attributes.get(LATITUDE)),
                                  Double.parseDouble(attributes.get(LONGITUDE)), 
                                  6000f, -1, proximity);

        requestCode++;
    }
}

Первоначально я получал уведомление о первом добавленном оповещении о близости (используя уведомления от получателя). После добавления

intent.setAction(""+requestCode);

Я тоже пробовал:

intent.setData(""+ requestCode)

(я видел это рекомендованным в нескольких других местах) Я перестал получать уведомления все вместе.

1 Ответ

3 голосов
/ 15 декабря 2011

Задача

Проблема в том, что вы используете setAction

Intent intent = new Intent(NEAR_YOU_INTENT);
intent.putExtra(ADDRESS, attributes.get(ADDRESS));
intent.setAction(""+requestCode); //HERE IS THE PROBLEM

То, что вы в конечном итоге делаете в последней строке, изменяет действие с NEAR_YOUR_INTENT на любой код запроса. IE, вы делаете эквивалент

    Intent intent = new Intent();
    intent.setAction(NEAR_YOUR_INTENT);
    intent.setAction(""+requestCode); // THIS OVERWRITES OLD ACTION

Дополнительный подход

Я подозреваю, что вы действительно хотите сделать, это добавить requestCode в качестве дополнительного к цели, чтобы вы могли получить его в своем приемнике. Попробуйте использовать

    Intent intent = new Intent(NEAR_YOU_INTENT);
    intent.putExtra(ADDRESS, attributes.get(ADDRESS));
    intent.putExtra("RequestCode", requestCode);

Подход к данным

Кроме того, вы можете установить данные в качестве кода запроса. IE, вы можете использовать

    Intent intent = new Intent(NEAR_YOU_INTENT);
    intent.putExtra(ADDRESS, attributes.get(ADDRESS));
    intent.setData("code://" + requestCode);

Тогда вам нужно будет изменить приемник, чтобы он мог принять "код: //" схемы. Для этого:

final String NEAR_YOU_INTENT = "neighborhood.crodgers.example.activities.PROXIMITY_ALERT";
IntentFilter filter = new IntentFilter(NEAR_YOU_INTENT);
filter.addDataScheme("code");
registerReceiver(new LocationReceiver(), filter);

Тогда, возможно, вы могли бы использовать какой-то метод для анализа идентификатора из поля данных, когда вы получите свое намерение. ИМО, подход статистов проще.

...