Activityの4種類の起動モードでシーンを適用
4483 ワード
一、Activityの4種類の起動モード:
(一)、基本説明
standard:
:mainfestで設定しない場合はデフォルトstandard;Standardは、新しいActivityをスタックに新しいactivityインスタンスを作成します.singleTop:
:standardに比べてスタックトップ多重化はactivityの重複作成によるリソースの消費を効果的に減らすことができるが、これは具体的な状況によって異なり、一概には言えない.singleTask:
、スタック内には1つのactivityインスタンスしかなく、スタック内にはactivityインスタンスが保存されており、他のactivityではstartというactivityがあり、Androidは直接このインスタンスの上の他のactivityインスタンスをスタックGCから蹴り出した.singleInstance :
:携帯電話のオペレーティングシステム全体に1つの例しか存在しないのがメモリの単例である.(二)、シーン設定
Activityの起動モードのアプリケーションの設定はその開発シーンと関係があり、アプリで新しいActivityを開く場合は基本的に2つのケースに分けられます.
Activity Activity
、すなわち、その起動モードはfanifestで直接構成またはデフォルトでstandardとすることができ、タスクスタックも自分で勝手に設定することができる. Activity APP Activity
、この時はまず新しいActivityを開くのが自分のアプリと同じタスクスタックに置くのか新しいtaskに置くのかを考えなければならない.したがってAndroidはIntentでより優先度の高い設定を提供する.setFlags(int flags)は、このsetFlagsでサードパーティのアプリでActivityを開くためにタスクスタックと起動モードを設定することができ、具体的な設定は自分でソースコードを見に行きます.二、Activityの4種類の起動モードのよくある使用シーン:
LauchMode
Instance
standard
mainfestで構成されていない場合はデフォルトの標準モード
singleTop
ログインページ、WXPayEntryActivity、WXEntryActivity、プッシュ通知欄
singleTask
プログラムモジュール論理エントリ:ホームフェース(FragmentのcontainerActivity)、WebViewページ、スキャンページ
singleInstance
システムLauncher、ロックスクリーンキー、着信表示などのシステム応用
1.singleTopは、通知開始のコンテンツ表示ページを受信するのに適しています.例えば、あるニュースクライアントのニュースコンテンツページは、10個のニュースプッシュを受け取ると、毎回1つのニュースコンテンツページを開くのが煩わしい.チャットの会話ウィンドウ、
2.singleTaskはプログラムエントリポイントとして適している.たとえば、ブラウザのメインインタフェースです.複数のアプリケーションからブラウザを起動しても、メインインタフェースは一度だけ起動され、残りの場合はonNewIntentを実行し、メインインタフェースの上の他のページが空になります.前に開いたページは、前のページを開くとokになり、新しいページは作成されません.
singleTask:aインタフェースショッピング、bインタフェースは注文を確認し、cインタフェースは支払いを行い、支払いが成功すればaにジャンプし、支払いがなければbに戻り、この時aを再起動すればsingleTaskに使用する.
3.singleInstanceは、プログラムから離れる必要があるページに適しています.例えば、アラームアラームは、アラームアラーム設定から分離される.singleInstanceは中間ページには使用しないでください.中間ページに使用する場合、ジャンプに問題があります.たとえば、A->B(singleInstance)->Cです.完全に終了したら、ここで起動します.まず開いているのはBです.
4.standard標準の起動モードであり、デフォルトの起動モードでもある.
三、実際に中小エピソードを応用する
最近のプロジェクトでは、起動モードによる問題が発生していますが、先に開くか、それとも退屈な顔をしているか、同僚が最初に問題の縁を考えているのか、記録をするために長い教訓を得ているのではないでしょうか.最近やっているアプリは、cpu比較lowのAndroidシステムのデバイスで走っています.しかもアプリはLAUNCHERとして起動されています.アプリの1つの機能は、直接微信にジャンプしてLauncherUIページにログインすることです.しかし、小さな問題が発生しました.
(一)、問題の再現:
起動後、アプリはlauncherとして起動し、その後、微信LauncherUIのロードページ「未登録微信」を開いて微信登録ページに移動し、戻るキー「システム戻るキー」をクリックしても、微信を終了して元のlauncherのアプリに戻ることはできません.その後、Android大法は下部のナビゲーションバーでシステムタスク「バックグラウンドに適用されているアプリケーションがある」を確認し、結果は1つもないことを示しました.これでしばらく気まずい思いをして、微信を返すことができませんでした.
(二)、問題の位置付け:
1. 【 】
:微信のログインページActivityは、返信キーKeyEvent.KEYCODE_BACK
イベント「アプリケーションをバックグラウンドに隠すだけで終了せず、デスクトップに戻る」をブロックしたため、ログインActivityは破棄されなかった.2.
は、実際に我々のAPP[launcherを実行してsystem/appの下に置く]と微信の2つの問題の原因です.(三)解決方法
私たちの期待は、微信にログインしなくても、同じ戻るキーを押しても、私たちのアプリのページに直接戻ることができます.すでにポイントから問題を解決する基本的な考え方は、ユーザーがキーを押した後、微信のActivityを殺し、私たちのアプリのページに戻ることです.具体的なコードは
//
Intent intent = new Intent();
intent.setClassName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");
context.startActivity(intent);
//
Intent intent = new Intent();
intent.setClassName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
実はコードの中でただ新しく微信を開くことを設定して新しいタスクスタックの中で、このように直ちに微信LauncherUIのページの中で戻りキーを遮断して【ただアプリケーションをバックグラウンドに隠して退出しないでデスクトップに戻ります】、このように私達のAPPは最もlauncherで、だから私達のAPPに戻りました.同様に、ナビゲーションバーで実際のタスクを表示すると、微信が表示されます.
(四)、新しい問題
追加にIntent.FLAG_ACTIVITY_NEW_TASKはその後、新しいタスクスタックを作ってアプリを開く必要があり、戻ることができない問題を解決したが、新しい問題を引き起こした.
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
1.
:インタフェースでデスクトップアプリに戻ったのを見たが、実は微信は楽屋で実行しているわけではない.この問題は実際には普遍的に存在し、開発者は基本的にユーザーに対して理性的な詐欺をしている.2. :
以前に新しいアプリを開いたのは一つのタスクスタックの中で、新しいアプリのページを開いたのと同じアプリのページでジャンプしたのはほぼ一瞬で、ユーザーはアプリの間でジャンプしたと感じず、Intentを設定した.FLAG_ACTIVITY_NEW_TASKはその後、新しいタスクスタックを作ってアプリを開く必要があり、クリックすると明らかな立ち止まりがあり【CPUが悪いほど明らかになる】ユーザー体験が明らかに悪くなった.