У меня есть действие, которое отображает карту Google с некоторой дополнительной информацией. Также у меня есть служба, которая загружает информацию с сервера и периодически информирует активность о том, что другая часть информации загружается с использованием PendingIntent.
На Android 4.0.3 все работает нормально. Но на Android 2.3.4 карта в активности мигает (становится серым, а затем перезагружается) каждый раз, когда сервис сообщает об этой активности.
Попытался отследить, обновляется ли карта где-нибудь в onActivityResult, но это не так.
Любая помощь приветствуется. Вот код:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == SERVICE_CACHED) {
String fmId = data.getStringExtra("cachedId");
if (dev.get(position).getId().equals(fmId)) { //we still viewing the same device
long[] dat = data.getLongArrayExtra("dates");
ArrayList<Date> dates = new ArrayList<Date>();
for (int i=0; i<dat.length; i++) {
dates.add(new Date(dat[i]));
}
addDates(fmId, dates, false, true);
//this is executed only once, as it meant to be
if ((dispDate.getText() == null) || (dispDate.getText().toString().isEmpty())) {
State state;
synchronized(DBHelper.class) {
state = DBHelper.getState(fmId, dates.get(0).getTime());
}
updDispState(state);
}
}
}
}
public void addDates(String fmId, ArrayList<Date> dates, boolean clear, boolean addTimesTo0) {
if (dev.get(position).getId().equals(fmId)) { //maybe user already changed selected device
if (clear) {
this.dates = dates;
} else {
this.dates.addAll(0, dates);
}
updDateSpinners(clear, dates, addTimesTo0);
}
}
Сервис информирует об активности, используя это:
private void cache(LinkedList<State> statsAll, LinkedList<Long> datesAll) {
if ((statsAll == null) || (statsAll.isEmpty()) || (datesAll == null) || (datesAll.isEmpty())) {
return;
}
synchronized(DBHelper.class) {
DBHelper.addStates(statsAll, fmId);
}
//inform MapActivity that new data is available
long[] l = new long[datesAll.size()];
for (int i=0; i<l.length; i++) {
l[i] = datesAll.get(i);
}
Intent intent = new Intent().putExtra("cachedId", fmId).putExtra("dates", l);
try {
pi.send(CacheService.this, MapActivity.SERVICE_CACHED, intent);
} catch (PendingIntent.CanceledException e) {}
}
ОБНОВЛЕНИЕ
Проведя еще несколько тестов, я обнаружил, что карта просто перезагружается при каждом вызове onResume(). Как это остановить?
Я помещаю карту в xml следующим образом:
<fragment
android:id="@+id/mapF"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
И получить его в коде позже
GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapF)).getMap();