从0开始认识android(十一):Activity生命周期

生命周期
1、生命周期图
这里写图片描述
2、onCreate
  我们一般把只需要执行一次的代码放在这里实现,比如说请求网络数据等。
  生命周期进入onCreate方法主要有两种情况:
  2.1、这个界面被另外一个界面启动,这种情况没什么可说的。
  2.2、这个界面自身的一些配置发生改变,如横竖屏切换、单窗口多窗口模式切换、系统语言切换和键盘的弹出隐藏等,此时的生命周期顺序是onPause-onStop-onDestory-onCreate-onStart-onResume。
  2.3、当我们界面的生命周期处于看得见摸不着的onPause状态或完全看不见的onStop状态,如果此时系统内存不够用了,那么系统就会把我们的APP进程给干掉(注意看上图:此时我们的生命周期是没有进入onDestory的),然后把腾出来的内存给那些比我们APP权限更高的APP用,这些高权限APP可能是系统的预装APP,也可能是系统的白名单APP,也可能是当前用户正在使用的APP。如果我们的APP被系统这样干掉,那么当用户重新回到我们这个界面时,也会走onCreate方法。
  另外,onCreate函数有一个Bundle类型的参数savedInstanceState,这个参数是哪儿来的呢?
  其实,除了用户点击返回键退出界面这种情况外,其他的情况导致我们的界面进入onStop完全不可见状态之前,我们的界面都会先走onSaveInstanceState(Bundle outState)方法,走这个方法干嘛呢?这是系统希望我们能通过这个方法的Bundle 对象outState把我们这个界面的一些数据保存好,当系统为了腾内存给高权限APP用而把我们APP干掉,用户又重新回到我们的界面时能用之前保存好的数据恢复给用户,这样一来给用户的感觉就是和他退出这个界面时没什么变化。所以,onCreate中传过来的Bundle对象就是onSaveInstanceState中的Bundle对象。需要注意的是,并不是说我们在onSaveInstanceState中执行了保存,onCreate就一定会返回,只有当APP进程被系统干掉,或者当前界面执行了onDestory后再执行onCreate的情况(例如屏幕横竖屏切换,单窗口多窗口切换,语言切换,键盘弹出隐藏等),我们保存的Bundle数据才从onCreate中返回。。
  基于上面onCreate被调用的几种情况,我们在onCreate获取数据时,最好判断一下是否存在旧数据,如果存在旧数据就恢复旧数据显示,当然,我们也可以在另一个方法onRestoreInstanceState中恢复数据,不仅仅局限于onCreate方法,如果在onRestoreInstanceState方法中恢复的话,就不需要判断Bundle是否为null了,因为只有当Bundle不为null的时候界面才会走onRestoreInstanceState方法:

TextView mTextView;
String mGameState;

@Override 
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 是否有旧数据 
    if (savedInstanceState != null) {
        mGameState = savedInstanceState.getString(GAME_STATE_KEY);
    } 
    setContentView(R.layout.main_activity);
    mTextView = (TextView) findViewById(R.id.text_view);
} 
//根据旧数据恢复界面
@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
    mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
} 
 //保存当前界面数据
@Override 
public void onSaveInstanceState(Bundle outState) {
    outState.putString(GAME_STATE_KEY, mGameState);
    outState.putString(TEXT_VIEW_KEY, mTextView.getText());
    super.onSaveInstanceState(outState);
} 

3、onStart
  这个方法没什么可说的,就是系统初始化布局文件代码的地方,然后准备让我们的界面进入前台的那一刻。
  进入这个方法也有两种情况,第二种就是界面onStop了后,再回到当前界面时会重走它。
4、onResume
  就是用户在这个界面的整个时间段。
5、onPause
  onPause即我们的界面看得见摸不着的状态(无法交互),进入这种状态主要常见原因有如下几点:
  5.1、如被电话界面接听界面覆盖、用户启动了另外的界面、锁屏操作等,这类原因是最常见的,导致的结果就是我们的界面会完全不可见,此时系统会走onPause方法,接着走onSaveInstanceState方法,最后走onStop方法。记住:如果是用户手动点击手机返回键退出界面时,是不走onSaveInstanceState方法的。
  5.2、一个半透明的新界面覆盖了当前界面,虽然当前界面还可以看得见,但没有获取焦点从而不能响应我们的操作,例如打开一个Dialog。
  5.3、7.0后手机开始支持一屏多窗口显示,如果我们当前的界面不是用户正在交互的界面的话,那么界面也会是onPause状态。
  
  6、onStop
  onStop就是我们的界面完全不可见状态,例如用户关屏了,用户点击home键回到桌面,一个不透明的新的界面完全把我们的界面覆盖了,用户点击返回键退出了界面等。此时会相继调用onPause、onSaveInstanceState(点击返回键退出除外)、onStop。
  所以,一般我们在这里执行一些资源的释放或数据库存储。例如停止界面动画、定位模式可以从精确定位切换为粗略定位等。
  7、onDestroy
  进入onDestory一般有几种情况:
  7.1、用户点击手机返回按钮退出界面
  7.2、代码执行了finish()方法
  7.3、屏幕横竖屏切换或单窗口多窗口模式切换或系统语言切换或键盘的弹出隐藏。
  到这里,整个界面就全部玩完了,所以,我们最好就在这里释放掉所有资源,包括在onStop方法中没有释放掉的。
  
  要弄清楚一点:进入onStop状态或onDestory状态并不是说生命周期会单单调用onStop方法或onDestroy方法,换言之,如果生命周期进入onStop之前,肯定会伴随着先进入onPause;进入onDestory之前,会先伴随着依次进入onPause,onStop,最后才进onDestory。

  系统根据界面的生命周期状态来判断是否干掉进程
  在上面的生命周期中,如果我们的APP进程只有Stopped或Destroyed状态的界面时,那么我们的进程是最最最容易被系统干掉的;如果进程中还存在Paused状态的界面,那么这是系统第二优先考虑要干掉的。

  综上,我们可以把触发界面生命周期改变的原因分为三类:
  1、界面自身配置改变触发:如当横竖屏切换、单窗口多窗口模式切换、系统语言切换和键盘弹出隐藏等,生命周期改变过程为:onPause-onStop-onDestory-onCreate-onStart-onResume。
  2、启动其他界面触发:例如在A界面启动B界面,生命周期改变过程为:A界面的onPause-B界面的onCreate-B界面的onStart-B界面的onResume-A界面的onStop(完全不可见了)。
  3、进程被系统干掉触发:当系统内存吃紧时,会把只有onPause或onStop或onDestory状态的界面的进程干掉,当用户重新回到该界面时,不会再新建一个该界面的对象,而是复用之前的旧对象,重走onCreate方法。

猜你喜欢

转载自blog.csdn.net/jack_bear_csdn/article/details/80454505
今日推荐