PendingIntents поддерживают кеширование одного и того же объекта

Я столкнулся с некоторыми проблемами, пытаясь передать данные по намерениям и в ожидании намерений BroadcastReceiver, касающихся оповещений о близости. Более конкретно, я пытаюсь передать объект, который, среди прочего, содержит постоянно меняющуюся позицию пользователя. Я пробовал различные тактики, предлагаемые здесь (и не только), но никто не работал, что приводило к либо нулевым значениям, либо тем же самым, что и впервые созданные намерения, когда намерение было получено на стороне BroadcastReceiver. Используемая тактика:

  • Пометить намерение, которое несет объект: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP Результат: значения Null на стороне BroadacastReceiver
  • Отметка ожидающего намерения, созданного с использованием первоначального намерения, с: FLAG_UPDATE_CURRENT или FLAG_CANCEL_CURRENT Результат: значения Null на стороне BroadacastReceiver
  • Приобретение случайного идентификатора для намерения или ожидающего намерения с использованием System.currentTimeMillis (); Результат: намерения не увольняются или не принимаются вообще
  • Ничего не описано выше. Результат: получение одного и того же начального значения каждый раз.

Код для вызывающего метода (лишенный любых экспериментов / создание нулевых значений):

private void setProximityAlert(MyCar myCar) { String locService = Context.LOCATION_SERVICE; LocationManager locationManager; locationManager = (LocationManager)getSystemService(locService); float radius = myCar.getMyCarRadius(); long expiration = myCar.getMyCarExpiration(); myService.setMyDriverLat(userLat);//setting user's position myService.setMyDriverLng(userLng);//setting user's position Intent intent = new Intent(myCar.getMyCarName()); intent.putExtra("myCar",myCar); PendingIntent proximityIntent = PendingIntent.getBroadcast(this, -1, intent, 0); locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent); } 

Код для вызывающего метода, который устанавливает фильтр намерения и регистрирует BroadcastReceiver:

 public void addNewCarPoint (MyCar myCar){ IntentFilter filter = new IntentFilter(myCar.getMyCarName()); registerReceiver(new ProximityAlertReceiver(), filter); setProximityAlert(myCar); } 

Код для канала BroadcastReceiver:

 public class ProximityAlertReceiver extends BroadcastReceiver { @Override public void onReceive (Context context, Intent intent) { MyCar myCar=(MyCar)intent.getParcelableExtra("myCar"); driverLoc=(String)Double.toString(myCar.getMyDriverLat()); Toast.makeText(context, userLoc, Toast.LENGTH_SHORT).show(); Intent i = new Intent(context, MyCarDiscoveryPrompt.class); context.startActivity(i);//firing intent } public void intentDataLoader(){ } 

}

Любые идеи были бы более чем приветствуются. Заранее спасибо.

    Хм, я думаю, что нашел что-то:

    Я поместил BroadcastReceiver (ProximityAlerReceiver), используемый для обнаружения предупреждений о близости в том же классе (MyCarTracking.class), где находится LocationListener.class. Это обеспечивает немедленный доступ к новым обновлениям местоположения, создавая новое намерение, завершенное в новом ожидающем событии, которое должно быть запущено в BroadcastReceiver (только при соблюдении критериев близости). Флаги: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP и FLAG_CANCEL_CURRENT на намерениях и ожиданииIntent, сохранялись соответственно. Более конкретно:

    Код для LocationListener:

     private final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location);//update application based on new location } public void onProviderDisabled(String provider){ updateWithNewLocation(null);//update application if provider disabled } public void onProviderEnabled(String provider){ // Update application if provider enabled } public void onStatusChanged(String provider, int status, Bundle extras){ //update application if provider hardware status changed } }; 

    Код для метода setProximityAlert ():

     private void setProximityAlert() { String locService = Context.LOCATION_SERVICE; Context context =getApplicationContext(); LocationManager locationManager; locationManager = (LocationManager)getSystemService(locService); float radius = myCar.getMyCarRadius(); long expiration = myCar.getMyCarExpiration(); Intent intent = new Intent(CAR_DISCOVERED); intent.putExtra("myCar",myCar); locationManager.getLastKnownLocation(provider); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//flagging intent PendingIntent proximityIntent = PendingIntent.getBroadcast(context, -1, intent, PendingIntent.FLAG_CANCEL_CURRENT);//flagging pendingIntent locationManager.addProximityAlert(myCar.getMyCarLat(), myCar.getMyCarLng(), radius, expiration, proximityIntent);//setting proximity alert } 

    Это решение работает, производя свежие намерения со свежими обновлениями местоположения. Спасибо всем за вашу помощь и ваш интерес 🙂

    Попробуйте добавить aim.setData (uri); Где uri – некоторая уникальная ценность для каждого ожидающего намерения

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

    Вот хорошее обсуждение кода Google по теме: http://groups.google.com/group/android-developers/browse_thread/thread/b2060b27c8934921

    Я решил все свои проблемы с помощью (ab), используя оба uri в SetData и (зарезервированный) код запроса в PendingEvent.GetWhatever.

    Я также использую FLAG_CANCEL_CURRENT по своим намерениям и убедившись, что только pendingintents, которые используют одну и ту же цель, получают одинаковые данные, действие и uri.

    Надеюсь, это поможет немного.