Техника для запуска нескольких MapActivities в том же процессе

Хорошо, что люди, использующие Карты 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 в качестве содержимого.

Кажется, это работает отлично для меня. Но есть ли недостаток в этом? Моя главная проблема - утечка памяти, создаваемая при переходе между действиями, содержащими карту.

Ответ 1

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