2

我最近完成了一个应用程序并开始分析它的 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.class复制Extras到子操作。它还具有捕获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...

使用上面的代码,您可以在 Tabs 之间正常移动,您还可以单击 Tab3 中的消息并在 Tab1 中完整显示 - 太棒了!将来可以轻松修改代码,以允许其他应用程序将 MessageID 传递给第一个选项卡活动,Wonderfu!

但是 - 这种行为现在很明显:

  1. 点击Tab3,
  2. 选择一条消息[[发送了一个新意图,打开一个新TabContainerActivity活动]]
  3. 在此活动中单击 Tab3,
  4. 选择另一条消息[[发送了一个新意图,打开另一个新TabContainerActivity活动]]
  5. (重复 3 & 4 & 5)

希望你能看到问题!您可以back遍历这些活动中的每一个,将它们从堆栈中删除,但由于问题的递归性质,您可以继续导航,每次通过创建一个新活动,直至出现 OutOfMemory 异常。

所以,对于这个问题;

我希望 Tab1 的 Activity 中包含的功能在 Tab 可见时运行(在这种情况下,加载消息),所以我想将其保留为 Activity 本身。话虽如此,当导航到我希望它成为堆栈上唯一的选项卡活动时。我怎样才能做到这一点?

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

4

1 回答 1

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)您重新开始活动的意图将帮助您获得所需的结果。

于 2011-06-07T10:42:48.260 回答