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

学习 android 几天时间了,发现android中,页面切换实际上是不同的activity进行切换,下面来简单记录一下activity的生命周期。

先来到官网查看API(靠着吃饭的东西,一定要有查api的习惯),拖到下面,我们可以看到一张图:

这张图很清晰的activity的执行过程,如果还是没怎么理解,下面写个例子与其分析,详细的介绍执行过程中activity调用了哪些方法。

FirstActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class FirstActivity extends Activity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      System.out.println("firstActivity call oncreate");
      Button bt = (Button) findViewById(R.id.bt);
      bt.setOnclickListener(new btOnClickListener());
      
      
  }
  
  class btOnClickListener implements OnClickListener {
          @Override
          public void onClick(DialogInterface dialog, int which) {
              // TODO Auto-generated method stub
              Intent i = new Intent();
              i.setClass(FirstActivity.this, SecondActivity.class);
              startActivity(i);
          }
      }

  @Override
  protected void onStart() {
      // TODO Auto-generated method stub
      super.onStart();
      System.out.println("firstActivity call onstart");
  }

  @Override
  protected void onRestart() {
      // TODO Auto-generated method stub
      super.onRestart();
      System.out.println("firstActivity call onrestart");
  }

  @Override
  protected void onResume() {
      // TODO Auto-generated method stub
      super.onResume();
      System.out.println("firstActivity call onresume");
  }

  @Override
  protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();
      System.out.println("firstActivity call onpause");
  }

  @Override
  protected void onStop() {
      // TODO Auto-generated method stub
      super.onStop();
      System.out.println("firstActivity call onstop");
  }

  @Override
  protected void onDestroy() {
      // TODO Auto-generated method stub
      super.onDestroy();
      System.out.println("firstActivity call ondestory");
  }
}
SecondActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
public class SecondActivity extends Activity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      // TODO Auto-generated method stub
      super.onCreate(savedInstanceState);
      System.out.println("secondActivity call oncreate");
      Button bt = (Button) findViewById(R.id.bt);
      bt.setOnclickListener(new btOnClickListener());
      
      class btOnClickListener implements OnClickListener {
          @Override
          public void onClick(DialogInterface dialog, int which) {
              // TODO Auto-generated method stub
              Intent i = new Intent();
              i.setClass(SecondActivity.this, FirstActivity.class);
              startActivity(i);
              **SecondActivity.this.finish();**
          }
      }
  }
  
  @Override
  protected void onStart() {
      // TODO Auto-generated method stub
      super.onStart();
      System.out.println("secondActivity call onstart");
  }

  @Override
  protected void onRestart() {
      // TODO Auto-generated method stub
      super.onRestart();
      System.out.println("secondActivity call onrestart");
  }

  @Override
  protected void onResume() {
      // TODO Auto-generated method stub
      super.onResume();
      System.out.println("secondActivity call onresume");
  }

  @Override
  protected void onPause() {
      // TODO Auto-generated method stub
      super.onPause();
      System.out.println("secondActivity call onpause");
  }

  @Override
  protected void onStop() {
      // TODO Auto-generated method stub
      super.onStop();
      System.out.println("secondActivity call onstop");
  }

  @Override
  protected void onDestroy() {
      // TODO Auto-generated method stub
      super.onDestroy();
      System.out.println("secondActivity call ondestory");
  }
}

上面代码非常简单,FirshActivitySecondActivity 都复写了 Activity 的一些基本方法,然后每个activity中都有个按钮(布局页面就不提供了),点击按钮后,在两个activity之间进行切换,先将启动程序设为 FirshActivity,然后运行,会看到以下输出:

SecondActivity
1
2
3
firstActivity call oncreate
firstActivity call onstart
firstActivity call onresume

接着点击按钮:

SecondActivity
1
2
3
4
5
firstActivity call onpause
secondActivity call oncreate
secondActivity call onstart
secondActivity call onresume
firstActivity call onstop

在接着在点击按钮返回FirstActivity:

SecondActivity
1
2
3
4
5
6
secondActivity call onpause
firstActivity call **onrestart**
firstActivity call onstart
firstActivity call onresume
secondActivity call onstop
**secondActivity call ondestory**

通过运行可以很清晰的知道,当一个activity运行的时候,会依次执行 onCreate –> onStart –> onresume

onCreate 是当程序运行的时候开始调用,一般用于加载布局,监听事件等
onStart 当你能看到界面的时候调用
onresume 当获得焦点后调用,即你能操作这个activity的一些控件的时候

当我们点击按钮,跳转到另外一个activity的时候,依次执行了 onPause –> onCreate –> onStart –> onResume –> onStop

onPause 注意,这里是第一个activity调用的,当调用另外一个activity时被调用,比如你在使用过程中,突然来了一个电话,这时候会调用电话这个activity,onpause 就被调用了,一般用于保存数据
onCreate 由上面可知
onStart 由上面可知
onResume 由上面可知
onStop 当一个activity被另一个activity完全遮住时,调用stop,注意是完全,如果是一个对话框,覆盖在了这个activity上面,不会被调用

当从另外一个activity返回回来时,调用了 onPause –> onRestart –> onStart –> onResume –> onStop –> onDestory

onPause 因为切换到了FirstActivity,所以当前的被暂停
onRestart 注意,回到第一个activity后,并不是重新 onCreate,而是 onRestart,因为第一个activity并没有被销毁
onStart 由上面可知
onResume 由上面可知
onStop 因为此时第一个activity完全遮挡住了第二个activity
onDestory 注意,该方法在第一个activity中没有被调用而在这里调用了,请仔细上上面代码的加粗部分,只有在你程序中调用了 finish() 方法,或资源不够用时才会被销毁,销毁之后再调用这个activity,必须重新创建。

Comments