Android基礎学習(継続更新)
7278 ワード
来週入社すると、慣れない町で、うれしくて、ドキドキします.
タスクスタックTaskは、Activityインスタンスを配置するためのコンテナで、スタックの形で盛られています(先の後に出ます).
タスクスタックの基本操作:スタックの再ソートはサポートされず、スタックの再ソートとスタックの出力操作に基づいてActivityの順序を変更するしかありません.
Taskはバックグラウンドに移動され、バックグラウンドタスクスタックとなる.Task起動はフロントに異動され、フロントタスクスタックとなる.携帯電話のページには、フロントタスクスタックのスタックトップ要素が表示されます.
Activityのデフォルトのロード方法は、すでにスタックに存在するかどうかにかかわらずnew操作を採用し、ライフサイクルはonCreateから開始します.
例えば、このときスタック1-ABCD、DはIntentを通じてAにジャンプし、スタック1-ABCDAになり、クリックしてDCBAに戻る
新しいActivityがすでにタスクスタックの上部にある場合、このActivityは再作成されず、onNewIntentメソッドがコールバックされます.新しいActivityインスタンスがすでに存在するがスタックの上部にない場合、Activityは再作成されます.
たとえば、スタック1-ABCDでは、Activity Dがスタックの上部にある場合、それ自体のActivity(D)にジャンプした場合、新しいDインスタンスは作成されません.Bにジャンプすると、Bはスタックの上部にないため、新しいBインスタンスがスタックに押し込まれ、スタック1-ABCDBになります.
適用例:プッシュポイントの中には同じActivityがあり、singleTopを使用しています.
Activityが1つのタスクスタックに存在する限り、このActivityを複数回起動してもインスタンスは再作成されず、onNewIntentメソッドがコールバックされます.このモードでは、Taskスタックには対応するActivityインスタンスが1つしかなく、通常はトップページに適用されます.
たとえば、スタック1-ABCD、DはBにジャンプし、このときスタック1-AB、CDはスタックによってポップアップされて破棄される
開いているActivityは、新しいタスクスタックに押し込まれます.強化されたsingleTaskモードです.このモードのActivityは、1つのタスクスタックに単独でのみ存在し、このタスクスタックには唯一のインスタンスしかありません.
たとえば、スタック1-ABC、CはD(singleInstance)にジャンプし、スタック1-ABC、スタック2-D. DはDにジャンプし、スタック2は新しいDを押し込まない. DがCにジャンプすると、Cに対応するlaunchmodeに従ってスタック1で対応する動作が行われ、2つの場合がある.
①CがStandardの場合、DはCにジャンプし、スタック1-ABCCをクリックして戻り、まだC、スタック1-ABCで、Dに戻りません.
②CがsingleTaskの場合、既にCインスタンスが存在する場合、このインスタンスにリクエストが送信されますが、onCreateメソッドは呼び出されず、onNewIntentメソッドが呼び出されます.
アニメーション展示ツールは、各flagの役割を認識するのに役立ちますhttps://github.com/rome753/ActivityTaskView
このflagは、新しいアクティビティが開始される前に、新しいアクティビティに関連するタスクが空になります.つまり、新しい活動は新しい任務の根となり、古い活動はすべて終了した.本flagはFLAGのみACTIVITY_NEW_TASK併用.
(新しいActivityが起動する前に、その存在するTaskをクリア)
新しいActivityが現在のTaskにある場合、新しいActivityの上にあるActivityは破棄され、新しいActivityは再インスタンス化されずnew intentのみが受信されます.
Activityがスタックトップにある場合:起動モードが「multiple」(デフォルト)であり、FLAG_が追加されていない場合ACTIVITY_SINGLE_TOPでは、アクティビティが破棄されて再作成されます.起動モードが他の場合、またはFLAG_が追加された場合ACTIVITY_SINGLE_TOPでは、アクティブなonNewIntent()のみが呼び出されます.
FLAGとACTIVITY_NEW_TASKは、タスクのルートアクティビティを開始するために使用される場合、タスクを前に移動し、root状態にクリアします.これは、notification managerからアクティビティを開始するなど、特に役立ちます.
廃棄されました.API 21後用FLAG_ACTIVITY_NEW_DOCUMENT.
新しいタスクを作成し、アクティビティを開始して挿入します.
いつもFLAGとACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKと一緒に使う.
単独用FLAG_ACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKでは、既存のタスクの中で一致するIntentを探して、見つからないと新しいタスクを作成します.
このflagを使用すると、一致するIntentが見つからず、新しいタスクが無条件に作成されます.
FLAGを使ったACTIVITY_NEW_TASKは、アプリケーションのlauncherを起動しない限り、本flagを使用しないでください.FLAGとACTIVITY_NEW_TASKは、既存のタスクを前に移動することを防止し、既存のタスクに新しいアクティビティがあるかどうかにかかわらず、新しいアクティビティに新しいタスクを作成します.
デフォルトのアンドロイドシステムでは、可視化されたタスク管理が提供されていないため、ユーザーに他のタスクに戻る方法を提供しない限り、本flagを使用するべきではありません.
FLAGを使用せずに本flagを単独で使用ACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKは無効です.
このflagは、起動したアクティビティに新しいタスクレコードを開きます.このflagまたはdocumentLaunchModeプロパティを使用すると、同じアクティビティのマルチインスタンスが最近のタスクリストに異なるレコードを生成します.
このflagを使用すると、documentLaunchModeプロパティを使用するよりも、documentLaunchModeプロパティがアクティブにバインドされ、flagは必要に応じてのみ追加されます.
このflagのデフォルトの語義に注意してください.アクティビティが破棄された後、最近のタスクリストのエントリは削除されません.これはFLAGの使用と同じです.ACTIVITY_NEW_TASKは異なり、後者のアクティビティが破棄されるとすぐに入口が除去されます.FLAGを使えますACTIVITY_RETAIN_IN_RECENTSはこの挙動を変えた.
本flagはFLAG_とACTIVITY_MULTIPLE_TASK併用.単独で使用する場合は、manifestアクティビティでdocumentLaunchMode="intoExisting"を定義するのと同じ効果で、併用する場合はmanifestアクティビティでdocumentLaunchMode="always"を定義するのと同じ効果です.
新しいアクティビティは、ヒストリスタック内の新しいタスク(アクティビティのセット)の開始になります.
通常、「launcher」動作を持つアクティビティで使用されます.ユーザーは、以前のアクティビティとは完全に独立した一連のことを完了させます.
新しいアクティビティがすでに実行されているタスクに存在する場合は、開始されず、画面の一番前に移動します.
新しいアクティビティがresultに戻って自分のアクティビティを起動する場合は、このflagは使用できません.
適用例:サービスでActivityを起動します.AppがシステムLauncherの場合、微信が終了できない場合にジャンプします.
このflagでは、アクティブな現在のステータスから別のステータスへの移行アニメーションの表示がブロックされます.これは、アニメーションが永遠に存在しないことを意味するものではありません.別のアクティビティの変更が、現在表示されているアクティビティが開始される前に発生し、本flagが使用されていない場合、アニメーションはまた表示されます.一連のアクティブな操作を行う場合は、ユーザーが見たアニメーションは最初の変更で駆動されるのではなく、次の操作で駆動されます.
新しいアクティビティは履歴スタックには保持されません.ユーザーが他のページに切り替えると、新しいアクティビティはすぐに破棄されます.
古いアクティビティのonActivity Result()メソッドはトリガーされません.
新しいアクティビティがタスクにすでに存在する場合、このflagで起動すると、タスクの履歴スタックの前に移動します.
FLAG_を使ったらACTIVITY__CLEAR__TOP,本flagは無効です._
デフォルトではFLAG_ACTIVITY_NEW_DOCUMENTが作成した新しいレコードは、ユーザーが閉じたときに(戻るキーを押すか、他の方法で終了する)最近のタスクのエントリから削除されます.入り口を残したいなら、本flagを使います.
受信アクティビティはautoRemoveFromReentsプロパティまたはActivityを呼び出すことができる.finishAndRemoveTask()は、このリクエストを上書きします.
新しいアクティビティが履歴スタックの先頭に存在する場合、再起動されません.
(現在のアクティビティがソースアクティビティによって開始される)このintentが現在のアクティビティから新しいアクティビティを開始すると、ソースアクティビティの受信ターゲットが現在のアクティビティから新しいアクティビティに移行します.新しいアクティビティ呼び出しsetResultのデータはソースアクティビティに転送されます.
このintentが現在のアクティビティから新しいアクティビティを開始すると、現在のアクティビティは、トップアクティビティに送信するか、新しいアクティビティを開始するかを決定するかにかかわらず、トップアクティビティと見なされません.新しいアクティビティは、現在のアクティビティがすぐに破棄されたと仮定して、トップアクティビティとして使用されます.
最近起動したアクティビティのリストには、新しいアクティビティは保存されません.
AndroidManifestに相当する属性はandroid:excludeFromReents="true"
このflagは一般的にアプリケーションコードで設定されていません.singleTaskモードの場合、システムが設定します.
新しいアクティビティは、新しいタスクで開始されるか、既存のタスクの先頭に配置されると、タスクの前門として起動されます.これにより、任意の相関アクティビティが適切な状態でこのタスク(アクティビティを移動しても移動しても)、必要に応じてタスクを初期状態に簡単にリセットする必要があります.
このflagは一般的にアプリケーションコードによって設定されず、アクティビティが履歴スタックから起動(homeキーを長く押す)するとシステムが設定します.
このflagは、現在最も前のアクティビティのonUserLeaveHintコールバックを阻止し、新しく開始されたアクティビティによってpaused状態になった場合に停止します.
通常、1つのアクティビティは、ユーザの操作を受けて前から移動すると、上記のコールバックを呼び出す.このコールバックは、アクティブなライフサイクルの1つのポイントを示します.このポイントアクティビティでは、ユーザーが見るまで表示したい「点滅するLEDランプ」などのものが隠されます.
着信や目覚まし時計などの非ユーザ駆動イベントによってアクティビティが開始された場合は、startActivityにこのflagを追加して、一時停止時にアクティビティがユーザーが通知を見ていないことを知っていることを保証します.
このflagは、現在のホームページのアクティブなタスク(存在する場合)の先頭に新しい起動タスクを配置します.つまり、タスクで戻るキーを押すと、前のユーザーが見たアクティビティがホームページでなくても、常にホームページに戻ります.本flagはFLAGのみACTIVITY_NEW_TASK併用.
本flagは、スクリーン分割マルチウィンドウモードでのみ使用します.新しいアクティビティが古いアクティビティの横に表示されます.本flagはFLAGとしか付き合えないACTIVITY_NEW_TASK併用.既存のアクティビティの新しいインスタンスを作成する場合は、FLAG_を設定します.ACTIVITY_MULTIPLE_TASK.
一、Activity起動モード
タスクスタックTaskは、Activityインスタンスを配置するためのコンテナで、スタックの形で盛られています(先の後に出ます).
タスクスタックの基本操作:スタックの再ソートはサポートされず、スタックの再ソートとスタックの出力操作に基づいてActivityの順序を変更するしかありません.
Taskはバックグラウンドに移動され、バックグラウンドタスクスタックとなる.Task起動はフロントに異動され、フロントタスクスタックとなる.携帯電話のページには、フロントタスクスタックのスタックトップ要素が表示されます.
1、standard(標準モード)
Activityのデフォルトのロード方法は、すでにスタックに存在するかどうかにかかわらずnew操作を採用し、ライフサイクルはonCreateから開始します.
例えば、このときスタック1-ABCD、DはIntentを通じてAにジャンプし、スタック1-ABCDAになり、クリックしてDCBAに戻る
2、singleTop(スタックトップ多重モード)
新しいActivityがすでにタスクスタックの上部にある場合、このActivityは再作成されず、onNewIntentメソッドがコールバックされます.新しいActivityインスタンスがすでに存在するがスタックの上部にない場合、Activityは再作成されます.
たとえば、スタック1-ABCDでは、Activity Dがスタックの上部にある場合、それ自体のActivity(D)にジャンプした場合、新しいDインスタンスは作成されません.Bにジャンプすると、Bはスタックの上部にないため、新しいBインスタンスがスタックに押し込まれ、スタック1-ABCDBになります.
適用例:プッシュポイントの中には同じActivityがあり、singleTopを使用しています.
3、singleTask(スタック内多重モード)
Activityが1つのタスクスタックに存在する限り、このActivityを複数回起動してもインスタンスは再作成されず、onNewIntentメソッドがコールバックされます.このモードでは、Taskスタックには対応するActivityインスタンスが1つしかなく、通常はトップページに適用されます.
たとえば、スタック1-ABCD、DはBにジャンプし、このときスタック1-AB、CDはスタックによってポップアップされて破棄される
4、singleInstance(単一インスタンスモード)
開いているActivityは、新しいタスクスタックに押し込まれます.強化されたsingleTaskモードです.このモードのActivityは、1つのタスクスタックに単独でのみ存在し、このタスクスタックには唯一のインスタンスしかありません.
たとえば、スタック1-ABC、CはD(singleInstance)にジャンプし、スタック1-ABC、スタック2-D.
①CがStandardの場合、DはCにジャンプし、スタック1-ABCCをクリックして戻り、まだC、スタック1-ABCで、Dに戻りません.
②CがsingleTaskの場合、既にCインスタンスが存在する場合、このインスタンスにリクエストが送信されますが、onCreateメソッドは呼び出されず、onNewIntentメソッドが呼び出されます.
二、Activityを起動したIntentにflagを追加する
Intent.addFlags(int flags)
アニメーション展示ツールは、各flagの役割を認識するのに役立ちますhttps://github.com/rome753/ActivityTaskView
1. FLAG_ACTIVITY_CLEAR_TASK:
このflagは、新しいアクティビティが開始される前に、新しいアクティビティに関連するタスクが空になります.つまり、新しい活動は新しい任務の根となり、古い活動はすべて終了した.本flagはFLAGのみACTIVITY_NEW_TASK併用.
(新しいActivityが起動する前に、その存在するTaskをクリア)
2. FLAG_ACTIVITY_CLEAR_TOP(singleTask相当)
新しいActivityが現在のTaskにある場合、新しいActivityの上にあるActivityは破棄され、新しいActivityは再インスタンス化されずnew intentのみが受信されます.
Activityがスタックトップにある場合:起動モードが「multiple」(デフォルト)であり、FLAG_が追加されていない場合ACTIVITY_SINGLE_TOPでは、アクティビティが破棄されて再作成されます.起動モードが他の場合、またはFLAG_が追加された場合ACTIVITY_SINGLE_TOPでは、アクティブなonNewIntent()のみが呼び出されます.
FLAGとACTIVITY_NEW_TASKは、タスクのルートアクティビティを開始するために使用される場合、タスクを前に移動し、root状態にクリアします.これは、notification managerからアクティビティを開始するなど、特に役立ちます.
3. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
廃棄されました.API 21後用FLAG_ACTIVITY_NEW_DOCUMENT.
4. FLAG_ACTIVITY_MULTIPLE_TASK
新しいタスクを作成し、アクティビティを開始して挿入します.
いつもFLAGとACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKと一緒に使う.
単独用FLAG_ACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKでは、既存のタスクの中で一致するIntentを探して、見つからないと新しいタスクを作成します.
このflagを使用すると、一致するIntentが見つからず、新しいタスクが無条件に作成されます.
FLAGを使ったACTIVITY_NEW_TASKは、アプリケーションのlauncherを起動しない限り、本flagを使用しないでください.FLAGとACTIVITY_NEW_TASKは、既存のタスクを前に移動することを防止し、既存のタスクに新しいアクティビティがあるかどうかにかかわらず、新しいアクティビティに新しいタスクを作成します.
デフォルトのアンドロイドシステムでは、可視化されたタスク管理が提供されていないため、ユーザーに他のタスクに戻る方法を提供しない限り、本flagを使用するべきではありません.
FLAGを使用せずに本flagを単独で使用ACTIVITY_NEW_DOCUMENTまたはFLAG_ACTIVITY_NEW_TASKは無効です.
5. FLAG_ACTIVITY_NEW_DOCUMENT
このflagは、起動したアクティビティに新しいタスクレコードを開きます.このflagまたはdocumentLaunchModeプロパティを使用すると、同じアクティビティのマルチインスタンスが最近のタスクリストに異なるレコードを生成します.
このflagを使用すると、documentLaunchModeプロパティを使用するよりも、documentLaunchModeプロパティがアクティブにバインドされ、flagは必要に応じてのみ追加されます.
このflagのデフォルトの語義に注意してください.アクティビティが破棄された後、最近のタスクリストのエントリは削除されません.これはFLAGの使用と同じです.ACTIVITY_NEW_TASKは異なり、後者のアクティビティが破棄されるとすぐに入口が除去されます.FLAGを使えますACTIVITY_RETAIN_IN_RECENTSはこの挙動を変えた.
本flagはFLAG_とACTIVITY_MULTIPLE_TASK併用.単独で使用する場合は、manifestアクティビティでdocumentLaunchMode="intoExisting"を定義するのと同じ効果で、併用する場合はmanifestアクティビティでdocumentLaunchMode="always"を定義するのと同じ効果です.
6. FLAG_ACTIVITY_NEW_TASK
新しいアクティビティは、ヒストリスタック内の新しいタスク(アクティビティのセット)の開始になります.
通常、「launcher」動作を持つアクティビティで使用されます.ユーザーは、以前のアクティビティとは完全に独立した一連のことを完了させます.
新しいアクティビティがすでに実行されているタスクに存在する場合は、開始されず、画面の一番前に移動します.
新しいアクティビティがresultに戻って自分のアクティビティを起動する場合は、このflagは使用できません.
適用例:サービスでActivityを起動します.AppがシステムLauncherの場合、微信が終了できない場合にジャンプします.
7. FLAG_ACTIVITY_NO_ANIMATION
このflagでは、アクティブな現在のステータスから別のステータスへの移行アニメーションの表示がブロックされます.これは、アニメーションが永遠に存在しないことを意味するものではありません.別のアクティビティの変更が、現在表示されているアクティビティが開始される前に発生し、本flagが使用されていない場合、アニメーションはまた表示されます.一連のアクティブな操作を行う場合は、ユーザーが見たアニメーションは最初の変更で駆動されるのではなく、次の操作で駆動されます.
8. FLAG_ACTIVITY_NO_HISTORY
新しいアクティビティは履歴スタックには保持されません.ユーザーが他のページに切り替えると、新しいアクティビティはすぐに破棄されます.
古いアクティビティのonActivity Result()メソッドはトリガーされません.
9. FLAG_ACTIVITY_REORDER_TO_FRONT
新しいアクティビティがタスクにすでに存在する場合、このflagで起動すると、タスクの履歴スタックの前に移動します.
FLAG_を使ったらACTIVITY__CLEAR__TOP,本flagは無効です._
10. FLAG_ACTIVITY_RETAIN_IN_RECENTS
デフォルトではFLAG_ACTIVITY_NEW_DOCUMENTが作成した新しいレコードは、ユーザーが閉じたときに(戻るキーを押すか、他の方法で終了する)最近のタスクのエントリから削除されます.入り口を残したいなら、本flagを使います.
受信アクティビティはautoRemoveFromReentsプロパティまたはActivityを呼び出すことができる.finishAndRemoveTask()は、このリクエストを上書きします.
11. FLAG_ACTIVITY_SINGLE_TOP(singleTop相当)
新しいアクティビティが履歴スタックの先頭に存在する場合、再起動されません.
12. FLAG_ACTIVITY_FORWARD_RESULT
(現在のアクティビティがソースアクティビティによって開始される)このintentが現在のアクティビティから新しいアクティビティを開始すると、ソースアクティビティの受信ターゲットが現在のアクティビティから新しいアクティビティに移行します.新しいアクティビティ呼び出しsetResultのデータはソースアクティビティに転送されます.
13. FLAG_ACTIVITY_PREVIOUS_IS_TOP
このintentが現在のアクティビティから新しいアクティビティを開始すると、現在のアクティビティは、トップアクティビティに送信するか、新しいアクティビティを開始するかを決定するかにかかわらず、トップアクティビティと見なされません.新しいアクティビティは、現在のアクティビティがすぐに破棄されたと仮定して、トップアクティビティとして使用されます.
14. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
最近起動したアクティビティのリストには、新しいアクティビティは保存されません.
AndroidManifestに相当する属性はandroid:excludeFromReents="true"
15. FLAG_ACTIVITY_BROUGHT_TO_FRONT
このflagは一般的にアプリケーションコードで設定されていません.singleTaskモードの場合、システムが設定します.
16. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
新しいアクティビティは、新しいタスクで開始されるか、既存のタスクの先頭に配置されると、タスクの前門として起動されます.これにより、任意の相関アクティビティが適切な状態でこのタスク(アクティビティを移動しても移動しても)、必要に応じてタスクを初期状態に簡単にリセットする必要があります.
17. FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
このflagは一般的にアプリケーションコードによって設定されず、アクティビティが履歴スタックから起動(homeキーを長く押す)するとシステムが設定します.
18. FLAG_ACTIVITY_NO_USER_ACTION
このflagは、現在最も前のアクティビティのonUserLeaveHintコールバックを阻止し、新しく開始されたアクティビティによってpaused状態になった場合に停止します.
通常、1つのアクティビティは、ユーザの操作を受けて前から移動すると、上記のコールバックを呼び出す.このコールバックは、アクティブなライフサイクルの1つのポイントを示します.このポイントアクティビティでは、ユーザーが見るまで表示したい「点滅するLEDランプ」などのものが隠されます.
着信や目覚まし時計などの非ユーザ駆動イベントによってアクティビティが開始された場合は、startActivityにこのflagを追加して、一時停止時にアクティビティがユーザーが通知を見ていないことを知っていることを保証します.
19. FLAG_ACTIVITY_TASK_ON_HOME
このflagは、現在のホームページのアクティブなタスク(存在する場合)の先頭に新しい起動タスクを配置します.つまり、タスクで戻るキーを押すと、前のユーザーが見たアクティビティがホームページでなくても、常にホームページに戻ります.本flagはFLAGのみACTIVITY_NEW_TASK併用.
20. FLAG_ACTIVITY_LAUNCH_ADJACENT
本flagは、スクリーン分割マルチウィンドウモードでのみ使用します.新しいアクティビティが古いアクティビティの横に表示されます.本flagはFLAGとしか付き合えないACTIVITY_NEW_TASK併用.既存のアクティビティの新しいインスタンスを作成する場合は、FLAG_を設定します.ACTIVITY_MULTIPLE_TASK.