Хорошо, что люди, использующие Карты Google в приложении для Android, могут использовать только один MapActivity для каждого процесса. Существует ошибка подробно обсуждающая это, а также обходной способ применения каждой MapActivity в отдельном процессе. Я не хочу делать это в своем приложении по нескольким причинам и разработал другое обходное решение, которое, похоже, работает.
Для каждого Activity, содержащего карту, я расширяю ее на ActivityGroup и создаю/уничтожаю MapActivity в onResume/onPause как дочернее действие. Это гарантирует, что будет только один экземпляр MapActivity за раз (при условии, что вы показываете один Activity за раз). Ниже приведена упрощенная версия моей реализации:
public class MyMapActivityGroup extends ActivityGroup {
@Override
protected void onResume() {
super.onResume();
addMapView();
}
@Override
protected void onPause() {
super.onPause();
removeMapView();
}
private void addMapView() {
Intent intent = new Intent(this, MyMapActivity.class);
Window window = getLocalActivityManager().startActivity("map", intent);
setContentView(window.getDecorView());
}
private void removeMapView() {
setContentView(new FrameLayout(this));
getLocalActivityManager().removeAllActivities();
}
}
MapActivity Я использую ничего особенного и не требует никаких изменений. Он просто устанавливает MapView в качестве содержимого.
Кажется, это работает отлично для меня. Но есть ли недостаток в этом? Моя главная проблема - утечка памяти, создаваемая при переходе между действиями, содержащими карту.