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~~~"); } }
不知道,童鞋们明不明白呢? 菜鸟个人之见,如有错误之处,请留言提醒~