Android选项卡 - 选项卡之间的导航导致内存泄漏

时间:2011-06-07 09:55:18

标签: android memory-leaks android-sdk-2.3

我最近完成了一个应用程序并开始为CPU&内存使用情况并遇到内存泄漏:

在一个简单的3选项卡应用程序中,每个选项卡都有不同的功能,我在Tab3上有一个按钮,它将用户和messageId一起发送回Tab1。与Tab1相关联的活动捕获此额外内容并显示该消息(如果存在)。请参阅下面的Tab3中的按钮:

public void onClick(View arg0) {
    Intent notificationIntent = new Intent(getApplicationContext(), TabContainerActivity.class);
    notificationIntent.setAction("com.test.notify.MESSAGE");
    notificationIntent.putExtra(MessageBean.MESSAGE_ID, messageId);
    startActivity(notificationIntent);
}

选项卡容器TabContainerActivity.classExtras复制到子操作。它还具有捕获与意图一起发送的Action的逻辑,如果找到,则用于确定将哪个选项卡设置为当前:

if(getIntent().getExtras() != null ) intent.putExtras(getIntent().getExtras());
if(getIntent().getAction().equalsIgnoreCase("com.test.notify.MESSAGE"))
{       
    tabHost.setCurrentTab(0);
}
else if(getIntent().getAction().equalsIgnoreCase("com.test.notify.SETTINGS"))
{
    tabHost.setCurrentTab(1);
}
...etc...

使用上面的代码,你可以正常地在标签之间移动,你也可以点击Tab3中的一条消息,并在Tab1中完整显示 - 太棒了!将来可以轻松修改代码,以允许其他应用程序将MessageID传递给第一个标签活动,Wonderfu!

然而 - 此行为现已证明:

  1. 点击Tab3,
  2. 选择一条消息 [[发送新意图,开启新的TabContainerActivity活动]]
  3. 在此活动中,点击Tab3,
  4. 选择其他消息 [[发送新意图,打开另一个新的TabContainerActivity活动]]
  5. (重复3& 4& 5)
  6. 希望你能看到问题!您可以通过back遍历每个活动,将它们从堆栈中剥离出来,但由于问题的递归性质,您可以继续导航,每次传递创建一个新活动,直到OutOfMemory异常为止。 / p>

    所以,对于这个问题;

    我希望Tab1&#39s活动中包含的功能在Tab变得可见时运行(在这种情况下,加载一条消息),所以我希望将它作为一个Activity保存。这样说,导航到我希望它是堆栈中唯一的Tab Activity。我怎样才能做到这一点?

    任何帮助和讨论都将不胜感激!

1 个答案:

答案 0 :(得分:1)

使用此

public void onClick(View arg0) {
    Intent notificationIntent = new Intent(NotifyService.getInstance(), TabContainerActivity.class);
    notificationIntent.setAction("com.test.notify.MESSAGE");
    notificationIntent.putExtra(MessageBean.MESSAGE_ID, messageId);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(notificationIntent);
}

我认为只使用.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)来表示您再次启动活动的意图将有助于您获得所需的结果。