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:
//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  
  •       | 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をこのタスクスタックに直接入れる.そうでない場合、システムは新しいタスクスタックを開始します.