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);
    }

}