活动泄露

活动泄露

问题描述:

假设你有一个具有两个活动的应用程序:活动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按钮始终有效,您不必担心内存不足。

尝试使用taskAffinityIntent标志或类似标志来完成此操作将不起作用。不要浪费你的时间。这也是糟糕的编程风格。

我希望这很清楚。 和内存异常使用
添加清单

的Android> V3

<application 
    .... 
     android:largeHeap="true">