Activity的生命周期

  • Activity生命周期的回调方法:
  • //创建Activity
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    //Activity快要变成可见的
        @Override
        protected void onStart() {
            super.onStart();
        }
    //Activity变成可见的,处于运行状态
        @Override
        protected void onResume() {
            super.onResume();
        }
    //其他Activity获得用户焦点,(Activity快要暂停了)
        @Override
        protected void onPause() {
            super.onPause();
        }
    //Activity不再可见,处于停止状态
        @Override
        protected void onStop() {
            super.onStop();
        }
    //Activity快要被销毁了
        @Override
        protected void onDestroy() {
            super.onDestroy();
       }
      }
          这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)

          1. Activity的entire lifetime(全部的生命期)发生在调用onCreate()和调用onDestory()之间。
              在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
          2. Activity的visible lifetime(可见的生命期)发生在调用onStart()onStop()之间。
             在这个期间,用户能在屏幕上看见Activity,和它进行交互。
             系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
          3. Activity的foreground lifetime (前台的生命期)发生在调用onResume()onPause()之间。
             在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
             一个Activity能频繁的在前台进入和出去之间转变。

           下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:


  • 下面就根据上面的过程图进行说明:
  • activity启动的时候:onCreate ---> onStart ---> onResume 这个过程不用多说,大家都知道。

  • 通过上图的我们可以看出activity从running状态跳转到onPause状态的原因是:Another activity comes into the foreground. 也就是说有另外一个actvity被启动并运行了,比如说MainActivity通过startActivity启动了SecondActivity,那么SecondActivity就在ui视图的最顶层了,而MainActivity不再是最顶层的activity了,此时就会onPause了,此时我们依稀还能看到MainActivity,只是MainActivity已经站在他人之后了。

  • 而当MainActivity完全被SecondActivity挡住,完全看不见的时候,此时MainActivity就会onStop了。我们看看上图从onPause到onStop的原因是:the activity is no longer visiable. 也就是说此时MainActivity完全不可见了,从这里我们可以猜测当按下home键的时候,当前activity就会处于onStop的状态。

  • 从actvitiy的生命周期图中,我们可以看出activity是可以停留在onPause和onStop在这两个状态上的,因为可以相应的恢复。

        对图中最左侧的箭头指示的解释:
          当MainActivity处于onPause和onStop状态时,当更高优先级的apps需要内存,而此时系统内存不够了,那么android系统就会将MainActivity所在的进程给杀了以释放资源。
          当然被杀了之后,想重生,那必须得从头来过:onCreate ---> onStart() ---> onResume().
         总结:
        onCreate: 在这里创建界面,做一些数据的初始化的工作
        onStart: 到这一步变成用户可见不可交互的
        onResume: 变成和用户可交互的
        onPause: 到这一步是可见不可交互的,系统会停止动画等消耗CPU的事情,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,有可能被系统回收。                           在这里保存的数据,应该在onResume里读出来。(注意:这个方法里做的事情时间要短,因为下一个activity不会等这个方法完成才启动)
        onStop: 变得不可见,被下一个activity覆盖了(onPause 和 onStop的区别为是否可见)
       onDestroy :这是activity 被干掉之前最后一个被调用的方法了。

       下面通过一个Demo来学习以下Activity的生命周期。
       Demo很简单,就只有两个Activity,MainActivity和SecondActivity和一个按钮。点击按钮,由MainActivity跳转到SecondActivity。
         MainActivity
  • package com.example.activitytest;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
      
        private Button btn;
        private static final String TAG = "ActivityTest";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "MainActivity onCreate");
            setContentView(R.layout.activity_main);
            btn = (Button)findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                       Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                       startActivity(intent);
                }
            });
            
        }
        @Override
        protected void onPause() {
            Log.d(TAG, "MainActivity onPause  ");
            super.onPause();
        }
        @Override
        protected void onResume() {
            Log.d(TAG, "MainActivity onResume  ");
            super.onResume();
        }
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG,"MainActivity onStart  ");
        }
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "MainActivity onStop  ");
        }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "MainActivity onDestroy  ");
        }
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "MainActivity onRestart  ");
        }
    }
     SecondActivity:
  • package com.example.activitytest;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class SecondActivity extends Activity {
        private static final String TAG = "ActivityTest";
           @Override
        protected void onCreate(Bundle savedInstanceState) {
               setContentView(R.layout.second_layout);
               super.onCreate(savedInstanceState);
               Log.d(TAG,"SecondActivity onCreate");
               
        }
           @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, "SecondActivity onStart");
        }
           @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "SecondActivity onResume");
      
           }
         @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "SecondActivity onPause");
        }
         @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "SecondActivity onStop");
        }
         @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "SecondActivity onDestroy");
        }
         @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "SecondActivity onRestart");
        }
    }
    
    

    1. 运行应用,MainActivity运行。

         可以看出一个Activity运行调用的回调方法是:  onCreate()->onStart()->onResume()

  • 2. 点击跳转按钮,由MainActivity跳转到SecondActivity:
  •       1>SecondActivity是Dialog。

  • 由于SecondActivity是Dialog,所以MainActivity依然可见,所以只调用了它的onPause()方法。

  •     2>若将SecondActivity改为不是Dialog(只需在Manifest.xml文件中删掉 android:theme="@android:style/Theme.Dialog"这一行即可)

         再点击跳转按钮:

  •     对于MainActivity,由于不可见,状态由运行变为停止。

          依次调用了它的回调方法: onPause()->onStop()

  • 3.Activity处于运行状态时,点击返回按钮:

  •      点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:  onPause()->onStop()->onDestroy()
  • 4.Activity处于运行状态,点击主页按钮,返回桌面:
  •       Activity由运行状态变为停止状态,依次调用它的回调方法:  onPause()->onStop()
  • 5.Activity处于停止状态,即由桌面返回到Activity:
  •       
  •       停止->运行,依次调用回调方法:onRestart()->onStart()->onResume()
  • 6.Activity处于运行状态,旋转屏幕:
  •      可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。
  •      运行->暂停->停止->死亡->运行
  •      依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()
  •  7.Activity处于运行状态,手机此时锁屏:
  •      
  •       
  •     可以看出,手机锁屏,此时由于Activity不可见,会进入停止状态。
  •     依次调用回调方法:onPause()->onStop()
  •  8.当应用正在运行时,手机锁屏,然后解锁回到应用界面:

  •       
  •      可以看出应用从停止状态恢复到运行状态。

  •      依次调用回调方法:onRestart()->onStart()->onResume()
  •    
  • 参考:http://www.cnblogs.com/JohnTsai/p/4052676.html
  •           http://www.cnblogs.com/hibraincol/archive/2012/03/06/2382120.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值