Как использовать несколько MapActivities/MapViews для приложения / процесса Android

Я написал один MapActivity класс, который может отображать набор мест, а также отдельные места. При запуске приложение создает экземпляр этого MapActivity и отображает несколько мест. Если пользователь нажимает на определенное место, то новый Activity запускается, который показывает детали выбранного места. У этого действия есть пункт меню, который позволяет пользователю просматривать место на карте - это приводит к тому, что новый экземпляр MapActivity создается, за исключением того, что теперь отображается только это единственное место.

Проблема в том, что если пользователь переходит к первому MapActivity (тот, который показывает несколько мест) плитки больше не будут загружаться + иногда встречаются ошибки OutOfMemoryErrors.

Согласно Android JavaDocs, возможно иметь только один MapActivity за процесс. Однако я не хочу определять мой MapActivity как singleInstance/singleTask, поскольку пользователь всегда должен иметь возможность вернуться к первому MapActivity, которое показывает несколько мест.

Я видел, что приложение Google Places (которое поставляется с Google Map 4.4) для Android использует несколько MapActivity экземпляров. Как это возможно? И как я могу добиться этого в моем приложении?

4 ответа

Решение

Согласно Android JavaDocs, возможно иметь только один MapActivity на класс

Это не один вид карты на класс, это процесс.

Известно, что при использовании нескольких видов карты в одном процессе могут возникнуть некоторые проблемы. Обычно это тот случай (ваше приложение работает в одном процессе), если вы не настроили ничего конкретного. Однако вы можете использовать атрибут android: process в своем манифесте, чтобы назначить свои действия:

<activity android:name=".activity.directory.MapView1" android:process=":MapView1">

<activity android:name=".activity.directory.MapView2" android:process=":MapView2">

Таким образом, вы выполняете действия в отдельных процессах, что хорошо работает, если вы не используете общие статические переменные в действиях.

Также смотрите обсуждение ошибки в трекере ошибок Android:

http://code.google.com/p/android/issues/detail?id=3756

Вы можете иметь более одного MapActivity для каждого процесса, если одновременно выполняется только один. Каждому MapActivity может быть присвоен только один MapView. Вы можете показать разные карты, повторно используя один и тот же MapView в одной и той же MapActivity. Вы можете повторно использовать MapView, объявив его как переменную статического класса, удалив его из представления, к которому он был добавлен в настоящий момент, когда вы закончили его отображать, присвоив ему новые координаты GPS и добавив его к следующему представлению. Когда вы закончите с этим MapActivity, завершите его, а затем вы сможете открыть новый MapActivity. Это работает, я делаю в моем приложении.

Другое простое решение: просто переопределите метод onDestroy для всех ваших MapActivities, чтобы предотвратить закрытие ресурсов, например:

    @Override
    protected void onDestroy() {
        super.onStop();
    }

Мы должны вызвать onStop здесь, чтобы предотвратить выброс RuntimeException. Да, это взлом, но это работает.

Обновить:

Google Maps Android API v2 поддерживает фрагменты. Это означает, что вы можете легко отобразить несколько карт, как любой другой фрагмент.

Смотрите документацию и читайте больше о новом MapFragment учебный класс.

Другие вопросы по тегам