安卓开发中activity的生命周期(2)

本篇是对《安卓开发中activity的生命周期(1)》做一些补充,主要介绍 Activitytask 的关系。

一、A Task is a stack of activitise

简单的可以理解为当一个Activity运行后会压入栈中,每次展示给用户的都是在栈顶的 Activity,之前运行的 Activity 都被压在了底下,假设有3个 Activity:

One.java
1
2
3
4
5
6
7
8
9
10
11
public class One extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      ......
      Intent i = new Intent();
      i.setClass(One.this, Two.class);
      startActivity(i);
  }
}
Two.java
1
2
3
4
5
6
7
8
9
10
11
public class One extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      ......
      Intent i = new Intent();
      i.setClass(Two.this, Three.class);
      startActivity(i);
  }
}
Three.java
1
2
3
4
5
6
7
8
public class Three extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      ......
  }
}

大家可能会发现代码有问题,上面代码主要只是体现不同Activity之间切换,不要纠结代码无法执行,相信大家写一个简单的切换应该没问题,如果写不出来,请移步至谷歌/百度

不难看出,上面的3个Activity,One 切换到 TwoTwo 切换到 Three

  • 当执行One后,会将 One 压入到 Task 中,此时 Task 中 [One]
  • 当切换到Two后,会将Two 压入到Task中,此时 Task 中 [Two, One] 注意顺序,Two在前面
  • 当切换到Three后,会将Three 压入到Task中,此时Task中 [Three, Two, One]

此时Task中有3个Activity,当用户按系统的 回退 键时,会先执行 弹栈(出栈)操作:

  • 第一次按回退后,栈中的元素变成 [Two, One],此时展示的是栈顶的Activity,即Two
  • 第一次按回退后,栈中的元素变成了 [One],此时展示的是栈顶的Activity,即One

所以,我们可以发现,切换到其他Activity时,之前的Activity并没有被销毁,而是压入到了Task中,问题又来了,那么我们该怎么去销毁Activity呢?

二、销毁Activity

如何销毁一个Activity,其实我们在上一篇 安卓开发中activity的生命周期(1)有介绍过,即我们在Activity中加入:

finish()

就能销毁当前Activity,当Activity被销毁后,在Task中又是如何操作的呢?

首先,我们稍微改一下上面的代码Two.java

Two.java
1
2
3
4
5
6
7
8
9
10
11
12
public class One extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      ......
      Intent i = new Intent();
      i.setClass(Two.this, Three.class);
      startActivity(i);
      finish(); //注意这里
  }
}

接着,我们重复上面的操作:

  • 当执行One后,会将 One 压入到 Task 中,此时 Task 中 [One]
  • 当切换到Two后,会将Two 压入到Task中,此时 Task 中 [Two, One] 注意顺序,Two在前面
  • 当切换到Three后,会将Three 压入到Task中,注意,由于我们finish()了,Two这个Activity被销毁了,将不会压入Task中,此时的Task [Three, One]

最后,我们在按回退按钮试试:

  • 第一次按回退后,注意,由于栈中只有[Three, One],当弹出一个后,栈中变成了[One],所以你会发现并没有返回Two,而是直接返回到One。

Comments