Activity Taskの詳細
4074 ワード
hierarchyviewerを使用して、Activity、Taskの順序と構造を表示できます.
Activityには、次の4つのlaunchModeがあります.
1.standard
2.singleTop
3.singleTask
4.singleInstance
AndroidManifestでxml構成のandroid:launchMode属性は以上の4つのうちの1つでよい.
彼らの間には違いと使い方があります.私はあまり話しません.ネット上にはたくさんあります.
仮象は次のような光景です.
ユーザーはLauncherからメールリスト画面(ConversationList)を起動し、編集ボタンをクリックしてメール編集画面(ConversationEdit)に入る
LauncherがConversationListを起動するときintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).
| | ConversationEdit |
| Launcher.java | ConversationList |
————————————————————
Task1 Task2
ユーザーがConversationEditからホームをクリックしてデスクトップに戻り、再びメールショートカットをクリックすると、Task 2全体がフロントに移動します.
[疑問:
なぜロック画面がロック解除されたときにFLAGを通過したのかACTIVITY_NEW_TASKがCameraActivityを起動すると
ユーザーがLauncherの前に起動したCameraActivityのあるTaskをフロントに移動しますか?ではなく
新しいTaskマウントの新しいCameraActivityインスタンスを作成]
真相:同じContextでマルチメッセージIntentを起動するとTask 2全体がフロントに移動し、
異なるContextであれば、新しいTaskが起動します(メールのandroid:launchModeがstandardであることを前提とします)
しかし、次の現象は私の上の「真実」を完全に否定していることに気づいた.
Intent intent = new Intent("android.media.action.STILL_IMAGE_CAMERA"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
私は自分でDemoを書いてLockScreenに倣った.JAvaはCameraを起動し、彼らのDemoとLockScreenは異なるContextで
しかし、私は不思議なことに、彼らは同じCameraのインスタンスを使うことができますか?
よし、上の真実を覆さざるを得ない!
真実2:
上の[疑問]:ロックスクリーンとLauncher起動CameraのIntentが違うからです!
ロック画面:Intent intent=new Intent(「android.media.action.STILL_IMAGE_CAMERA」);
Launcher:
ロック画面がLauncherがCameraのIntentを起動するActionと同じである場合、彼らがFLAG_である場合ACTIVITY_NEW_TASK方式で起動した
では、Task(CameraAcitvityを含む)を共有します.だからLauncherでappを開いたactivityは、新しいactivityを開くのではなく、前に開いたTaskに直接入ります.
PhoneWindowManager.java:startDockOrHome();
mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
このコードはinit()メソッドにおいてmHomeIntentの初期化であり,このIntentはLauncherプログラムにジャンプして構成されたという属性のLauncher Activityであり,また2つのflagも見られる.
[java]
FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_NEW_TASKは私たちが以前Launcherがいたスタックに戻ることを保証しました.FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDは、Launcher以外の他のactivity(Launcherリストファイルではandroid:clearTaskOnLaunch=「true」という属性が表示され、後述する)がクリアされるようにスタックフラグを設定します.これにより、Launcherはもちろん独自のTaskに存在し、android:launchMode=「singleTask」という属性は新しいLauncherが起動しないことを保証します.
Launcherによって起動された他のActivityは、Launcherが存在するTaskには移動しません(後述するLauncherがactivityを起動するプロセスについて説明します).だからHomeキーを押すのはLauncherというactivityを開いて、彼が自分の単独のTaskの中で、他のactivityがstop状態に入ることを保証します.
疑惑3:android:clearTaskOnLaunch FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
私はLauncherがappを起動したときのFLAGをACTIVITY_NEW_TASKは削除して、それでは彼とメールのインターフェースは1つのTaskの中にあるべきでしょうか?でもホームを押してデスクトップに戻り、2回目に再び
メールの時、それはまだインタフェースを編集して、android:clearTaskOnLaunchは役に立たなかったですか?
android:clearTaskOnLaunch=trueのActivityが設定されています起動startを再起動すると、現在のスタックのLauncher以外のActvityがクリアされます.
================================================
デフォルトでは、同じアプリケーション内のActivityは同じ親族性を持っています.
デフォルトでは、アクティブ化された新しいactivityは、アクティブ化を担当するactivityコンポーネントと同じタスクスタックに存在します.ただし、アクティブ化を担当するIntentオブジェクトにFLAG_が含まれている場合ACTIVITY_NEW_TASKフラグは、アクティブ化された新しいactivityを格納するために新しいタスクスタックを探します.このとき、同じ親族関係のタスクスタックが既に存在する場合、システムは、このアクティブ化された新しいactivityをこのタスクスタックに直接入れる.そうでない場合、システムは新しいタスクスタックを開始します.
Activityには、次の4つのlaunchModeがあります.
1.standard
2.singleTop
3.singleTask
4.singleInstance
AndroidManifestでxml構成
彼らの間には違いと使い方があります.私はあまり話しません.ネット上にはたくさんあります.
仮象は次のような光景です.
ユーザーはLauncherからメールリスト画面(ConversationList)を起動し、編集ボタンをクリックしてメール編集画面(ConversationEdit)に入る
LauncherがConversationListを起動するときintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK).
| | ConversationEdit |
| Launcher.java | ConversationList |
————————————————————
Task1 Task2
ユーザーがConversationEditからホームをクリックしてデスクトップに戻り、再びメールショートカットをクリックすると、Task 2全体がフロントに移動します.
[疑問:
なぜロック画面がロック解除されたときにFLAGを通過したのかACTIVITY_NEW_TASKがCameraActivityを起動すると
ユーザーがLauncherの前に起動したCameraActivityのあるTaskをフロントに移動しますか?ではなく
新しいTaskマウントの新しいCameraActivityインスタンスを作成]
真相:同じContextでマルチメッセージIntentを起動するとTask 2全体がフロントに移動し、
異なるContextであれば、新しいTaskが起動します(メールのandroid:launchModeがstandardであることを前提とします)
しかし、次の現象は私の上の「真実」を完全に否定していることに気づいた.
Intent intent = new Intent("android.media.action.STILL_IMAGE_CAMERA"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
私は自分でDemoを書いてLockScreenに倣った.JAvaはCameraを起動し、彼らのDemoとLockScreenは異なるContextで
しかし、私は不思議なことに、彼らは同じCameraのインスタンスを使うことができますか?
よし、上の真実を覆さざるを得ない!
真実2:
上の[疑問]:ロックスクリーンとLauncher起動CameraのIntentが違うからです!
ロック画面:Intent intent=new Intent(「android.media.action.STILL_IMAGE_CAMERA」);
Launcher:
//Intent intent = new Intent();
// ComponentName comp = new ComponentName(
// "com.android.camera",
// "com.android.camera.Camera");
// intent.setComponent(comp);
ロック画面がLauncherがCameraのIntentを起動するActionと同じである場合、彼らがFLAG_である場合ACTIVITY_NEW_TASK方式で起動した
では、Task(CameraAcitvityを含む)を共有します.だからLauncherでappを開いたactivityは、新しいactivityを開くのではなく、前に開いたTaskに直接入ります.
PhoneWindowManager.java:startDockOrHome();
mHomeIntent = new Intent(Intent.ACTION_MAIN, null);
mHomeIntent.addCategory(Intent.CATEGORY_HOME);
mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
このコードはinit()メソッドにおいてmHomeIntentの初期化であり,このIntentはLauncherプログラムにジャンプして構成された
[java]
FLAG_ACTIVITY_NEW_TASKとFLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_NEW_TASKは私たちが以前Launcherがいたスタックに戻ることを保証しました.FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDは、Launcher以外の他のactivity(Launcherリストファイルではandroid:clearTaskOnLaunch=「true」という属性が表示され、後述する)がクリアされるようにスタックフラグを設定します.これにより、Launcherはもちろん独自のTaskに存在し、android:launchMode=「singleTask」という属性は新しいLauncherが起動しないことを保証します.
Launcherによって起動された他のActivityは、Launcherが存在するTaskには移動しません(後述するLauncherがactivityを起動するプロセスについて説明します).だからHomeキーを押すのはLauncherというactivityを開いて、彼が自分の単独のTaskの中で、他のactivityがstop状態に入ることを保証します.
疑惑3:android:clearTaskOnLaunch FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
私はLauncherがappを起動したときのFLAGをACTIVITY_NEW_TASKは削除して、それでは彼とメールのインターフェースは1つのTaskの中にあるべきでしょうか?でもホームを押してデスクトップに戻り、2回目に再び
メールの時、それはまだインタフェースを編集して、android:clearTaskOnLaunchは役に立たなかったですか?
android:clearTaskOnLaunch=trueのActivityが設定されています起動startを再起動すると、現在のスタックのLauncher以外のActvityがクリアされます.
================================================
デフォルトでは、同じアプリケーション内のActivityは同じ親族性を持っています.
デフォルトでは、アクティブ化された新しいactivityは、アクティブ化を担当するactivityコンポーネントと同じタスクスタックに存在します.ただし、アクティブ化を担当するIntentオブジェクトにFLAG_が含まれている場合ACTIVITY_NEW_TASKフラグは、アクティブ化された新しいactivityを格納するために新しいタスクスタックを探します.このとき、同じ親族関係のタスクスタックが既に存在する場合、システムは、このアクティブ化された新しいactivityをこのタスクスタックに直接入れる.そうでない場合、システムは新しいタスクスタックを開始します.