Activity生命周期小知识

Activity生命周期图




onCreate()方法在Activity创建的时候调用,onStart()方法在启动时被调用,onResume()方法在onStart()方法完成后调用,onPause()方法在Activity暂停时被调用,onStop()方法在Activity停止时被调用,onRestart()方法在重新启动Activity是调用,onDestroy()方法在销毁Activity时调用。


假如在onCreate()方法中使用startActivity()时,俩个Activity的生命周期如何变化呢?(听别人说的他在面试时面试官问的问题)
首先给个代码
第一个Activity:
public class demo extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.out.println("1.onCreate()执行了");
        setContentView(R.layout.activity_demo);
        startActivity(new Intent(demo.this,nextActivity.class));
        System.out.println("startActivity()下边的语句执行了");
    }

    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("1.onStart()执行了");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("1.onResume()执行了");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("1.onPause()执行了");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("1.onStop()执行了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("1.onDestroy()执行了");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("1.onRestart()执行了");
    }
}

第二个Activity:

public class nextActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);
        System.out.println("2.onCreate()执行了");
    }
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("2.onStart()执行了");
    }

    @Override
    protected void onResume() {
        super.onResume();
        System.out.println("2.onResume()执行了");
    }

    @Override
    protected void onPause() {
        super.onPause();
        System.out.println("2.onPause()执行了");
    }

    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("2.onStop()执行了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println("2.onDestroy()执行了");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println("2.onRestart()执行了");
    }
}

运行结果:
09-23 23:03:55.801 28257-28257/com.example.administrator.demo I/System.out: 1.onCreate()执行了
09-23 23:03:56.017 28257-28257/com.example.administrator.demo I/System.out: startActivity()下边的语句执行了
09-23 23:03:56.021 28257-28257/com.example.administrator.demo I/System.out: 1.onStart()执行了
09-23 23:03:56.021 28257-28257/com.example.administrator.demo I/System.out: 1.onResume()执行了
09-23 23:03:56.041 28257-28257/com.example.administrator.demo I/System.out: 1.onPause()执行了
09-23 23:03:56.141 28257-28257/com.example.administrator.demo I/System.out: 2.onCreate()执行了
09-23 23:03:56.141 28257-28257/com.example.administrator.demo I/System.out: 2.onStart()执行了
09-23 23:03:56.141 28257-28257/com.example.administrator.demo I/System.out: 2.onResume()执行了
09-23 23:03:57.005 28257-28257/com.example.administrator.demo I/System.out: 1.onStop()执行了

由结果可以看出首先执行onCreate()执行到startActivity()时并未直接执行另一个Activity,而是沿着生命周期执行,在执行onResume()后第二个Activity才执行,当第二个Activity可见时,此时调用onStop().

每当一个新的activity被启动,那么之前的将被停止。但系统将会把它压入一个栈(“back stack”即后退栈),当一个新的activity启动,它将被 放到栈顶并获得用户焦点。后台栈遵循后进先出的栈机制。所以当用户完成当前页面并按下返回按钮时,它将被pop出栈(并销毁),之前的activity将被恢复。

点击返回键时运行结果:

09-23 23:15:14.149 28257-28257/com.example.administrator.demo I/System.out: 2.onPause()执行了
09-23 23:15:14.153 28257-28257/com.example.administrator.demo I/System.out: 1.onRestart()执行了
09-23 23:15:14.153 28257-28257/com.example.administrator.demo I/System.out: 1.onStart()执行了
09-23 23:15:14.153 28257-28257/com.example.administrator.demo I/System.out: 1.onResume()执行了
09-23 23:15:14.901 28257-28257/com.example.administrator.demo I/System.out: 2.onStop()执行了
09-23 23:15:14.901 28257-28257/com.example.administrator.demo I/System.out: 2.onDestroy()执行了

由此可以看出当切换Activity时总是在当前Activity执行onPause()后才执行切换后的Activity相关代码,在当前的Activity可见时且已获得焦点是才去执行之前Activity的onStop()操作。为何如此呢?看官方解释


官方onStop()方法
Called when the activity is no longer visible to the user, because another activity has been resumed and is covering this one. This may happen either because a new activity is being started, an existing one is being brought in front of this one, or this one is being destroyed.

Followed by either onRestart() if this activity is coming back to interact with the user, oronDestroy() if this activity is going away.


当activity不再对用户可见时调用。原因可能是它即将被销毁、或者其它activity(已有或新建的)被恢复运行并要覆盖本activity。

如果activity还会回来与用户交互,则下一个回调方法是onRestart();如果这个activity即将消失,则下一个回调方法是onDestroy()


看这句话其它activity(已有或新建的)被恢复运行并要覆盖本activity,因为上一个要求覆盖当前Activity时才会调用onStop()。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值