Androidの一般的な活動開始モード(LaunchMode)及び利用シナリオ

まず、なぜ必要はモードを開始します

Androidの開発では、我々はすべてのデフォルトの場合には、私たちが活動を開始した場合、システムは複数のインスタンスを作成して、タスクのスタックに一つずつを置くと同じであることを知っています。我々はリターン(裏)キーをクリックすると、これらの例のアクティビティ(最終)「最初のうち、の最後」の原則以下、スタックからタスクを削除するに回します。

ここでは、我々は、複数の活動を開始したときに問題を考えると、システムはそれがメモリリソースを消費しないで、タスクスタックに複数のインスタンスを作成しますか?この問題を解決するために、Androidは起動モードActiivtyを提供します。

標準、singleTop、singleTaskやsingleInstance:アクティビティ起動モード、4があります。

第二に、パターン分類を開始

1.標準:標準モデル

標準モードへのこの起動モードがデフォルトのモードです。私たちが活動を開始するたびに、システムは関係なく、このインスタンスが既に存在するかどうかの、対応するインスタンスを作成します。このモデルでは、スタックは、それぞれが、独自のタスクスタックを持っている、複数のインスタンスを持つことができます。スタックは、その活動が配置されて起動するにはこの活動を始めた人、そして活動が実行されます。

5777390-a8b256a1bcfadde2.png


5777390-43ce4ca031748a56.png

最初のジャンプ


5777390-b7da94fcc4fa8183.png

第二のジャンプ


5777390-eb632e19cabe624f.png

結果から分かるように、それぞれが、新しいインスタンスを再作成されます、あなたがリターンキーを選択すると、ステップバイステップになる、最後のアウトの順アクティビティは、スタックを起動します

2、singleTop:多重モードスタック

この起動モードでは、あなたが活動を開始したい場合は、スタックの最上位になっているので、この時間は、システムはそのonNewIntent()メソッドが実行される一方で、我々は意図することができ、新しいインスタンスを作成しますが、直接ページを開きません値、およびそののonCreate()によって行われ、それはいずれも変更されていないので、ONSTART()メソッドは、呼び出されることはありません。スタックのないトップが存在しない場合でも、それはまだ、再び新しいインスタンスを作成しますので、重複したページの問題があるでしょう。


5777390-51b1c2d7c195bc70.png
5777390-3b84cff5c608f2a8.png
5777390-027cc23a1a0e516a.png


5777390-cffe6c4938a00feb.png


5777390-78cdba65ee1bf262.png


以下は、プレゼンテーションでない場合は、スタックの最上位、つまり真ん中のは、単に読んショーではなく、インスタンスを再初期化するシステムを見つけるだろう、すべて独自のジャンプ後、他のページにジャンプし、することです

5777390-0de7eaf1f98d0464.png


5777390-64274e0693bda78c.png


5777390-48c0be172de527c2.png


5777390-4ee92d10543164e1.png

使用シナリオ:

这种模式应用场景的话,假如一个新闻客户端,在通知栏收到了3条推送,点击每一条推送会打开新闻的详情页,如果为默认的启动模式的话,点击一次打开一个页面,会打开三个详情页,这肯定是不合理的。如果启动模式设置为singleTop,当点击第一条推送后,新闻详情页已经处于栈顶,当我们第二条和第三条推送的时候,只需要通过Intent传入相应的内容即可,并不会重新打开新的页面,这样就可以避免重复打开页面了

3、singleTask:站内复用模式

在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,因为singleTask本身自带clearTop这种功能。并且会回调该实例的onNewIntent()方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。不设置taskAffinity属性的话,默认为应用的包名。

在复用的时候,首先会根据taskAffinity去找对应的任务栈:

1、如果不存在指定的任务栈,系统会新建对应的任务栈,并新建Activity实例压入栈中。

2、如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例

      a、如果不存在该实例,则会在该任务栈中新建Activity实例。

      b、如果存在该实例,则会直接引用,并且回调该实例的onNewIntent()方法。并且任务栈中该实例之上的Activity会被全部销毁。

使用场景:

SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。


5777390-ccf7824ed9894ac8.png

4、singleInstance:单实例模式

定義によりシングルモードの例として、一つだけのインスタンス。モデルは、フィーチャsingleTaskモードの全てを含み、その差は、別のタスクのスタックを占有し、このモードでの活動がグローバルに一意であるように、スタック多重の特性は一例では、システム全体、この特定のタスクスタックが破壊されない限り、後続の要求は、新しいアクティビティのインスタンスを作成しません。活性singleInstanceモードは、システム全体で起動ようActiviytは、インスタンスが既に存在する場合、それはこの例を再利用するために、前景にタスクをスケジュールする起動時に、単一の実施形態です。それは、再びリターンキーを選択し、さまざまなタスクの数が存在するスタック時に、別のタスクのスタックを作成し、ページのタスク・スタックの一番上にタスクスタックとディスプレイに戻ってきます、ですが、他のページページの先頭前リターンキーが表示されていないを選択します。

システムはの存在を探したときに活動パターンを開始します。

1、存在しない場合、最初のタスクは、アクティビティインスタンスの作成に続いて新しいスタックを作成することになります。

2本であり、それはこの例を参照して、コールバックonNewIntent()メソッドを指示します。

特殊なケース:タスクまたはスタックが破壊され、その後、システムが再作成されます。

使用シナリオ:

非常に多くの場合、電話ダイヤルページには、独自のアプリケーションやその他のアプリケーションのオープン呼び出しページから、限り、システムスタックインスタンスが存在するとして、それが直接呼び出されます。

ます。https://www.jianshu.com/p/72a0900cb8e1で再現

おすすめ

転載: blog.csdn.net/weixin_33836874/article/details/91244155