如何为每个 Android 应用程序/进程使用多个 MapActivity/MapViews
Posted
技术标签:
【中文标题】如何为每个 Android 应用程序/进程使用多个 MapActivity/MapViews【英文标题】:How to use multiple MapActivities/MapViews per Android application/process 【发布时间】:2011-03-23 17:10:40 【问题描述】:我编写了一个MapActivity
类,它能够显示一组地点以及单个地点。启动时,应用程序会创建此MapActivity
的实例并显示多个位置。如果用户点击某个地点,则会启动一个新的Activity
,显示所选地点的详细信息。该活动有一个菜单项,允许用户在地图上查看该地点——这会导致创建MapActivity
的新实例,只是现在只显示这个单一地点。
现在的问题是,如果用户导航回第一个 MapActivity
(显示多个位置的那个),则不会再加载图块 + 有时会遇到 OutOfMemoryErrors。
根据android JavaDocs,每个进程只能有一个MapActivity
。但是,我不想将我的MapActivity
定义为 singleInstance/singleTask,因为用户应该始终能够导航回显示多个位置的第一个 MapActivity。
我看到用于 Android 的 Google Places 应用程序(随 Google Map 4.4 一起提供)使用多个 MapActivity
实例。这怎么可能?以及如何在我的应用程序中实现它?
【问题讨论】:
【参考方案1】:根据 Android JavaDocs,它 只能有一个 每个类的 MapActivity
不是每个类一个地图视图,而是每个进程。
众所周知,在一个进程中使用多个地图视图时,您可能会遇到一些问题。如果您没有配置任何特定内容,通常是这种情况(您的应用程序在一个进程中运行)。 您可以在清单中使用 android:process 属性来分配给您的活动:
<activity android:name=".activity.directory.MapView1" android:process=":MapView1">
<activity android:name=".activity.directory.MapView2" android:process=":MapView2">
通过这种方式,您可以让活动在单独的进程中运行,如果您不使用任何跨活动的共享静态变量,这将非常有效。
另见 android bug tracker 中关于 bug 的讨论:
http://code.google.com/p/android/issues/detail?id=3756
【讨论】:
感谢您的回答。我已经知道使用 android:process 属性的可能性。但是,在我的例子中,我在 AndroidManifest.xml 文件中只定义了一个 MapActivity,它能够显示多个位置以及单个位置。我现在可以将这个 MapActivity 拆分为两个 MapActivity(如您所建议的那样),但我想知道是否还有其他解决方案 - 我不认为在 Android 的 Google Places 应用程序中,每个 MapActivity 实例都在单独的进程中运行。到目前为止,我更喜欢重新设计我的应用程序 s.t.始终只有一个 MapActivity 处于活动状态。 在运行 Google Places 时查看日志文件,活动都在同一个进程中,我可以确认。尽管如此,我不会假设 Google Apps 完全基于公共 SDK 组件构建,但也有一些非公共自定义组件;即,这就是为什么谷歌地图使用不同的地图图块提供程序并且比 SDK 的 MapView 等更准确的原因。处理方法是使用 SDK 时常用的方法,并且是我所知道的唯一解决方法,也指 Android 开发组和 Android SDK 错误跟踪器。 我的应用程序包含选项卡布局(TabHost,TabSpec)。我在我的应用程序中使用了两个地图视图。因此,如果我在其中一个地图视图中启用卫星视图,那么其他地图也会显示在卫星视图中,如果我将一张地图拖向美国,则其他地图视图也会被拖向美国,无论它之前指向哪里。我使用了上述解决方案,但它并没有解决我的问题。有什么问题? 我创建了一个简单的应用程序。包含用于启动远程活动的按钮的活动。按下按钮会创建另一个远程活动,我可以在 DDMS 中看到它。但是当涉及到我的选项卡(TabHost,TabSpec)应用程序时它不起作用!!!【参考方案2】:每个进程可以有多个 MapActivity,只要一次只运行一个即可。每个 MapActivity 只能分配一个 MapView。您可以通过在同一个 MapActivity 中重用同一个 MapView 来显示不同的地图。您可以通过将 MapView 声明为静态类变量来重用它,在完成显示时将其从当前添加到的视图中删除,为其提供新的 GPS 坐标并将其添加到下一个视图。完成该 MapActivity 后,完成它,然后您可以打开一个新的 MapActivity。这行得通,我在我的应用程序中这样做。
【讨论】:
【参考方案3】:另一个简单的解决方案:只需覆盖所有 MapActivities 的 onDestroy 方法以防止关闭资源,例如:
@Override
protected void onDestroy()
super.onStop();
我们应该在这里调用 onStop 以防止抛出 RuntimeException。是的,这是一个 hack,但它确实有效。
【讨论】:
【参考方案4】:更新:
Google Maps Android API v2 支持片段。这意味着您可以像显示任何其他片段一样轻松地显示多个地图。
查看documentation 并阅读有关新MapFragment
类的更多信息。
【讨论】:
以上是关于如何为每个 Android 应用程序/进程使用多个 MapActivity/MapViews的主要内容,如果未能解决你的问题,请参考以下文章
在Android 6中打开wifi时如何为任何应用程序强制使用移动数据