安卓活动启动共有4种模式,分别是standard,singleTask,singleTop和singleInstance.下面分别介绍一下这四种启动模式。

standard

standard是活动的默认模式,在不进行显示指定的情况下,所有创建的活动回自动使用该模式。这个模式就是,当你启动一个活动的时候,该活动就会在返回栈中入栈,并且处于栈顶。当用户使用返回时,系统会自动显示栈顶的活动。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("this is first activity",this.toString());
        Button button1=(Button)findViewById(R.id.first);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

运行截图:

android活动启动连接错误 安卓启动活动_ide


由运行截图可以看出,点击一次按钮就会创建新的MainActivity。图中建立了两个MainActivity,所以当你想要返回,必须点三次返回键才能退出。这听上去非常麻烦,这个就是standard模式的一个特点。

运行过程:

android活动启动连接错误 安卓启动活动_android活动启动连接错误_02


standard模式每次启动都会创建该活动的一个新的实例

singleTop

有时候我们希望返回的时候已经处于栈顶活动不需要创建新的实例。这个时候就可以考虑singeleTop。在启动活动的时候如果发现返回栈顶已经是该活动,则直接使用。我们代码试验一下。
在AndroidMainfest.xml中先修改活动的启动该模式:

<activity>
            android:name=".MainActivity"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

SecondAcitivity代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("This is SecondActivity.",this.toString());
        setContentView(R.layout.activity_second);
        Button button=(Button)findViewById(R.id.secondActivity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SecondActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }
}

MainActivity代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("this is first activity",this.toString());
        Button button1=(Button)findViewById(R.id.first);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }
@Override
    protected void onRestart() {
        super.onRestart();
        Log.d("first activity restart",this.toString());
    }

运行截图:

android活动启动连接错误 安卓启动活动_ide_03


运行过程:

android活动启动连接错误 安卓启动活动_启动模式_04


可以看出,当跳转到secondActivity后再点击按钮又是MainActivity,但是此时的MainActivity还是新的实例。

但是如果是已经在栈顶就不会是新实例。singleTop可以解决重复创建栈顶活动,但是没办法解决创建多个活动实例。

singleTask

当活动的启动模式指定为singleTask,每次启动该活动,系统首先会在栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的实例。
修改启动模式:

<activity>
            android:name=".MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

MainActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("this is first activity",this.toString());
        Button button1=(Button)findViewById(R.id.first);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("first activity restart",this.toString());
    }

SecondActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("This is SecondActivity.",this.toString());
        setContentView(R.layout.activity_second);
        Button button=(Button)findViewById(R.id.secondActivity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SecondActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }
@Override
  protected void onDestroy() {
        super.onDestroy();
        Log.d("SecondActivity.destroy",this.toString());
    }

运行截图:

android活动启动连接错误 安卓启动活动_ide_05


由运行截图可以看出,当secondActivity跳转到MainActivity时,这个时候栈顶是SecondActivity,但是执行了destroy方法。

运行过程:

android活动启动连接错误 安卓启动活动_android活动启动连接错误_06


这个时候如果按返回键的话,MainActivity出栈,直接退出程序。

singleTask

singleTask模式是启用新的返回栈来管理活动。如果我们程序中有一个活动能够被其他程序调用,实现多个程序共用一个活动,那么这种场景其他三种模式就没有办法实现。这个时候就要使用singleTask。以下实例说明。

<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="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:launchMode="singleInstance" />
        <activity android:name=".ThirdActivity"></activity>
    </application>

MainActivity和上面相同
SeconActivity代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("This is SecondActivity.",this.toString());
        setContentView(R.layout.activity_second);
        Button button=(Button)findViewById(R.id.secondActivity);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("SecondActivity.destroy",this.toString());
    }

ThirdActivity代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        Log.d("This is ThirdActivity.",this.toString());
    }

运行截图:

android活动启动连接错误 安卓启动活动_ide_07


由上图可以看出,第三个活动返回后直接restart活动一,而不是SecondActivity,为什么呢。看以下的运行原理图。

运行过程:

android活动启动连接错误 安卓启动活动_android_08


当第三个活动返回的时候,第二个活动直接进入到新的返回栈,原先的返回栈只有第一个和第三个活动,所以返回直接是第一个活动。当MainActivity返回的时候,就会到新的返回栈,此时SecondAcitivity在栈顶。就显示活动二。

以上是自我学习活动的启动模式的一点归纳总结。