PendingIntents продолжит кэшировать один и тот же объект - PullRequest
4 голосов
/ 02 декабря 2010

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

  • Пометка намерения, несущего объект, с помощью: FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP Результат: нулевые значения на стороне BroadacastReceiver
  • Пометка ожидающего намерения, созданного с использованием начального намерения, с помощью: FLAG_UPDATE_CURRENT или FLAG_CANCEL_CURRENT Результат: нулевые значения на стороне 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(){      
 }
* *} Тысяча двадцать-один

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

Ответы [ 3 ]

1 голос
/ 06 декабря 2010

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

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

Код для 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
}

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

0 голосов
/ 06 декабря 2010

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

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

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

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

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

0 голосов
/ 05 декабря 2010

Попробуйте добавить intent.setData (uri);где uri - это уникальное значение для каждого ожидающего намерения

...