我最近完成了一个应用程序并开始分析它的 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!
但是 - 这种行为现在很明显:
- 点击Tab3,
- 选择一条消息[[发送了一个新意图,打开一个新
TabContainerActivity
活动]] - 在此活动中单击 Tab3,
- 选择另一条消息[[发送了一个新意图,打开另一个新
TabContainerActivity
活动]] - (重复 3 & 4 & 5)
希望你能看到问题!您可以back
遍历这些活动中的每一个,将它们从堆栈中删除,但由于问题的递归性质,您可以继续导航,每次通过创建一个新活动,直至出现 OutOfMemory 异常。
所以,对于这个问题;
我希望 Tab1 的 Activity 中包含的功能在 Tab 可见时运行(在这种情况下,加载消息),所以我想将其保留为 Activity 本身。话虽如此,当导航到我希望它成为堆栈上唯一的选项卡活动时。我怎样才能做到这一点?
任何帮助和讨论将不胜感激!