I.概要
簡単に言えば、Activityは視覚的なインターフェイスであり、ユーザーとの対話のためのUIコンポーネントを防ぐための画面ウィンドウを構築する役割を果たします。一般的に、アクティビティを構築するには3つのステップがあります。
- アクティビティクラスを構築する契約。
- AndroidManifest.xmlに登録します。
- レイアウトファイルを設定します(オプション)。
2.アクティビティを開始する方法
2.1、ディスプレイの起動
開始するアクティビティのクラスを明確に指定します\ color {red} {class}C L A S Sまたはパッケージ名。アクティビティクラス名\色{赤} {}クラス名パッケージ名.activityパッケージ名。A 、C 、T I V iのtはyのクラス名を、ディスプレイの起動には3つの主要な方法があります。
- 方法1:クラスジャンプ(最も一般的に使用される)
Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent);
- 方法2:パッケージ名。クラス名ジャンプ
Intent intent = new Intent(); intent.setClassName(MainActivity.this, "com.zjgsu.activitydemo.SecondActivity"); startActivity(intent);
- 方法3:ComponentNameジャンプ
Intent intent = new Intent(); intent.setComponent(new ComponentName(MainActivity.this, SecondActivity.class)); startActivity(intent);
2.2、暗黙の開始
指定されたアクション\ color {red} {action}を使用して、起動フィルターを設定しますA 、C 、T I O N或アクション和データ\色{赤} {アクション和データ}A C T I O N末端およびD A T Aの性質は、資格の活動を見つけて、それを開始します、プライバシーを開始するには2つの方法があります。
- 方法1:actionNameを渡す
Intent intent = new Intent("abcd.SecondActivity"); startActivity(intent);
- 方法2:アクションを設定する
Intent intent = new Intent(); intent.setAction("abcd.SecondActivity"); startActivity(intent);
注:自分で定義したアクティビティを暗黙的に開始する場合は、android.intent.category.DEFAULTをAndroidManifest.xmlに追加する必要があります。そうしないと、機能しません。
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="abcd.SecondActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
2.2.1。暗黙的に開始されたときに2つのアクティビティのactionNameが同じである場合はどうなりますか?
以下に示すように、2つのアクティビティを作成し、これら2つのアクティビティのactionNameを同じに設定してから、アクティビティを暗黙的に開始します。どうなりますか?
<activity android:name=".SecondActivity"
android:label="第二个界面">
<intent-filter>
<action android:name="abcd.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity android:name=".ThirdActivity"
android:label="第三个界面">
<intent-filter>
<action android:name="abcd.SecondActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
実行効果は次のとおりです。
上記のgifアニメーションからわかるように、この場合、Androidでは実行するアクティビティを選択できます。つまり、暗黙的に一致する条件に一致するアクションが複数ある場合、ユーザーが選択できる選択ボックスがポップアップ表示されます。
三、活動のライフサイクル
例として、次のアクティビティライフサイクル図を見てみましょう。
アクティビティが開始されると、onCreate()-> onStart()-> onResume()-> onPause()-> onStop()-> onDestroy()が順番に呼び出されます。onResume()が実行されると、アクティビティが操作可能になります。
3.1、単一のアクティビティライフサイクルの呼び出しシーケンス
- onCreate()は、アクティビティが作成されるときに呼び出されます
- onStart()は、アクティビティインターフェイスがユーザーに表示されるようになると呼び出されます
- onResume()は、アクティビティインターフェイスがフォーカスを取得したときに呼び出されます(インターフェイスボタンをクリックしたり、テキストボックスを入力したりできます)。
- onPause()は、アクティビティインターフェイスがフォーカスを失ったときに呼び出されます(インターフェイスボタンをクリックできない、テキストボックスに入力できないなど)。
- onStop()は、アクティビティインターフェイスがユーザーに表示されなくなったときに呼び出されます
- onDestroy()は、アクティビティが破棄されたときに呼び出されます
- onRestart()は、アクティビティが再開したときに呼び出されます
3.2、複数のアクティビティライフサイクルの呼び出しシーケンス
複数のアクティビティのライフサイクルを次の図に示します。上の図
の操作フロー:Aアクティビティを開き、ボタンをクリックしてBアクティビティを開始し、Bアクティビティの戻るボタンをクリックします。スクリーンショットを実行しているコードは次のとおりです。
第四に、アクティビティの起動モード
アクティビティの起動モードは、新しく作成されたアクティビティインスタンスが既存のアクティビティインスタンスを再利用するかどうか、および他のアクティビティインスタンスとタスクを共有するかどうかを決定します。タスクはスタック構造のオブジェクトです。タスクは、複数のアクティビティを管理し、アプリケーションを起動し、対応するタスクを作成できます。
4.1.4つの起動モード
- 標準の
デフォルトの起動モード。アクティビティがアクティブ化されるたびに(startActivity)、アクティビティインスタンスが作成され、タスクスタックに配置されます。 - singleTopがアクティビティをアクティブ化するたびに
、アクティビティインスタンスがスタックの一番上にあるかどうかを判断します。そうである場合は、作成する必要はありません。そうでない場合は、アクティビティインスタンスを作成する必要があります。 - SingleTask
アクティブ化するアクティビティがタスクスタックにすでに存在する場合は、作成する必要はありません。スタックからこのアクティビティの上にあるアクティビティインスタンスをポップするだけで済みます。この時点で、アクティビティはスタックの一番上に到達します。存在しない場合は、アクティビティを作成します。インスタンス - singleInstanceの
インスタンスは1つだけであり、このインスタンスはタスク内で独立して実行され、このタスクにはこのインスタンスのみがあり、他のアクティビティインスタンスは許可されません。
4.2、4つの開始モードコードのデモンストレーション
4.2.1、標準
最初に効果を見てみましょう
。SecondActivityでSecondActivityを再度開始すると、標準モードのstartメソッドがSecondActivityインスタンスを再度作成することがわかります。タスクスタックに2つのSecondActivityインスタンスが含まれるようにするため、戻るボタンをクリックして前のSecondActivityに戻り、戻るボタンをもう一度押してMainActivityに戻ります。
主なコードは次のとおりです。
// 启动模式是 standard,不填默认就是 standard
<activity android:name=".SecondActivity"
android:launchMode="standard"/>
// SecondActivity
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
findViewById(R.id.btn_start_self).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SecondActivity.this, SecondActivity.class));
}
});
}
}
4.2.2、singleTop
上記の例を引き続き使用して、SecondActivityの起動モードをsingleTopに変更し、効果
を確認します。この時点でSecondActivityを再度起動すると、SecondActivityインスタンスは作成されないため、今回はSecondActivityである必要があります。すでにスタックの最上位にあり、singleTop起動モードは、Activityインスタンスがスタックの最上位にあるかどうかを判別します。そうである場合は、作成する必要はありません。そうでない場合は、Activityインスタンスを作成します。
主なコードは次のとおりです。
<activity android:name=".SecondActivity"
android:launchMode="singleTop"/>
質問1:この時点でThirdActivityを作成し、MainActivityでSecondActivityを開始し、次にSecondActivityでThirdActivityを開始し、次にThirdActivityでSecondActivityを開始する場合、この時点でのタスクスタック内のActivityのインスタンスの順序は何ですか?
回答:タスクスタックのボトムアップアクティビティインスタンスシーケンスは、MainActivity–> SecondActivity–> ThirdActivity–> SecondActivityです。
4.2.3、singleTask
上記の質問の例を使用して、SecondActivityの起動モードをsingleTaskに変更するだけで、効果を確認しましょう。現時点
では、タスクスタック内のボトムアップアクティビティインスタンスの順序はMainActivity–> SecondActivityです。SingleTask起動モードのため、スタックにアクティビティインスタンスがある場合、アクティビティの上のすべてのアクティビティインスタンスがスタックからポップされます。
主なコードは次のとおりです。
<activity android:name=".SecondActivity"
android:launchMode="singleTask"/>
4.2.4、singleInstance
singleInstance起動モードはsingleTask起動モードに少し似ています。どちらもタスクスタックに同じアクティビティのインスタンスが1つしかないことを保証しますが、singleInstanceは新しいタスクを作成します。singleInstanceを示すために、各アクティビティが配置されているスタックのIDを出力する必要があります。例は、起動モードがsingleInstanceに変更されていることを除いて、上記と同じです。
印刷ログは次のとおりです
。SecondActivityが配置されているタスクスタックのTaskIdは592であり、MainActivityとThirdActivityが配置されているタスクスタックのTaskIdは591であることがわかります。これは、SecondActivityが独立したタスクスタックで実行され、このタスクスタックにはSecondActivityのActivityインスタンスが1つしかないことを意味します。TaskIdを出力する方法は次のとおりです。
Log.e("activityDemo2TAG", "ThirdActivity所在的task的id为:" + getTaskId());
5、IntentFlagを使用してアクティビティの起動方法を設定します
この知識のポイントを説明する前に、TaskとtaskAffinityの2つの概念を見てみましょう。
5.1、タスクの基本概念
- タスクはスタック構造のコンテナであり、複数のアクティビティインスタンスを配置できます。
- アプリケーションを起動すると、システムはルートアクティビティを配置するためのタスクを作成します。
- アクティビティが別のアクティビティを開始すると、2つのアクティビティはデフォルトで同じタスクに配置されます。後者は前者が配置されているタスクスタックにプッシュされます。ユーザーが戻るボタンを押すと、後者はタスクから排出されます。前者はスタックの一番上に再び表示されます。
5.2taskAffinityの基本概念
- Activityインスタンスが入力するタスクを定義します。
- アクティビティがアクティビティのtaskAffinityプロパティを表示しない場合、このプロパティはアプリケーションによって指定されたtaskAffinityと等しくなります。アプリケーションが指定しない場合、taskAffinityの値はパッケージ名と等しくなります。
5.3.IntentFlagの一般的に使用される値
IntentFlagには多くの種類がありますが、説明するために一般的に使用されるものをいくつか選択します。
5.3.1、FLAG_ACTIVITY_NEW_TASK
システムは、ターゲットアクティビティを配置するための新しいタスクを検索または作成します。検索すると、ターゲットアクティビティのtaskAffinityプロパティに従って一致します。タスクのtaskAffinityが同じであることが判明した場合、ターゲットはこのタスクに押し込まれます。検索が失敗した場合は、新しいタスクを作成し、タスクのtaskAffinity値をターゲットアクティビティのtaskAffinityに設定し、ターゲットアクティビティをこのタスクに配置します。
5.3.1.1、コードのデモンストレーション
IntentFlagを設定する方法:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
最初のケース\ color {red} {最初のケース} Di Yi Zhong状況状況:SecondActivityを開始するFLAG_ACTIVITY_NEW_TASKの方法、ただしSecondActivityはtaskAffinityプロパティを追加しない、結果を確認します。FLAG_ACTIVITY_NEW_TASKが開始しますが、タスクアクティビティは2つまたは同じであるため、結果を確認
できます。?これは、アクティビティがアクティビティのtaskAffinityプロパティを表示しない場合、このプロパティはアプリケーションによって指定されたtaskAffinityと等しいためです。アプリケーションがどちらも指定しない場合、taskAffinityの値はパッケージ名と等しくなります。つまり、現時点では、SecondActivityとMainActivityの2つのtaskAffinity値の値は両方ともパッケージ名であるため、SecondActivityはMainActivityが配置されているスタックに確実に配置されます。
2番目のケース\ color {red} {2番目のケース} 最初のジカルボン酸種の場合の状況:FLAG_ACTIVITY_NEW_TASKがSecondActivityを開始し、SecondActivityがtaskAffinityプロパティを提供する方法で:
<activity android:name=".SecondActivity"
android:taskAffinity="flag.newIntent.test"/>
効果を見てみましょう
。この時点で、SecondActivityとMainActivityが同じスタックに存在しなくなっていることがわかります。
5.3.2、FLAG_ACTIVITY_SINGLE_TOP
同じ4つの起動モードでのsingleTopは、ここでは示されません。
5.3.3、FLAG_ACTIVITY_CLEAR_TOP
ここでは、4つの起動モードでの同じsingleTaskについては説明しません。
5.3.4、FLAG_ACTIVITY_REORDER_TO_FRONT
この起動モードは、アクティビティインスタンスがすでにスタックに存在する場合、スタックの一番上に移動し、新しいアクティビティは開始されず、その上のアクティビティインスタンスは削除されないことを意味します。
5.3.4.1、コードのデモンストレーション
最初に効果を見てみましょう
。MainActivityでSecondActivityを開始し、次にSecondActivityでThirdActivityを開始し、次にFLAG_ACTIVITY_REORDER_TO_FRONTを介してThirdActivityでSecondActivityを開始します。現時点では、スタックにSecondActivityのインスタンスが既に存在するため、このインスタンスを使用します。スタックの一番上にあり、SecondActivityのすべてのインスタンスを破棄するわけではないため、現時点でのスタックの一番下からのアクティビティインスタンスの順序は、MainActivity-> ThirdActivity-> SecondActivityです。
6、まとめ
この記事では、主に、3つのディスプレイ起動と2つの暗黙的な起動を含む、アクティビティの5つの起動方法について説明します。また、シングルアクティビティとマルチアクティビティのライフサイクル、およびAndroidManifestのlunchModeとIntentを使用したアクティビティの起動モードの設定についても説明します。 .setFlag()メソッドは、アクティビティの起動モードを設定します。
次の記事では、Intentを使用してパラメーターを渡し、Bundleを使用してデータを渡し、複雑なデータを渡し、システムアクティビティを開始する方法について説明します。
詳細については、Androidの4つの主要コンポーネントのアクティビティ分析(下記)を参照してください。