Android入门(7):活动的启动模式

上一篇:Android入门(6):活动的生命周期

​ 在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给activity标签指定android:launchMode属性来选择启动模式。

standard

​ standard是活动默认的启动模式,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。我们在ActivityTest项目进行修改FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate: "+this.toString());
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(FirstActivity.this, FirstActivity.class);
            startActivity(intent);
        }
    });
}

我们点击button1,打印出另一个不同的实例,而且现在需要点击两次Back键才能退出程序。
Android入门(7):活动的启动模式_第1张图片

singleTop

​ 在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会创建新的活动实例。这时需要修改AndroidManifest.xml中FirstActivity的启动模式。

<activity
          android:name=".FirstActivity"
          android:label="This is FirstActivity"
          android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    intent-filter>
activity>

不过注意的是,当FirstActivity还处于返回栈中但是不是栈顶时,通过另一个活动启动FirstActivity,新的FirstActivity实例还是会被创建。

singleTask

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

singleInstance (最为复杂)

​ 指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果singleTask模式指定了不同的taskAffinity,也会启动一个新的返回栈)。这样做有什么意义呢?假设我们的程序有一个活动时允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?每个程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈。

修改AndroidManifest.xml:

<activity android:name=".SecondActivity"
          android:launchMode="singleInstance">
    <intent-filter>
        <action android:name="com.example.activitytest.ACTION_START" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.example.activitytest.MY_CATEGORY" />
    intent-filter>
activity>

修改FirstActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate: Task id is "+getTaskId());
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });
}

修改SecondActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate: Task id is "+getTaskId());
    setContentView(R.layout.second_layout);
    Button button2 = (Button) findViewById(R.id.button_2);
    button2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
            startActivity(intent);
        }
    });
}

修改ThirdActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate: Task id is "+getTaskId());
    setContentView(R.layout.third_layout);
}

其中getTaskId获取当前返回栈的id,我们依次点击button1、button2,打印输出:Android入门(7):活动的启动模式_第2张图片
然后我们点击Back键返回,发现直接从ThirdActivity直接返回到了FirstActivity,再按下Back又返回到SecondActivity,再按下Back才退出程序。这是为什么呢?其实是因为FirstActivity和ThirdActivity是存放在同一个返回栈里的。
Android入门(7):活动的启动模式_第3张图片
下一篇:Android入门(8):活动的实用小技巧

你可能感兴趣的:(Android)