2011-09-03 25 views
14

「ナビゲーションメニュー」には、Activity1とActivity2を起動するための項目が2つあります。 たとえば、Activity1からActivity2を開始してから、「ナビゲーションメニュー」をタップしてActivity1を開きますが、これを実行すると、開いている別のインスタンスの代わりにActivity1の新しいインスタンスが取得されます。 Activity1のインスタンスが既に存在する場合はそれを開き、そうでない場合は新しいインスタンスを作成するにはどうすればよいですか?新しいアクティビティを作成するのではなく、すでに開いているアクティビティを開くにはどうすればよいですか?

答えて

25

FLAG_ACTIVITY_REORDER_TO_FRONTを追加します。 IntentstartActivity()と一緒に使用してください。

+0

ありがとうございます!それは私のように動作します)) – TFR

+1

しかし、これを使用して、oncreate()メソッドが呼び出されていない?新しいデータを渡してアクティビティをリフレッシュしたい場合はどうすればいいですか? Onresume()はそこにいますが、同じことをする他の方法がありますか? –

+1

@ JD.com:どちらの場合でも 'onCreate()'または 'onNewIntent()'を呼び出す必要があります。 – CommonsWare

2

アクティビティのフラグをsingleTaskに設定し、onNewIntent(Intent intent)を上書きして新しいインテントを取得します。

4

も、この気に異なるlaunchModesについてのチェックアウトthisManifest.xml

<activity android:name=".myActivity" android:label="@string/app_name" 
      android:launchMode="singleTop" /> 

であなたの活動にandroid:launchMode="singleTop"を追加:上記の表に示すように

を、標準ではデフォルトのモードで、ありますほとんどのタイプのアクティビティには適切です。 SingleTopは多くの種類のアクティビティに共通の で、便利な起動モードです。他のモード - singleTaskとsingleInstanceは - 彼らはユーザーになじみのないことが そうな相互作用モデルにつながることから、ほとんどの 用途には適していませんし、他のほとんどの のアプリケーションは非常に異なっている

0

最も完全な答えはandroid:launchMode="singleTask"を使用することであろうと、すでにそれに渡された新しいテントとActivityのインスタンスがある場合は、それが呼び出されますので、あなたの機能に応じて、onNewIntentをオーバーライドします。

<activity 
      android:name=".MainActivity" 
      android:launchMode="singleTask"/> 

なぜですか?

質問に基づきます。 2つのアクティビティActivity1 & はActivity2は、我々はActivity2を開くActivity1を開き、からActivity1

、があります。その後、内Activity2

は、どのように私はそれがすでに存在する場合Activity1のインスタンスを開いていない場合は、新しいインスタンスを作成することができますか?現在のタスクがにされ、その後、活動を開始するときに、この活動を開始したタスクの実行がすでに存在し、場合は、代わりの新しいインスタンスを起動singleTask

ためAndroidManifestActivity_launchModeで述べたように

正面。既存のインスタンスは、Activity.onNewIntent()への呼び出しを受け取ります...

あなたがsingleTask launchModeについて読めばさらに、意図クラスの下で、それはすでにIntent.FLAG_ACTIVITY_BROUGHT_TO_FRONTを使用して、手動での意図を設定するには、通常、アプリケーションコードによって設定されていません。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

int型FLAG_ACTIVITY_BROUGHT_TO_FRONT で述べたように、このフラグは通常、アプリケーションのコードで設定されていませんが、singleTaskモード用launchModeのマニュアルに記載されているシステムによって自動的に設定します。

したがって、singleTask launchModeを使用することにより、あなたはそこにあなたのアプリケーションのインスタンスが1つだけで、あなたがCommonsWareによって示唆されているように、あなたのActivity2を呼び出し、すべての活動であなたの意図にFLAG_ACTIVITY_BROUGHT_TO_FRONTフラグを追加する必要がないことを確認してください。

ここでandroid:launchMode="singleTop"weakwireとすると、linkは彼自身が明確に述べています。

"singleTop" ...たとえば、 "singleTop"アクティビティの既存のインスタンスがターゲットタスクにあり、スタックの一番上にない場合、またはスタックトップの場合スタックの新しいインスタンスが作成され、スタックにプッシュされます。言い換えれば

、我々はしたくないものですいくつかのシナリオではActivity1の複数のインスタンスで終わるでしょう。

最終的には、回答自体に何も寄与しない編集回答が大好きな方は、実際にスタックオーバーフロー評判を増やしたい場合は、本当の質問にお答えください。

関連する問題