Android-Activityの起動モード
5899 ワード
Standard:標準モード
毎回新しいインスタンスが作成されます
一般ページに適用
singleTop:スタックトップ多重モード
ターゲットActivityがスタックの上部にある場合は、新規ではなく、既存のonNewIntent()メソッドを呼び出します.ターゲットActivityがスタックの上部にない場合は、新しい
チャットページに適用
singleTask:スタック内多重モード
ターゲットActivityがスタック内に存在する場合、新規ではなく、既存のonNewIntent()メソッドを呼び出します.ターゲットActivityがスタック内に存在しない場合は、新しい
適用ホーム
singleInstance:シングルインスタンスモード
ターゲットActivityが存在する場合は、新規ではなく、既存のonNewIntent()メソッドを呼び出します.ターゲットActivityが存在しない場合は、
ブラウザページに適用されるこのモードのActivityは、新しいタスクスタックにあり、そのタスクスタックはそれだけです.
ヒント:1つのsingleTopまたはsingleInstanceのActivity AでstartActivity ForResult()メソッドで別のActivity Bを起動すると、システムはActivityに直接戻ります.RESULT_もう待たないでCANCELED.
システムActivityスタック分析
shellコマンドを使用して、現在のタスクスタック情報を表示します.
adb shell dumpsys activity activities
印刷情報は次のとおりです.
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities) ……
Running activities (most recent first):
TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5} Run #7: ActivityRecord{4279d2d8 u0 com.iderzheng/.SingleTopActivity t25} TaskRecord{429e9558 #24 A=com.iderzheng U=0 sz=1} Run #6: ActivityRecord{429d5408 u0 com.iderzheng/.SingleInstanceActivity t24} TaskRecord{42b0ee20 #25 I=com.iderzheng/.SingleTaskActivity U=0 sz=5} Run #5: ActivityRecord{434c2238 u0 com.iderzheng/.StandardActivity t25} Run #4: ActivityRecord{42e9e8f8 u0 com.iderzheng/.SingleTopActivity t25} Run #3: ActivityRecord{42bffdf0 u0 com.iderzheng/.StandardActivity t25} Run #2: ActivityRecord{42a7e160 u0 com.iderzheng/.SingleTaskActivity t25} TaskRecord{4282e508 #23 A=com.iderzheng U=0 sz=2} Run #1: ActivityRecord{429655d8 u0 com.iderzheng/.StandardActivity t23} Run #0: ActivityRecord{429564e0 u0 com.iderzheng/.MainActivity t23} … … … …
印刷情報は多く、ここではACTIVITY MANAGER ACTIVITIES(dumpsys activity activities)-』Running activities(most recent first)を見るだけでよい.ここにはいくつかのTaskRecordがあり、いくつかのActivityスタックがあることを示しています.
Activityスタックのカスタマイズ
時には、製品はいくつかの比較的奇妙なページジャンプロジックを提出する可能性があります.この場合、システムが持っているタスクスタックだけでは、面倒になる可能性があります.タスクスタックをカスタマイズしてみてください(以下はテンプレート、具体的な出スタックと入スタックロジックのみで、BaseApplicationの入スタック方法で具体的な処理を行うことができます).
BaseApplicationでスタックを定義する
public class BaseApplication extends Application {
private static Stack<Activity> activityStack;
private static BaseApplication singleton;
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init() {
singleton = this;
activityStack = new Stack<>();
}
public static BaseApplication getContext() {
return singleton;
}
// Activity
public void addActivity(Activity activity) {
activityStack.add(activity);
}
// Activity
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
// Activity
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
}
BaseActivityでのインスタックとアウトスタック
public class BaseActivity extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BaseApplication.getContext().addActivity(this);
}
public void onDestroy() {
super.onDestroy();
BaseApplication.getContext().finishActivity(this);
}
}