快速理解 activity生命周期

本文详细解析了Android中Activity的生命周期,包括启动、暂停、停止及销毁等各个阶段的状态转换过程,并探讨了不同用户交互如何影响这些状态。此外,还介绍了状态保存与恢复机制,帮助开发者更好地理解和管理Activity的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

activity生命周期



启动一个activity 的时候 

onCreate --->onStart --> onResume 此时activity在界面上可以看到

用intent启动另一个activity 

onPause-->new_onCreate-->new_onStart -->new_onResume -->onStop

可见 当另一个activity启动还没有覆盖掉之前的activity的时候 之前的activity先停止 调用 onPause 

等第二个activity启动起来了 之前的activity 才onStorp


注意:触发onPause的 一定是另一个activity启动了。。而不是 这个activity失去焦点

比如 弹出一个Dialog()是不会触发onPause()的。。



这个时候 分n种情况

1.按下back键  back键就等于finish()方法 会销调用onDestory

new_onPause --> onRestart -->onStart --> onResume --> new_onStop --new_onDestory

所以只要按下back按键就会onDestory

此时 两种情况 

1-1) 按下back键 回到桌面上了 

onPause-->onStop --> onDestory

1-2) 按下home键 回到桌面上了 但是 应用并没有被销毁

onPause -->onStop

这个时候 两种情况  

1-2-1) 在打开那个activity 

onRestart --> onStart -->  onResume

1-2-2) 这个时候把按住home键 找到最近使用过的应用  关掉后台应用

onDestory

2.按下home键 回到桌面上 但是应用没有被销毁

new_onPause-->new_onStop

2-1 如果是模拟器的话 在ddms中左边的device选中相应的程序 然后按下上面红色的stop 杀死这个进程

什么都不会执行  只是回到桌面

这个时候 按下home键 或者重新打开那个应用 

onCreate --> onStart --> onResume 

这个时候注意了。如果使用的是系统默认的堆栈方式 打开的界面不一定是首界面 

肯定是 刚才杀死进程时候现实的界面

3.按下一个按钮 intent 跳转到之前的activity中

new_onPause -->onCreate-->onStart --> onResume --new_onStop

4.按下一个按钮 弹出一个dialog

什么也不做。。不会出发到onPause 更不会出发onStop

5.按下一个按钮 弹出一个activity 但是 只覆盖界面的一部分 剩下的部分可以看到 

但是去焦点了(被覆盖肯定市区焦点 但是失去焦点 不一定 出发onPause) 

onPause() 

可见 只有在activity全部被覆盖了。才出发onStop

此时 按下 back键。。执行

onResume()

简单的可以记住 :跳转activity都是先把自己onPause 在进行其他的  最后在执行自己的onStop

android 状态保存和恢复机制


onSaveInstanceState

用于意外关闭程序的时候 才会调用 。

调用的情况 有:

    (1)、当用户按下HOME键时。

  这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,因此系统会调用onSaveInstanceState(),让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则

        onSaveInstanceState-->onPause-->onStop

  (2)、长按HOME键,选择运行其他的程序时。

   onSaveInstanceState-->onPause-->onStop

  (3)、按下电源按键(关闭屏幕显示)时。

 

  (4)、从activity A中启动一个新的activity时。

  onSaveInstanceState-->onPause--new_onCreate-->new_onStart-->new_onResume-->onStop

  (5)、屏幕方向切换时,例如从竖屏切换到横屏时。

onSaveInstanceState-->onPause-->onStop-->onDestory-->onCreate-->onStart-->onResume


回复数据 可以使用 onSaveInstanceState 与 onCreate 结合使用

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
    protected void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
        System.out.println("----onCreate----");
        this.setContentView(this.getLayoutInflater().inflate(
                R.layout.activity_log_in, null));
 
        EditText editText1 = (EditText) findViewById(R.id.et1);
        if (savedInstanceState != null) {
            String name = savedInstanceState.getString("NAME");
            editText1.setText(savedInstanceState.getString("NAME"));
            Toast.makeText(this, name, 1).show();
        }
 
    }



1
2
3
4
5
6
7
@Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
       // super.onSaveInstanceState(outState);
        outState.putString("NAME""HI HAO");
        System.out.println("----onSaveInstanceState----");
    }

在onSaveInstanceState中设置了 

      outState.putString("NAME""HI HAO");

 并且把

      super.onSaveInstanceState(outState);

    系统的保存并必掉 就可以 固定保存了。。

onSaveInstanceState是一个哈希结构的表 如果是复杂的类就不可以了 

对onSaveInstanceState理解依然不那么不深刻。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值