AndroidのActivity起動モード(二)のIntentのFlag属性
10774 ワード
前にlaunchModeでActivityを設定する起動モードについて説明しました.この章では、Activityの起動モードについて説明します.説明する内容は、Intentと起動モードに関するFlag、android:taskAffinityのプロパティです.
ディレクトリ1.Intentの起動モードに関するFlagの概要2. 1. FLAG_ACTIVITY_NEW_TASKタグテスト3. 2. FLAG_ACTIVITY_CLEAR_TOPタグテスト4. 3. FLAG_ACTIVITY_CLEAR_TASKタグテスト5. 4. FLAG_ACTIVITY_SINGLE_TOPタグテスト
Intent起動モードに関するFlagの概要
ここでは、起動モードに関連してよく使われるFlagのいくつかについてのみ説明します.
FLAG_ACTIVITY_NEW_TASKはGoogleの公式文書で、launchMode=「singleTask」と同じ行為をしていると紹介した.実は、全く同じではありません!FLAGを単独で使用することはめったにありません.ACTIVITY_NEW_TASK、通常FLAG_ACTIVITY_CLEAR_TASKまたはFLAG_ACTIVITY_CLEAR_TOP併用.この属性を単独で使用すると奇妙な現象を引き起こすため、通常は私たちが望んでいる効果に達しません!いずれにしても、「FLAG_ACTIVITY_NEW_TASK例1」と「FLAG_ACTIVITY_NEW_TASK例2」で単独での使用効果が示されます.
FLAG_ACTIVITY_SINGLE_TOPはGoogleの公式ドキュメントで、launchMode=「singleTop」と同じ動作をしていると紹介しています.実は、確かにそうです!FLAGを単独で使用ACTIVITY_SINGLE_TOPでは、launchMode=「singleTop」と同じ効果が得られます.
FLAG_ACTIVITY_CLEAR_TOPその名の通りFLAG_ACTIVITY_CLEAR_TOPの役割は、「Activityを含むtask」のActivityインスタンスの上にある他のActivityインスタンスをクリアします.FLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASK両方を併用することでlaunchMode=「singleTask」と同じ効果が得られます!
FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_CLEAR_TASKの役割にはActivityのtaskが含まれる.FLAG_の使用ACTIVITY_CLEAR_TASKの場合、通常はFLAG_を含むACTIVITY_NEW_TASK.Activityを起動すると、以前に存在していたActivityインスタンスが存在するtaskをクリアすることを目的としています.これにより、以前に存在したActivityインスタンスも自然にクリアされます!
注意:launchModeと上のFLAG_を同時に使用する場合ACTIVITY_NEW_TASK等ラベルの場合、FLAG_ACTIVITY_NEW_TASKが標準です.つまり、manifestのプロファイルよりもコードの優先度が高い!
以下では、いくつかの例によって、これらのタグの理解を深める.
1. FLAG_ACTIVITY_NEW_TASKラベルテスト
1.1 FLAG_ACTIVITY_NEW_TASK例1
クリックして表示:FLAG_ACTIVITY_NEW_TASK例1のソースコード
この例では、Activity:Activity TestとSecondActivityの2つがあります.manifestは次のように定義されています.
説明:manifestから、Activity TestとSecondActivityは同じAPKにあることがわかります.これはandroid:taskAffinityが同じであることを意味します!
Activity Testのソースコード
説明:onJump()はActivity Testのボタンのコールバック関数で、このボタンをクリックするとSecondActivityにジャンプします.なお、ジャンプのIntentにはFLAG_が追加されていますACTIVITY_NEW_TASKマーク.
SecondActivityのソースコード
説明:onBack()は、SecondActivityのボタンのコールバック関数です.このボタンをクリックするとActivity Testにジャンプします.
試験内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivity試験結果:(01)Activity TestとSecondActivityは同じtaskにあります.(02)2つのSecondActivityの異なるインスタンス!結果分析:FLAG_と言えばACTIVITY_NEW_TASKの役割はsingleTaskと同じ効果を持つ.では、この例は明らかです.そうしないと、この結論になります.実際、相互にジャンプする2つのActivityのandroid:taskAffinityが同じ場合、FLAG_を単独で使用するACTIVITY_NEW_TASKは何の効果もありません!
もし2つのActivityのandroid:taskAffinityが違うとしたら?この場合、どのような効果が得られますか?次に、例を挙げて効果を見てみましょう.
1.2 FLAG_ACTIVITY_NEW_TASK例2
クリックして表示:FLAG_ACTIVITY_NEW_TASK例2のソースコード
「FLAG_ACTIVITY_NEW_TASK例1」のmanifestを変更し、Activity TestとSecondActivityのandroid:taskAffinityを異なるものに変更します.残りは変わらない!修正されたmanifestは次のとおりです.
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2回目にActivity Testに入り、Activity TestからSecondActivityに入ろうとすると、何の効果もなくActivity Testに留まる!つまり2回目のActivity Test-->SecondActivityはまったく発生していません!結果解析:相互にジャンプする2つのActivityのandroid:taskAffinityが異なる場合、FLAG_を追加ACTIVITY_NEW_TASKは確かにいくつかの効果を生み出しました.初めてActivityを起動すると、taskが新規作成され、そのtaskにActivityが追加されます.これはsingleTaskが生み出した効果と同じです!しかし、再びActivity TestからSecondActivityに入ろうとすると、何も起こらなかった!どうしてですか.この時点でSecondActivityインスタンスは既に存在するが、その存在するtaskのスタックトップはActivity Testである.FLAG_を個別に追加ACTIVITY_NEW_TASKは「taskでSecondActivityの上にあるActivityインスタンスを削除する」わけではないので、ジャンプは発生しません!
では、FLAGを追加します.ACTIVITY_CLEAR_TOPの後、効果を見てみましょう.
2. FLAG_ACTIVITY_CLEAR_TOPタグテスト
2.1 FLAG_ACTIVITY_CLEAR_TOP例1
クリックして表示:FLAG_ACTIVITY_CLEAR_TOPサンプル1のソースコード.
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは同じtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.結果分析:FLAG_が追加されていないこととACTIVITY_CLEAR_TOPで効果は同じ!これは、互いにジャンプする2つのActivityのandroid:taskAffinityが同じである場合、何の効果も生じないことを示しています.
次に、android:taskAffinityの違いを見てみましょう.
2.2 FLAG_ACTIVITY_CLEAR_TOP例2
クリックして表示:FLAG_ACTIVITY_CLEAR_TOPサンプル2のソースコード.
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2つのSecondActivityは同一のインスタンスである.結果分析:この時の表現はSecondActivityがsingleTaskと同じ!これは,相互にジャンプするActivityのandroid:taskAffinityが異なる場合にFLAG_を併用することを示している.ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TOPは、singleTaskと同じ効果を持つ!
総じて言えば:FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TOPの使用はandroid:taskAffinityに関連している.FLAG_を併用ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOPの場合、AでBを起動すると(01)AとBのtaskAffinityが同時に:FLAG_を追加するACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOPは何の役にも立たない.追加していない場合と同じ効果です!(02)AとBのtaskAffinityが異なる場合:FLAG_を追加ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP後は、BがsingleTaskと同じように表現!
3. FLAG_ACTIVITY_CLEAR_TASKラベルテスト
3.1 FLAG_ACTIVITY_CLEAR_TASK例1
クリックして表示:FLAG_ACTIVITY_CLEAR_TASK例1のソースコード
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは同じtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.結果分析:FLAG_が追加されていないこととACTIVITY_CLEAR_TASK時の効果は同じ!これは、互いにジャンプする2つのActivityのandroid:taskAffinityが同じである場合、何の効果も生じないことを示しています.
次に、android:taskAffinityの違いを見てみましょう.
3.2 FLAG_ACTIVITY_CLEAR_TASK例2
クリックして表示:FLAG_ACTIVITY_CLEAR_TASK例2のソースコード
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivity-->Returnキー-->Returnキーテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.(03)最初の戻りキーは,最初のActivity Testに戻る.(04)2回目の戻りキーは,1つ目のActivity Testに入る前の画面に戻る.結果解析:FLAG_を同時に使用する場合ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKの場合、Activityを起動するたびに、そのActivityのインスタンスがすでにあるtaskに存在する場合、そのtaskのすべての内容をクリアする.次にtaskを再作成し、新しいtaskにActivityを追加します.そうでなければ、新しいtaskを直接起動し、新しいtaskにActivityを追加します.
総じて言えば:FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TASKの使用はandroid:taskAffinityに関連している.FLAG_を併用ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKの場合、AでBを起動すると(01)AとBのtaskAffinityが同時に:FLAG_を追加するACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKは何の役にも立たない.追加していない場合と同じ効果です!(02)AとBのtaskAffinityが異なる場合:FLAG_を追加ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK後、Bを起動すると、そのBが既にあるtaskに存在すると、そのtaskの全ての内容がクリアされる.次にtaskを再作成し、Bを新しいtaskに追加します.そうでなければ、新しいtaskを直接起動し、Bを新しいtaskに追加します.
4. FLAG_ACTIVITY_SINGLE_TOPタグテスト
FLAG_ACTIVITY_SINGLE_TOPの特性はlaunchMode=「singleTop」と同じ!ここではあまり説明しません.
クリックして表示:FLAG_ACTIVITY_SINGLE_TOPサンプル1のソースコード.この例では、Activityの例が1つしかありません.Activityをクリックすると、それ自体にジャンプします.
クリックして表示:FLAG_ACTIVITY_SINGLE_TOPサンプル2のソースコード.この例では、2つのActivityの例があり、2つのActivityの間で相互にジャンプすることができます.
ディレクトリ1.Intentの起動モードに関するFlagの概要2. 1. FLAG_ACTIVITY_NEW_TASKタグテスト3. 2. FLAG_ACTIVITY_CLEAR_TOPタグテスト4. 3. FLAG_ACTIVITY_CLEAR_TASKタグテスト5. 4. FLAG_ACTIVITY_SINGLE_TOPタグテスト
Intent起動モードに関するFlagの概要
ここでは、起動モードに関連してよく使われるFlagのいくつかについてのみ説明します.
FLAG_ACTIVITY_NEW_TASKはGoogleの公式文書で、launchMode=「singleTask」と同じ行為をしていると紹介した.実は、全く同じではありません!FLAGを単独で使用することはめったにありません.ACTIVITY_NEW_TASK、通常FLAG_ACTIVITY_CLEAR_TASKまたはFLAG_ACTIVITY_CLEAR_TOP併用.この属性を単独で使用すると奇妙な現象を引き起こすため、通常は私たちが望んでいる効果に達しません!いずれにしても、「FLAG_ACTIVITY_NEW_TASK例1」と「FLAG_ACTIVITY_NEW_TASK例2」で単独での使用効果が示されます.
FLAG_ACTIVITY_SINGLE_TOPはGoogleの公式ドキュメントで、launchMode=「singleTop」と同じ動作をしていると紹介しています.実は、確かにそうです!FLAGを単独で使用ACTIVITY_SINGLE_TOPでは、launchMode=「singleTop」と同じ効果が得られます.
FLAG_ACTIVITY_CLEAR_TOPその名の通りFLAG_ACTIVITY_CLEAR_TOPの役割は、「Activityを含むtask」のActivityインスタンスの上にある他のActivityインスタンスをクリアします.FLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASK両方を併用することでlaunchMode=「singleTask」と同じ効果が得られます!
FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_CLEAR_TASKの役割にはActivityのtaskが含まれる.FLAG_の使用ACTIVITY_CLEAR_TASKの場合、通常はFLAG_を含むACTIVITY_NEW_TASK.Activityを起動すると、以前に存在していたActivityインスタンスが存在するtaskをクリアすることを目的としています.これにより、以前に存在したActivityインスタンスも自然にクリアされます!
注意:launchModeと上のFLAG_を同時に使用する場合ACTIVITY_NEW_TASK等ラベルの場合、FLAG_ACTIVITY_NEW_TASKが標準です.つまり、manifestのプロファイルよりもコードの優先度が高い!
以下では、いくつかの例によって、これらのタグの理解を深める.
1. FLAG_ACTIVITY_NEW_TASKラベルテスト
1.1 FLAG_ACTIVITY_NEW_TASK例1
クリックして表示:FLAG_ACTIVITY_NEW_TASK例1のソースコード
この例では、Activity:Activity TestとSecondActivityの2つがあります.manifestは次のように定義されています.
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="ActivityTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SecondActivity" />
</application>
説明:manifestから、Activity TestとSecondActivityは同じAPKにあることがわかります.これはandroid:taskAffinityが同じであることを意味します!
Activity Testのソースコード
public class ActivityTest extends Activity {
private static final String TAG="##ActivityTest##";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(TAG, "onCreate: "+this.toString()+", taskId="+this.getTaskId());
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(this.toString()+", taskId="+this.getTaskId());
}
public void onJump(View view) {
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
protected void onNewIntent(Intent intent) {
Log.d(TAG, "onNewIntent: intent="+intent+", activity="+this+", taskId="+this.getTaskId());
}
}
説明:onJump()はActivity Testのボタンのコールバック関数で、このボタンをクリックするとSecondActivityにジャンプします.なお、ジャンプのIntentにはFLAG_が追加されていますACTIVITY_NEW_TASKマーク.
SecondActivityのソースコード
public class SecondActivity extends Activity {
private static final String TAG="##SecondActivity##";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Log.d(TAG, "onCreate: "+this.toString()+", taskId="+this.getTaskId());
TextView tv = (TextView) findViewById(R.id.tv2);
tv.setText(this.toString()+", taskId="+this.getTaskId());
}
public void onBack(View view) {
Intent intent = new Intent(this, ActivityTest.class);
startActivity(intent);
}
@Override
protected void onNewIntent(Intent intent) {
Log.d(TAG, "onNewIntent: intent="+intent+", activity="+this+", taskId="+this.getTaskId());
}
}
説明:onBack()は、SecondActivityのボタンのコールバック関数です.このボタンをクリックするとActivity Testにジャンプします.
試験内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivity試験結果:(01)Activity TestとSecondActivityは同じtaskにあります.(02)2つのSecondActivityの異なるインスタンス!結果分析:FLAG_と言えばACTIVITY_NEW_TASKの役割はsingleTaskと同じ効果を持つ.では、この例は明らかです.そうしないと、この結論になります.実際、相互にジャンプする2つのActivityのandroid:taskAffinityが同じ場合、FLAG_を単独で使用するACTIVITY_NEW_TASKは何の効果もありません!
もし2つのActivityのandroid:taskAffinityが違うとしたら?この場合、どのような効果が得られますか?次に、例を挙げて効果を見てみましょう.
1.2 FLAG_ACTIVITY_NEW_TASK例2
クリックして表示:FLAG_ACTIVITY_NEW_TASK例2のソースコード
「FLAG_ACTIVITY_NEW_TASK例1」のmanifestを変更し、Activity TestとSecondActivityのandroid:taskAffinityを異なるものに変更します.残りは変わらない!修正されたmanifestは次のとおりです.
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="ActivityTest"
android:taskAffinity="com.skw.activitytest01"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SecondActivity"
android:taskAffinity="com.skw.activitytest02"
/>
</application>
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2回目にActivity Testに入り、Activity TestからSecondActivityに入ろうとすると、何の効果もなくActivity Testに留まる!つまり2回目のActivity Test-->SecondActivityはまったく発生していません!結果解析:相互にジャンプする2つのActivityのandroid:taskAffinityが異なる場合、FLAG_を追加ACTIVITY_NEW_TASKは確かにいくつかの効果を生み出しました.初めてActivityを起動すると、taskが新規作成され、そのtaskにActivityが追加されます.これはsingleTaskが生み出した効果と同じです!しかし、再びActivity TestからSecondActivityに入ろうとすると、何も起こらなかった!どうしてですか.この時点でSecondActivityインスタンスは既に存在するが、その存在するtaskのスタックトップはActivity Testである.FLAG_を個別に追加ACTIVITY_NEW_TASKは「taskでSecondActivityの上にあるActivityインスタンスを削除する」わけではないので、ジャンプは発生しません!
では、FLAGを追加します.ACTIVITY_CLEAR_TOPの後、効果を見てみましょう.
2. FLAG_ACTIVITY_CLEAR_TOPタグテスト
2.1 FLAG_ACTIVITY_CLEAR_TOP例1
クリックして表示:FLAG_ACTIVITY_CLEAR_TOPサンプル1のソースコード.
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
public void onJump(View view) {
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは同じtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.結果分析:FLAG_が追加されていないこととACTIVITY_CLEAR_TOPで効果は同じ!これは、互いにジャンプする2つのActivityのandroid:taskAffinityが同じである場合、何の効果も生じないことを示しています.
次に、android:taskAffinityの違いを見てみましょう.
2.2 FLAG_ACTIVITY_CLEAR_TOP例2
クリックして表示:FLAG_ACTIVITY_CLEAR_TOPサンプル2のソースコード.
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
public void onJump(View view) {
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2つのSecondActivityは同一のインスタンスである.結果分析:この時の表現はSecondActivityがsingleTaskと同じ!これは,相互にジャンプするActivityのandroid:taskAffinityが異なる場合にFLAG_を併用することを示している.ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TOPは、singleTaskと同じ効果を持つ!
総じて言えば:FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TOPの使用はandroid:taskAffinityに関連している.FLAG_を併用ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOPの場合、AでBを起動すると(01)AとBのtaskAffinityが同時に:FLAG_を追加するACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOPは何の役にも立たない.追加していない場合と同じ効果です!(02)AとBのtaskAffinityが異なる場合:FLAG_を追加ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TOP後は、BがsingleTaskと同じように表現!
3. FLAG_ACTIVITY_CLEAR_TASKラベルテスト
3.1 FLAG_ACTIVITY_CLEAR_TASK例1
クリックして表示:FLAG_ACTIVITY_CLEAR_TASK例1のソースコード
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
public void onJump(View view) {
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivityテスト結果:(01)Activity TestとSecondActivityは同じtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.結果分析:FLAG_が追加されていないこととACTIVITY_CLEAR_TASK時の効果は同じ!これは、互いにジャンプする2つのActivityのandroid:taskAffinityが同じである場合、何の効果も生じないことを示しています.
次に、android:taskAffinityの違いを見てみましょう.
3.2 FLAG_ACTIVITY_CLEAR_TASK例2
クリックして表示:FLAG_ACTIVITY_CLEAR_TASK例2のソースコード
「FLAG_ACTIVITY_NEW_TASK例一」のonJump()関数を変更します.変更後のコードは以下の通りです.
public void onJump(View view) {
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
テスト内容:Activity Test-->SecondActivity-->Activity Test-->SecondActivity-->Returnキー-->Returnキーテスト結果:(01)Activity TestとSecondActivityは異なるtaskにあります!(02)2つのSecondActivityは異なるインスタンスである.(03)最初の戻りキーは,最初のActivity Testに戻る.(04)2回目の戻りキーは,1つ目のActivity Testに入る前の画面に戻る.結果解析:FLAG_を同時に使用する場合ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKの場合、Activityを起動するたびに、そのActivityのインスタンスがすでにあるtaskに存在する場合、そのtaskのすべての内容をクリアする.次にtaskを再作成し、新しいtaskにActivityを追加します.そうでなければ、新しいtaskを直接起動し、新しいtaskにActivityを追加します.
総じて言えば:FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_CLEAR_TASKの使用はandroid:taskAffinityに関連している.FLAG_を併用ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKの場合、AでBを起動すると(01)AとBのtaskAffinityが同時に:FLAG_を追加するACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASKは何の役にも立たない.追加していない場合と同じ効果です!(02)AとBのtaskAffinityが異なる場合:FLAG_を追加ACTIVITY_NEW_TASK|FLAG_ACTIVITY_CLEAR_TASK後、Bを起動すると、そのBが既にあるtaskに存在すると、そのtaskの全ての内容がクリアされる.次にtaskを再作成し、Bを新しいtaskに追加します.そうでなければ、新しいtaskを直接起動し、Bを新しいtaskに追加します.
4. FLAG_ACTIVITY_SINGLE_TOPタグテスト
FLAG_ACTIVITY_SINGLE_TOPの特性はlaunchMode=「singleTop」と同じ!ここではあまり説明しません.
クリックして表示:FLAG_ACTIVITY_SINGLE_TOPサンプル1のソースコード.この例では、Activityの例が1つしかありません.Activityをクリックすると、それ自体にジャンプします.
クリックして表示:FLAG_ACTIVITY_SINGLE_TOPサンプル2のソースコード.この例では、2つのActivityの例があり、2つのActivityの間で相互にジャンプすることができます.