【问题标题】:How to use multiple MapActivities/MapViews per Android application/process如何为每个 Android 应用程序/进程使用多个 MapActivity/MapViews
【发布时间】: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 实例。这怎么可能?以及如何在我的应用程序中实现它?

【问题讨论】:

    标签: android google-maps android-mapview


    【解决方案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 类的更多信息。

        【讨论】:

          猜你喜欢
          • 2011-09-27
          • 1970-01-01
          • 1970-01-01
          • 2016-05-19
          • 2014-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多