活动泄露
假设你有一个具有两个活动的应用程序:活动A(发射)与发射活动B.的事项活动B的代码按钮:活动泄露
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(....);
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
}
});
}
活动B加载一些位图为其界面。它不会恢复其退出时的旧的默认未捕获异常处理程序。做A-> B-> A-> B ...导致内存不足异常,因为活动B被泄漏。为什么活动B会泄露?
在我看来,这是错误的架构。对于链式搜索,您应该只有每个Activity
的单个实例。您应通过调用startActivity()
并在您使用的Intent
中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
来在不同的Activity
实例之间切换。还要在Intent
中添加要显示为“额外”的数据。
为了能够使用后退按钮通过链条向后(不管它有多长),每个Activity
应该管理包含它需要每当用户备份到它重新创建页面的数据堆栈。在onCreate()
和onNewIntent()
中,数据(来自“额外”)应该压入堆栈并显示。然后,您可以覆盖onBackPressed()
,并通过拨打startActivity()
并在您使用的Intent
中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
并返回到之前的Activity
。您还在Intent
中添加了一个“额外”,表示用户想要“返回”。在onBackPressed()
中,您还应该丢弃掉Activity
剩下的数据堆栈中的顶部元素。这将确保当用户回到Activity
时堆栈正确。
在onNewIntent()
如果用户刚刚备份到Activity
,您只显示已经在管理数据堆栈顶部的数据。
通过这种方式,您只有一个每个Activity
的实例,用户可以整天连接整个活动集,并且BACK按钮始终有效,您不必担心内存不足。
尝试使用taskAffinity
或Intent
标志或类似标志来完成此操作将不起作用。不要浪费你的时间。这也是糟糕的编程风格。
我希望这很清楚。 和内存异常使用
添加清单
的Android> V3
<application
....
android:largeHeap="true">