zoukankan      html  css  js  c++  java
  • Activity的生命周期

    Activity生命周期解密

    生命有始有终,人生旅途中坦荡起伏总会有些不如意的时候,让我们来看Activity的生命始末~

    Android API官方文档:

      相信这张图,大家都不陌生。Activity有7个状态,彼此间相互转换~

    作为开发者,尤其是像我这种的菜鸟,我只需要关心其中的转折状态点即可。

    场景:应用启动后,状态执行顺序:onCreate()->onStart()->onResume

    关心的2种情况:

    1、back返回键

      正常流程,非常简单,依次执行,onPause()->onStop()->onDestory()

    2、特别关注,home键。

          ——此键是用户操作最频繁的一个动作。所以,开发者必须处理好中间的状态转换。

       生活场景1: 当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,浏览器的Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。

      当我们再次启动浏览器,看NBA新闻时,则浏览器先后又分别执行了onRestart()->onStart()->onResume()三个方法。

      生活场景2: 思考下,当再次启动浏览器的时候,生命周期是从onRestart()->onStart()->onResume()执行的啊,为什么还显示的是,之前浏览的那一页NBA信息呢? 理论上,应该是首页的NBA内容啊,因为重新运行onStart()->onResume()啊。这到底是为什么?

      原因:在按home键的时候,Activity执行了onPause()->onStop(),在onPause()中,程序保存了当前你浏览的NBA新闻的相关信息。当你再次启动浏览器的时候,在onRestart()中,重新加载了之前保存的NBA相关数据。所以,当你启动的时候,看到的是 按home键之前的NBA页面相关信息。

    小Demo,供大家参考:

    package com.tutor.activitydemo;  
     import android.app.Activity;  
     import android.os.Bundle;  
     import android.util.Log;  
     import android.widget.EditText;  
     public class ActivityDemo extends Activity {  
         private static final String TAG = "ActivityDemo";  
         private EditText mEditText;  
         //定义一个String 类型用来存取我们EditText输入的值  
         private String mString;  
         public void onCreate(Bundle savedInstanceState) {  
             super.onCreate(savedInstanceState);  
             setContentView(R.layout.main);  
             mEditText = (EditText)findViewById(R.id.editText);  
             Log.e(TAG, "start onCreate~~~");  
         }  
         @Override  
         protected void onStart() {  
             super.onStart();  
             Log.e(TAG, "start onStart~~~");  
         }  
         //当按HOME键时,然后再次启动应用时,我们要恢复先前状态  
         @Override  
         protected void onRestart() {  
             super.onRestart();  
             mEditText.setText(mString);  
             Log.e(TAG, "start onRestart~~~");  
         }   
         @Override  
         protected void onResume() {  
             super.onResume();  
             Log.e(TAG, "start onResume~~~");  
         }  
         //当我们按HOME键时,我在onPause方法里,将输入的值赋给mString  
         @Override  
         protected void onPause() {  
             super.onPause();  
             mString = mEditText.getText().toString();  
             Log.e(TAG, "start onPause~~~");  
         }   
         @Override  
         protected void onStop() {  
             super.onStop();  
             Log.e(TAG, "start onStop~~~");  
         }  
           
         @Override  
         protected void onDestroy() {  
             super.onDestroy();  
             Log.e(TAG, "start onDestroy~~~");  
         }  
     }  

      不知道,童鞋们明不明白呢? 菜鸟个人之见,如有错误之处,请留言提醒~

  • 相关阅读:
    Java对象的生命周期与作用域的讨论(转)
    [置顶] Oracle学习路线与方法
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 未名湖边的烦恼
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
    Java实现 蓝桥杯 算法训练 最大的算式
  • 原文地址:https://www.cnblogs.com/codeAnimal/p/3270814.html
Copyright © 2011-2022 走看看