2

アプリケーションナビゲーションをクリックすると、(次のコードを使用して)新しいインテントを起動するたびにAndroidがアクティビティの新しいインスタンスを作成していることがわかります。

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

私が読んだことによると、これはデフォルトの動作のようです。これは、アプリケーションの履歴を維持するために、ヒープに複数のインスタンスが割り当てられることを意味すると思います。ただし、Patrick Dubroyは、メモリ管理に関する彼のビデオで、メモリリークがない限り、アクティビティの1つのインスタンスのみがヒープダンプに表示される必要があると述べています。

私の質問は2つあります。インテントが起動されるたびに新しいアクティビティインスタンスが作成されるというのは正しいですか?その場合、ヒープダンプに複数のインスタンスが表示されている場合は、メモリリークがあることを示していますか?

タスクとバックスタックガイドに 基づく更新

バックスタックのアクティビティは再配置されないため、アプリケーションでユーザーが複数のアクティビティから特定のアクティビティを開始できる場合、そのアクティビティの新しいインスタンスが作成され、スタックにプッシュされます(アクティビティの以前のインスタンスを取得するのではありません)。頂点に)。そのため、アプリケーション内の1つのアクティビティが複数回インスタンス化される場合があります(異なるタスクからでも)

4

1 に答える 1

4

アプリケーションでこれを行っている場合:

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

次に、実際、Androidはの新しいインスタンスを作成し、HomeActivityそれをアクティビティスタックの一番上に配置します。これにより、の複数のインスタンスが発生しますHomeActivity。それがあなたが望むものではない場合(そしておそらくあなたが望むものではない場合)、これに対処するためのいくつかの可能な方法があります。

私はあなたのアプリケーションを知らず、あなたはコードも何も投稿していないので、私はいくつかの仮定をする必要があります。アプリケーションを開始するために使用する最初のアクティビティ(ルートアクティビティHomeActivityとも呼ばれます)は、あなたであると想定します。また、それが他のアクティビティを開始し、他のアクティビティを開始するときにそれ自体を呼び出さないと仮定します。HomeActivityfinish()

この場合、次のようにすること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 に答える