美文网首页
Activity的四种启动模式和应用场景?

Activity的四种启动模式和应用场景?

作者: CarlosLynn | 来源:发表于2018-06-29 21:11 被阅读36次

    简介

    通过设置ActivityManifest中的Activity的属性launchMode可以设置Activity的启动模式。

    默认情况下,使用启动模式:standard。

    同时,launchMode可以通过Intent.Flags的改变在运行时被复写,比
    如 [Intent]

    • FLAG_ACTIVITY_SINGLE_TOP
    • FLAG_ACTIVITY_NEW_TASK
    • FLAG_ACTIVITY_MULTIPLE_TASK

    四种启动模式

    standard

    默认模式:

    • 每次启动时都会创建一个新的实例

    singleTop

    栈顶模式:

    • 当启动Activity时,若该Activity位于栈顶,也就是正在前台与用户交互,那就复用这个Activity不会重新创建,该实例Activity.onNewIntent()方法会被调用.
    • 当启动Activity时,若该Activity位于没有位于栈顶则创建和默认默认模式一样重新创建一个新的实例

    singleTask

    栈内唯一模式:

    • 在启动activity时,若没有该Activity的实例存在于栈内,则会重新创建该Activity的实例.
    • 在启动activity时,若该栈内存在于该Activity的实例并且位于栈顶,则不会重新创建,而是复用该实例,并且会调用Activity.onNewIntent()方法.
    • 在启动activity时,若该栈内存在于该Activity的实例并且没有位于栈顶,那么这个Activity实例会被置为栈顶,并且移除其上面的所有Activity,并调用Activity.onNewIntent()方法

    singleInstance

    应用内栈唯一模式:
    Activity的实例会存在于单独的任务栈内

    • 在启动activity时,若该实例存在则
      其会被置为栈顶并且调用其 Activity.onNewIntent()方法.
    • 在启动activity时,若该实例不存在,则要启动一个新activity实例,并且会存在于一个单独的任务栈中

    范例代码

    核心代码

    MainActivity

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        protected Button button;
        protected Button button2;
        protected Button button3;
        protected Button button4;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_main);
            initView();
            ActionBar supportActionBar = getSupportActionBar();
            supportActionBar.setTitle(this.getClass().getSimpleName());
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ");
        }
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to StandardActivity");
                startActivity(new Intent(this, StandardActivity.class));
            } else if (view.getId() == R.id.button2) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTopActivity");
                startActivity(new Intent(this, SingleTopActivity.class));
            } else if (view.getId() == R.id.button3) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTaskActivity");
                startActivity(new Intent(this, SingleTaskActivity.class));
            } else if (view.getId() == R.id.button4) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleInstanceActivity");
                startActivity(new Intent(this, SingleInstanceActivity.class));
            }
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(MainActivity.this);
            button2 = (Button) findViewById(R.id.button2);
            button2.setOnClickListener(MainActivity.this);
            button3 = (Button) findViewById(R.id.button3);
            button3.setOnClickListener(MainActivity.this);
            button4 = (Button) findViewById(R.id.button4);
            button4.setOnClickListener(MainActivity.this);
        }
    }
    

    布局activity_main

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MainActivity中启动StandardActivity" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MainActivity中启动SingleTopActivity" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MainActivity中启动SingleTaskActivity" />
    
        <Button
            android:id="@+id/button4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="MainActivity中启动SingleInstanceActivity" />
    </LinearLayout>
    

    StandardActivity

    public class StandardActivity extends AppCompatActivity implements View.OnClickListener {
    
        protected Button button;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_standard);
            initView();
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ".concat(ILogTag.ARROW));
            ActionBar supportActionBar = getSupportActionBar();
            supportActionBar.setTitle(this.getClass().getSimpleName());
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i(TAG, this + ILogTag.ARROW + "onDestroy: ".concat(ILogTag.ARROW));
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i(TAG, this + ILogTag.ARROW + "onStop: ".concat(ILogTag.ARROW));
        }
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ":navigate to StandardActivity".concat(ILogTag.ARROW));
                startActivity(new Intent(this, StandardActivity.class));
            }
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(StandardActivity.this);
        }
    }
    

    activity_standard

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".StandardActivity">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="StandardActivity中启动StandardActivity" />
    
    </LinearLayout>
    

    StandardActivity启动模式为默认模式

    <activity
        android:name=".StandardActivity"
        android:launchMode="standard" />
    

    SingleTopActivity

    public class SingleTopActivity extends AppCompatActivity implements View.OnClickListener {
    
        protected Button button;
        protected Button button2;
        protected Button button3;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_single_top);
            initView();
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ");
            ActionBar supportActionBar = getSupportActionBar();
            supportActionBar.setTitle(this.getClass().getSimpleName());
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i(TAG, this + ILogTag.ARROW + "onStop: ");
        }
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to StandardActivity");
                startActivity(new Intent(this, StandardActivity.class));
            } else if (view.getId() == R.id.button2) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTopActivity");
                startActivity(new Intent(this, SingleTopActivity.class));
            } else if (view.getId() == R.id.button3) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to TempActivity");
                startActivity(new Intent(this, TempActivity.class));
            }
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(SingleTopActivity.this);
            button2 = (Button) findViewById(R.id.button2);
            button2.setOnClickListener(SingleTopActivity.this);
            button3 = (Button) findViewById(R.id.button3);
            button3.setOnClickListener(SingleTopActivity.this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            Log.i(TAG, this + ILogTag.ARROW + "onNewIntent: ");
        }
    }
    

    activity_single_top

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".SingleTopActivity">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleTopActivity中启动StandardActivity" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleTopActivity中启动SingleTopActivity" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleTopActivity中启动TempActivity" />
    
    </LinearLayout>
    

    SingleTaskActivity

    package com.activity.mode;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class SingleTaskActivity extends AppCompatActivity implements View.OnClickListener {
    
        protected Button button;
        protected Button button2;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_single_task);
            initView();
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ");
        }
    
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTaskActivity");
                startActivity(new Intent(this, SingleTaskActivity.class));
            } else if (view.getId() == R.id.button2) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to TempActivity");
                startActivity(new Intent(this, TempActivity.class));
            }
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(SingleTaskActivity.this);
            button2 = (Button) findViewById(R.id.button2);
            button2.setOnClickListener(SingleTaskActivity.this);
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            Log.i(TAG, this + ILogTag.ARROW + "onNewIntent: ");
        }
    }
    
    

    activity_single_task

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".SingleTaskActivity">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleTaskActivity中启动SingleTaskActivity" />
    
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleTaskActivity中启动TempActivity" />
    
    </LinearLayout>
    

    SingleInstanceActivity

    package com.activity.mode;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class SingleInstanceActivity extends AppCompatActivity implements View.OnClickListener {
        protected Button button;
        protected Button button2;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_single_instance);
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ");
            initView();
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i(TAG, this + ILogTag.ARROW + "onStop: ");
        }
    
        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            Log.i(TAG, this + ILogTag.ARROW + "onNewIntent: ");
        }
    
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(SingleInstanceActivity.this);
            button2 = (Button) findViewById(R.id.button2);
            button2.setOnClickListener(SingleInstanceActivity.this);
        }
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleInstanceActivity");
                startActivity(new Intent(this, SingleInstanceActivity.class));
            } else if (view.getId() == R.id.button2) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to TempActivity");
                startActivity(new Intent(this, TempActivity.class));
            }
        }
    }
    

    activity_single_instance

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".SingleInstanceActivity">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleInstanceActivity中启动SingleInstanceActivity" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="SingleInstanceActivity中启动TempActivity" />
    
    
    
    </LinearLayout>
    

    TempActivity

    package com.activity.mode;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class TempActivity extends AppCompatActivity implements View.OnClickListener {
    
        protected Button button;
        protected Button button2;
        protected Button button3;
        protected Button button4;
        private String TAG = this.getClass().getSimpleName();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            super.setContentView(R.layout.activity_temp);
            initView();
            Log.i(TAG, this + ILogTag.ARROW + "onCreate: ");
            ActionBar supportActionBar = getSupportActionBar();
            supportActionBar.setTitle(this.getClass().getSimpleName());
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.i(TAG, this + ILogTag.ARROW + "onStop: ");
        }
    
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.button) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to StandardActivity");
                startActivity(new Intent(this, StandardActivity.class));
            } else if (view.getId() == R.id.button2) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTopActivity");
                startActivity(new Intent(this, SingleTopActivity.class));
            } else if (view.getId() == R.id.button3) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleTaskActivity");
                startActivity(new Intent(this, SingleTaskActivity.class));
            } else if (view.getId() == R.id.button4) {
                Log.i(TAG, this + ILogTag.ARROW + ":navigate to SingleInstanceActivity");
                startActivity(new Intent(this, SingleInstanceActivity.class));
            }
        }
    
        private void initView() {
            button = (Button) findViewById(R.id.button);
            button.setOnClickListener(TempActivity.this);
            button2 = (Button) findViewById(R.id.button2);
            button2.setOnClickListener(TempActivity.this);
            button3 = (Button) findViewById(R.id.button3);
            button3.setOnClickListener(TempActivity.this);
            button4 = (Button) findViewById(R.id.button4);
            button4.setOnClickListener(TempActivity.this);
        }
    }
    
    

    activity_temp

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".TempActivity">
    
    
        <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TempActivity中启动StandardActivity" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TempActivity中启动SingleTopActivity" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TempActivity中启动SingleTaskActivity" />
    
        <Button
            android:id="@+id/button4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TempActivity中启动SingleInstanceActivity" />
    
    </LinearLayout>
    

    AndroidManifest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.activity.mode">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity
                android:name=".MainActivity"
                android:launchMode="standard">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".StandardActivity"
                android:launchMode="standard" />
            <activity
                android:name=".SingleTopActivity"
                android:launchMode="singleTop" />
            <activity android:name=".TempActivity" />
            <activity
                android:name=".SingleTaskActivity"
                android:launchMode="singleTask" />
            <activity
                android:launchMode="singleInstance"
                android:name=".SingleInstanceActivity" />
        </application>
    
    </manifest>
    

    standard模式

    操作如下:
    MainActivity->StandardActivity->StandardActivity->StandardActivity->Back->Back->Back->Back
    日志输出:

    I/MainActivity: com.activity.mode.MainActivity@ecc0b9d:navigate to StandardActivity--->
    I/StandardActivity: com.activity.mode.StandardActivity@c3d1d6e--->onCreate: --->
    I/StandardActivity: com.activity.mode.StandardActivity@c3d1d6e:navigate to StandardActivity--->
    I/StandardActivity: com.activity.mode.StandardActivity@67987d0--->onCreate: --->
    I/StandardActivity: com.activity.mode.StandardActivity@c3d1d6e--->onStop: --->
    I/StandardActivity: com.activity.mode.StandardActivity@67987d0:navigate to StandardActivity--->
    I/StandardActivity: com.activity.mode.StandardActivity@d652e30--->onCreate: --->
    I/StandardActivity: com.activity.mode.StandardActivity@67987d0--->onStop: --->
    I/StandardActivity: 
    com.activity.mode.StandardActivity@d652e30--->onStop: --->
    com.activity.mode.StandardActivity@d652e30--->onDestroy: --->
    I/StandardActivity: 
    com.activity.mode.StandardActivity@67987d0--->onStop: --->
    com.activity.mode.StandardActivity@67987d0--->onDestroy: --->
    I/StandardActivity: 
    com.activity.mode.StandardActivity@c3d1d6e--->onStop: --->
    com.activity.mode.StandardActivity@c3d1d6e--->onDestroy: --->
    
    

    示意图:


    image.png

    分析结果:
    standard模式,每次启动,都会创建一个新的实例

    使用场景:
    standard:普通activity

    singleTop模式

    操作如下:
    MainActivity->SingleTopActivity->SingleTopActivity->SingleTopActivity->TempActivity->SingleTopActivity->SingleTopActivity->Back->Back->Back->
    日志输出:

    I/MainActivity: com.activity.mode.MainActivity@231fb7b--->onCreate: 
    I/MainActivity: com.activity.mode.MainActivity@231fb7b:navigate to SingleTopActivity--->
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->onCreate: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->:navigate to SingleTopActivity
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->onNewIntent: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->:navigate to SingleTopActivity
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->onNewIntent: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->:navigate to TempActivity
    I/TempActivity: com.activity.mode.TempActivity@8e210a6--->onCreate: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->onStop: 
    I/TempActivity: com.activity.mode.TempActivity@8e210a6:navigate to SingleTopActivity--->
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@7c619bf--->onCreate: 
    I/TempActivity: com.activity.mode.TempActivity@8e210a6--->onStop: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@7c619bf--->:navigate to SingleTopActivity
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@7c619bf--->onNewIntent: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@7c619bf--->onStop: 
    I/TempActivity: com.activity.mode.TempActivity@8e210a6--->onStop: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@a9de37d--->onStop: 
    
    

    示意图:


    image.png

    分析结果:
    singleTop模式,每次启动,若栈顶存在实例就复用,并且回调onNewIntent,若没有就重新创建

    使用场景:
    singleTop:要展示推送过来的消息

    singleTask模式

    操作如下:
    MainActivity->SingleTaskActivity->SingleTaskActivity->SingleTaskActivity->TempActivity->SingleTopActivity->TempActivity->SingleTaskActivity->Back
    日志输出:

    I/MainActivity: com.activity.mode.MainActivity@ecc0b9d--->onCreate: 
    I/MainActivity: com.activity.mode.MainActivity@ecc0b9d--->:navigate to SingleTaskActivity
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->:navigate to SingleTaskActivity
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->onNewIntent: 
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->:navigate to SingleTaskActivity
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->onNewIntent: 
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->:navigate to TempActivity
    I/TempActivity: com.activity.mode.TempActivity@35cf06--->onCreate: 
    I/TempActivity: com.activity.mode.TempActivity@35cf06--->:navigate to SingleTopActivity
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@4ef3897--->onCreate: 
    I/TempActivity: com.activity.mode.TempActivity@35cf06--->onStop: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@4ef3897--->:navigate to TempActivity
    I/TempActivity: com.activity.mode.TempActivity@7504367--->onCreate: 
    I/SingleTopActivity: com.activity.mode.SingleTopActivity@4ef3897--->onStop: 
    I/TempActivity: com.activity.mode.TempActivity@7504367--->:navigate to SingleTaskActivity
    I/SingleTaskActivity: com.activity.mode.SingleTaskActivity@c4d1ccc--->onNewIntent: 
    I/TempActivity: com.activity.mode.TempActivity@7504367--->onStop: 
    
    

    示意图:


    image.png

    分析结果:
    singleTask模式,每次启动,若栈内部存在实例就复用并且置为栈顶移除其顶部所有的Activity,并且回调onNewIntent,若没有就重新创建实例

    使用场景:
    singleTask:程序入口等启动页面

    singleInstance模式

    操作如下:
    MainActivity->SingleInstanceActivity->SingleInstanceActivity->SingleInstanceActivity->TempActivity->SingleInstanceActivity->Back->Back
    日志输出:

    I/MainActivity: com.activity.mode.MainActivity@ecc0b9d--->onCreate: 
    I/MainActivity: com.activity.mode.MainActivity@ecc0b9d--->:navigate to SingleInstanceActivity
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onCreate: 
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->:navigate to SingleInstanceActivity
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onNewIntent: 
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->:navigate to SingleInstanceActivity
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onNewIntent: 
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->:navigate to TempActivity
    I/TempActivity: com.activity.mode.TempActivity@f138abf--->onCreate: 
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onStop: 
    I/TempActivity: com.activity.mode.TempActivity@f138abf--->:navigate to SingleInstanceActivity
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onNewIntent: 
    I/TempActivity: com.activity.mode.TempActivity@f138abf--->onStop: 
    I/SingleInstanceActivity: com.activity.mode.SingleInstanceActivity@72d17cd--->onStop: 
    I/TempActivity: com.activity.mode.TempActivity@f138abf--->onStop: 
    
    

    示意图:


    image.png

    分析结果:
    singleInstance模式,每次启动,若栈内部存在实例就复用并且置为栈顶并且回调onNewIntent,若没有就重新创建实例和一个单独的任务栈!!!

    使用场景:
    singleInstance:完全独立的,类似闹钟的提示

    完成代码

    MyActivityModeDemo

    相关文章

      网友评论

          本文标题:Activity的四种启动模式和应用场景?

          本文链接:https://www.haomeiwen.com/subject/esqzyftx.html