2

当我单击应用程序导航时,我发现每次启动新 Intent 时,Android 都会创建一个新的活动实例(使用以下代码):

Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);

根据我读过的内容,这似乎是默认行为。我猜这意味着堆现在将分配多个实例来维护应用程序的历史记录。然而,Patrick Dubroy 在他关于内存管理的视频中说,除非存在内存泄漏,否则只有一个活动实例应该出现在您的堆转储中。

我的问题有两个:每次启动意图时都会创建一个新的活动实例,我是否正确?如果是这样,堆转储中出现多个实例是否表明存在内存泄漏?

根据任务和返回堆栈指南更新

因为后台堆栈中的活动从不重新排列,如果您的应用程序允许用户从多个活动启动特定活动,则会创建该活动的新实例并将其推送到堆栈(而不是带上任何先前的活动实例)到顶部)。因此,您的应用程序中的一项活动可能会被多次实例化(甚至来自不同的任务)

4

1 回答 1

4

如果在您的应用程序中,您正在执行以下操作:

Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);

然后,确实,Android 将创建一个新实例HomeActivity并将其放在活动堆栈的顶部。这将导致多个实例HomeActivity这如果那不是您想要的(并且可能不是您想要的),那么有几种可能的方法来处理这个问题。

由于我不知道您的应用程序并且您没有发布任何代码或任何内容,因此我需要做出一些假设。我将假设您HomeActivity是用于启动应用程序的第一个活动(也称为根活动)。我还将假设HomeActivity启动其他活动并且在启动其他活动时调用finish()自身。

如果是这种情况,那么您可以HomeActivity通过执行以下操作从应用程序中的任何活动返回到您的:

Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

假设HomeActivity未在清单定义android:launchMode="singleTop",这将导致活动堆栈中的所有活动(包括HomeActivity)完成,并将创建一个新实例HomeActivity作为堆栈中唯一的活动。

如果您只想删除现有实例之外的所有活动HomeActivity并返回该实例,则需要执行以下操作:

Intent intent = new Intent(this, HomeActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

这将导致活动堆栈(除外HomeActivity)中的所有活动完成,并将调用onNewIntent()然后调用onResume()您现有的实例HomeActivity.

如果我的假设不正确,请纠正我,我可以提出其他建议。

于 2012-10-16T13:33:41.183 回答