android:launchModeとandroid:taskAffinityの相互影響

3264 ワード

最近、WPS officeの画面分割状態で新しいTXTを作成すると、別のウィンドウに編集インタフェースが表示されるという問題があります.
分析プロセス:このような問題は、一般的に新しいインタフェースに特別なプロパティが設定されているためです.
コマンドdumpsys window|grep mFocusedWindowを使用して、新しいTXTインタフェースに対応するActivityを表示します:cn.wps.moffice_eng/cn.wps.moffice.writer.multiactivity.Writer1
WPS office apkを逆コンパイルしてAndroidManifestを表示します.xmlファイル、Writer 1対応宣言:

簡単なapp検証を自分で書くことで、launchModeとtaskAffinityのプロパティが追加されたため、2つのActivityが異なるTaskに属しているためです.
ちょうどこの機会にandroid:launchModeとandroid:taskAffinityの関係を整理します.
1.android:launchMode
Activityの起動モードは、属性値が4つあり、4つの異なる起動モードに対応しています.具体的にはActivityの4種類の起動モードを参照してください
Standard:標準モード、デフォルトモード.Activityを起動するたびに、新しいActivityインスタンスが作成され、同じActivityインスタンスがすでに存在するかどうかにかかわらず、現在のTaskにこのActivityインスタンスが追加されます(新しいTaskは作成されません).
singleTop:Taskトップ・シングル・モードで、起動するActivityがTaskのトップにある場合、新しいActivityインスタンスは作成されず、既存のActivityインスタンスを直接使用します.そうしないと、現在のTaskで新しいActivityインスタンスが作成されます.
singleTask:Task内の単一モードで、同じTaskに作成するActivityのインスタンスがすでに存在する場合は、直接多重化され、Activityインスタンスは新しく作成されません.すなわち、同一Taskにおいて、同一Activityの一例のみが存在する.3つのケースに分けられます.
(1)Taskで作成するActivityが存在しない場合はActivityのインスタンスを作成する.
(2)Taskで作成するActivityが存在し、スタックの上部にある場合はActivityのインスタンスは作成せずに直接多重化する.このときsingleTopモードと一致する
(3)Taskに作成するActivityが存在し、スタックの上部にない場合、システムはそのActivityインスタンスの上にあるすべてのActivityをTaskから移動し、ターゲットActivityがスタックの上部にあるようにする.
singleInstance:グローバル単一インスタンスモードで、ターゲットActivityをどのTaskから起動してもActivityインスタンスは1つしか作成されず、新しいTaskを使用してActivityが保存されます.
2.android:taskAffinity
Activityの帰属,すなわちActivityがどのTaskにあるべきか,ActivityとTaskの依存関係である.デフォルトでは、同じアプリケーションで起動したActivityは同じTaskにあります.
Standardモードでは、2つのActivityを設定するandroid:taskAffinityが一致せず、この2つのActivityを開いてTaskIdが同じであること、すなわち2つのActivityが同じtaskに配置されることを得る.
singleTopモードでは、2つのActivityを設定するandroid:taskAffinityが一致せず、この2つのActivityを開くと、TaskIdが同じであること、すなわち、2つのActivityが同じtaskに配置されることが得られる.
singleTaskモードでは、2つのActivityを設定するandroid:taskAffinityが一致せず、この2つのActivityを開くと、TaskIdが異なる、すなわち2つのActivityが2つのtaskに配置される.2つのActivityが2つのTaskに配置されている場合、recentキーをクリックすると、recentアプリケーションにActivity 1とActivity 2がそれぞれ表示されます.2つのActivityのandroid:taskAffinity一致(非デフォルト)を設定し、この2つのActivityを開くとTaskIdが異なる、すなわち2つのActivityが2つのtaskに配置される.2つのActivityのandroid:taskAffinity一致(デフォルト)を設定し、この2つのActivityを開いてTaskIdを得るのは同じです.
singleInstanceモードでは、2つのActivityを設定するandroid:taskAffinityが一致せず、この2つのActivityを開くと、TaskIdが異なる、すなわち2つのActivityが2つのtaskに配置される.2つのActivityが2つのTaskに配置されている場合、recentキーをクリックすると、recentアプリケーションにActivity 1とActivity 2がそれぞれ表示されます.2つのActivityのandroid:taskAffinity一致(非デフォルト)を設定し、この2つのActivityを開くとTaskIdが異なる、すなわち2つのActivityが2つのtaskに配置される.2つのActivityのandroid:taskAffinity一致(デフォルト)を設定し、この2つのActivityを開いてTaskIdを得るのは違います.
以上、簡単なコード検証が行われていますが、コードが簡単すぎて貼らない~