Опинсинтеты продолжают кэширование же объекта
-
29-09-2019 - |
Вопрос
Я сталкивался с некоторыми проблемами, пытающимися передавать данные через Intents и в ожидании намерений к широко-обратному, касающемуся близорукостям. Более конкретно, пытаюсь пройти объект, что среди других удерживает постоянно меняющееся положение пользователя. Я попробовал различные тактики, предложенные здесь (и не только), но никто не обрабатывался, что приведет к тому, что либо нулевые значения, либо одинаково - в первую очередь созданные цели, когда намерение извлекается на стороне широководства. Тактики используются:
- Промежуток намерения, который несет объект с: flag_activity_new_task + flag_activity_clear_top + flag_activity_single_top Результат: нулевые значения на стороне широковещателя
- Промежуток в ожидании намерения, созданный с использованием начального намерения, с: flag_update_current или flag_cancel_current Результат: нулевые значения на стороне широковещателя
- Приобретение случайного идентификатора для намерения или в ожидании намерения с использованием 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);
}
Код для метода вызова, который устанавливает фильтр «Намеренные» и регистрируют широковетелю:
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(){
}
}
Любые идеи будут более чем приветствуются. Заранее спасибо.
Решение
Хм, я думаю, что я нашел что-то:
Я поместил BroadCastreceiver (ProximityAleRreceiver), используемый для обнаружения пропорциональных предупреждений в том же классе (MyCartracking.class), где расположен locationListener.class. Это обеспечивает немедленный доступ к обновлениям свежего местоположения, создавая новое намерение, завернутое в новом искуплении, которое будет выпущено в BroadCastreceiver (только при выполнении критериев близости). Флаги: flag_activity_new_task + flag_activity_single_top и flag_cancel_current на намерениях и zendentintent, были сохранены соответственно. Более конкретно:
Код для 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
}
Это решение работает, создавая свежие напряжения со свежими обновлениями местоположения. Спасибо всем за вашу помощь и ваш интерес :)
Другие советы
Попробуйте добавить Intent.SetData (URI); где URI - это некоторое уникальное значение для каждого ожидающего намерения
Я также боролся с этой проблемой. Мне потребовалось целая ночь, чтобы найти, что странная ошибка, которую я имел связан с этим вопросом.
Вот хорошее обсуждение в Google Code по теме: http://groups.google.com/group/android-developers/browse_thread/thrad/b2060b27c8934921.
Я решил все свои проблемы с помощью (AB), используя как URI в SetData, так и (зарезервированном) коде запроса в Pondendendevent.getwhatever.
Я также использую Flag_cancel_Current на моем намерении и убедившись только в том, что он разделяет ту же цель, получите те же данные, действие и URI.
Надеюсь, это немного поможет.