メインインタフェースlaunchmode=singletaskについて考える
1625 ワード
Activityの4つの起動モードについては、従来の問題であり、Activityの起動モードは、タスクスタック/コールバックスタック内のActivityの存在状態を研究することであり、この4つの起動モードはそれぞれ: standard(デフォルト)バカで、startActivity(MainActivity.class)を呼び出すたびに、完全に新しいActivityオブジェクトが作成され、スタックの を圧倒します. singleTop(ブラウザブックマーク)現在のスタックトップがすでにMainActivityであり、MainActivityがまだ起動している場合は、新しいオブジェクトは起動しません.スタックトップのActivityが1つしかないことを保証します. singleTask(appのメインインタフェースブラウザ)は、1つのタスクスタックに1つのMainActivityしかないことを保証します.もちろん、他のActivityもあります.他のActivityがそれを上書きし、再びMainActivityを起動すると、MainActivityの上にある他のすべてのActivityが殺されます. singleInstance(少ない、携帯電話のデスクトップ)は、Activityが1つのタスクスタックを独占することを保証します.他のActivityを起動した場合、他のActivityは別の新しいタスクスタックに配置されます.いくつかのタスクスタックがあっても、MainActivityには単一のオブジェクトしかありません.他のActivityのスタックが上部にない場合は、スタックを位置 に変更します.
最近のプロジェクトでこのようなバグに遭遇しました.
メインインタフェースには4つのfragmentが存在し、fragmenttabhostによってインタフェースの切り替えを行い、ユーザーは第4のインタフェース:私のインタフェースでパスワードをリセットする.リセットパスワード機能は独立してプロジェクトのライブラリエンジニアリングにカプセル化されているため、appログインを終了した後、メインインタフェースを同時に破棄することはできない.そのため、ユーザーがメインインタフェースに再ログインした後、メインインタフェースのデフォルトの第1のインタフェースではなく、第4の私のインタフェースが表示される.
このバグが発生する原因は、メインインタフェースに設定launchmode=singletaskである、1つのタスクスタックに1つのHomeActivityしか存在せず、HomeActivityが破棄されない限り、元のスタックのActivityで永遠に表示されるからである.このバグを解決するためには、重要な方法onNewIntent()を使用する必要があります.
現在のActivityの起動モードがSingleTopまたはsingleTaskである場合、このActivityを再起動すると、そのActivityが新しいオブジェクトを作成していない場合、そのonNewIntent()メソッドが呼び出され、新しいIntentを受信する
onNewIntentでfragmenttabhostのsetCurrentTab()メソッドを呼び出し、最初のデフォルトのfragmentに設定すればよい
最近のプロジェクトでこのようなバグに遭遇しました.
メインインタフェースには4つのfragmentが存在し、fragmenttabhostによってインタフェースの切り替えを行い、ユーザーは第4のインタフェース:私のインタフェースでパスワードをリセットする.リセットパスワード機能は独立してプロジェクトのライブラリエンジニアリングにカプセル化されているため、appログインを終了した後、メインインタフェースを同時に破棄することはできない.そのため、ユーザーがメインインタフェースに再ログインした後、メインインタフェースのデフォルトの第1のインタフェースではなく、第4の私のインタフェースが表示される.
このバグが発生する原因は、メインインタフェースに設定launchmode=singletaskである、1つのタスクスタックに1つのHomeActivityしか存在せず、HomeActivityが破棄されない限り、元のスタックのActivityで永遠に表示されるからである.このバグを解決するためには、重要な方法onNewIntent()を使用する必要があります.
現在のActivityの起動モードがSingleTopまたはsingleTaskである場合、このActivityを再起動すると、そのActivityが新しいオブジェクトを作成していない場合、そのonNewIntent()メソッドが呼び出され、新しいIntentを受信する
onNewIntentでfragmenttabhostのsetCurrentTab()メソッドを呼び出し、最初のデフォルトのfragmentに設定すればよい
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
tabHost.setCurrentTab(0);
}