假设您有一个包含两个活动的应用:活动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被泄露了?
答案 0 :(得分:0)
在我看来,这是错误的架构。对于链式搜索,您应该只拥有每个Activity
的单个实例。您应该通过调用Activity
并在您使用的startActivity()
中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
来在不同的Intent
个实例之间切换。同时在Intent
。
为了能够使用BACK按钮返回链(无论多长时间),每个Activity
应该管理一个堆栈,其中包含每当用户后退时重新创建页面所需的数据进去。在onCreate()
和onNewIntent()
中,数据(来自“extras”)应该被压入堆栈并显示。然后,您可以覆盖onBackPressed()
并通过调用Activity
并在您使用的startActivity()
中设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
来返回上一个Intent
。您还可以向Intent
添加一个“额外”,表示用户想要“返回”。在onBackPressed()
中,您还应该丢弃剩余的Activity
数据堆栈中的顶部元素。这将确保当用户返回到此Activity
时,堆栈是正确的。
在onNewIntent()
中,如果用户刚刚进入Activity
,您只需显示已存在于托管数据堆栈顶部的数据。
通过这种方式,您只有一个Activity
个实例,用户可以整天通过一系列活动链接,并且BACK按钮始终有效,您不必担心用完存储器中。
尝试使用taskAffinity
或Intent
标记或类似标记来完成此操作将无效。不要浪费你的时间。编程风格也不好。
我希望这很清楚。
并且对于内存异常使用
添加清单
android> V3
<application
....
android:largeHeap="true">