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~~~");  
         }  
     }  

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

  • 相关阅读:
    Git 初识
    AJAX
    vue router 如何使用params query传参,以及有什么区别
    【javascript语言精粹】第六章 数组
    【js语言精粹】第四章 函数
    【js高级程序设计】迭代器
    【js高级程序设计】第三章
    [js高级程序设计]第二章
    csrf攻击
    js 排序算法总结
  • 原文地址:https://www.cnblogs.com/codeAnimal/p/3270814.html
Copyright © 2011-2022 走看看