Как использовать несколько 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:
Вы можете иметь более одного 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
учебный класс.