4

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

  • Отметки намерения, который несет объект с: 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); 
    } 

Код для трансляцииПользовательская ссылка:

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(){  
} 

}

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

ответ

1

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

Я поместил BroadcastReceiver (ProximityAlerReceiver), используемый для обнаружения оповещения о приближении в одном классе (MyCarTracking.class), где LocationListener.class находится. Это, , обеспечивает немедленный доступ к новым обновлениям местоположения, создавая новое намерение, завернутое в новый pendingIntent, который будет запущен в 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 
} 

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

0

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

+0

Я тоже пробовал это, но, похоже, это также относится к третьей тактике, описанной выше, без каких-либо намерений, которые были уволены или получены:/ – nifo 2010-12-05 23:49:16

0

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

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

Я решил все свои проблемы путем (аb) с использованием как Ури в SetData и (зарезервировано) коды запроса в PendingEvent.GetWhatever.

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

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

+0

Это интересная дискуссия о том, что i я тоже читал, но, похоже, здесь что-то не так, потому что я все пробовал ... Спасибо за информацию, хотя :) – nifo 2010-12-06 10:48:55

Смежные вопросы