快速理解 activity生命周期

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理解依然不那么不深刻。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值