2011-01-25 41 views
3

我理解这个主题已经被覆盖了几次,并且通常提出的具有“多个”MapActivity类的解决方案是在不同的进程中运行一个。我不想这样做,我有3个。堆栈中的多个MapActivitys

我改为将一个MapActivity子类重构为3种不同的模式。


package com.rossgreenhalf.maptest.activity; 

import android.os.Bundle; 

import com.google.android.maps.MapActivity; 

public class MyMapActivity extends MapActivity { 

    @Override 
    protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 

    /* Inflate xml view, Set Zoom etc */ 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     int mode = getIntent().getExtras().getInt("MAP_MODE"); 

     switch(mode){ 
     case 1: 
      /* Some markers to show */ 
      break; 
     case 2: 
      /* Just one Marker */ 
      break; 
     case 3: 
      /* Only showing my location */ 
      break; 
     } 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
    return false; 
    } 
} 

我允许多个MapActivity实例驻留在任务堆栈中,因为它的启动模式仍然设置为“标准”。这种方法似乎工作正常,我没有得到一些似乎得到的连接池关闭消息,对于是否存在多个MapActivity实例或者Android是否自动重用一个实例,我有点困惑。

不过,我得到这个错误,我不知道这是多么严重:


01-25 10:14:54.433: ERROR/ActivityThread(5620): Activity com.rossgreenhalf.maptest.activity.MyMapActivity has leaked IntentReceiver com.google.android[email protected]44981cf0 that was originally registered here. Are you missing a call to unregisterReceiver()? 
01-25 10:14:54.433: ERROR/ActivityThread(5620): android.app.IntentReceiverLeaked: Activity com.rossgreenhalf.maptest.activity.MyMapActivity has leaked IntentReceiver com.google.android[email protected]44981cf0 that was originally registered here. Are you missing a call to unregisterReceiver()? 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.(ActivityThread.java:968) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:753) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:799) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ContextImpl.registerReceiver(ContextImpl.java:786) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ContextImpl.registerReceiver(ContextImpl.java:780) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at com.google.android.maps.NetworkConnectivityListener.startListening(MapActivity.java:163) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at com.google.android.maps.MapActivity.onResume(MapActivity.java:431) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at com.rossgreenhalf.maptest.activity.MyMapActivity.onResume(MyMapActivity.java:166) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1237) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.Activity.performResume(Activity.java:3864) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3315) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3340) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2158) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.os.Looper.loop(Looper.java:143) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at android.app.ActivityThread.main(ActivityThread.java:4914) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
01-25 10:14:54.433: ERROR/ActivityThread(5620):  at dalvik.system.NativeStart.main(Native Method) 

我是否采取正确的方法呢?我应该关心这个错误吗?

+0

这个错误只是告诉你,一些Receiver被注册,并且在活动关闭后没有被注销。这可能会导致应用程序中的内存泄漏。 – Olegas 2011-01-25 11:25:33

回答

6

我得到了同样的问题,搜索后,我发现这个职位同一个问题

https://novoda.lighthouseapp.com/projects/63622/tickets/157-leak-receiver-searchresult

它表明该问题使用应用程序中的多个map activities时上升。

所以在我的应用程序的manifest.xml 文件我做了一个单独的流程中每个地图活动运行:

android:process=":p1" 
android:process=":p2" 

您可以在Android的文档阅读更多关于这一点。 http://developer.android.com/guide/topics/manifest/activity-element.html#proc