通过日志跟踪理解:
输出日志信息:
Android的android.util.Log类能够发送日志信息到系统级别的共享日志中心。Log类有好几个日志记录方法,其中一种为:
public static int d (String d, String msg)
d代表debug的意思,用来表示日志级别。第一个参数表示日志的来源,第二个参数表示日志的具体能容。该方法的第一个参数通常以类名为值的TAG常量传入。 private static final String TAG = "MainActivity"
public class MainActivity extends AppCompatActivity { private TextView mTextView; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate(Bundle) called"); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); Log.d(TAG,"onStart() called"); } @Override protected void onResume() { super.onResume(); Log.d(TAG,"onResume() called"); } @Override protected void onPause() { super.onPause(); Log.d(TAG,"onPause() called"); } @Override protected void onStop() { super.onStop(); Log.d(TAG,"onStop() called"); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG,"onRestart() called"); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG,"onDestroy() called"); } }
打开LogCat查看日志,LogCat面板右上角的过滤器下拉列表里点击Edit Filter Configuration选项创建消息过滤器,在Name处输入MainActivity,by Log Tag处同样输入MainAvtivity,点击OK完成。
以下为追踪内容:
当点击RunApp时,Activity被创建,日志内容:
07-09 13:30:05.430 15569-15569/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:30:05.652 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:30:05.656 15569-15569/com.example.myapplication D/MainActivity: onResume() called
Activity is running
当点击home时:
07-09 13:30:05.430 15569-15569/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:30:05.652 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:30:05.656 15569-15569/com.example.myapplication D/MainActivity: onResume() called
07-09 13:32:02.138 15569-15569/com.example.myapplication D/MainActivity: onPause() called
07-09 13:32:02.194 15569-15569/com.example.myapplication D/MainActivity: onStop() called
从home中找回Activity时,即Activity重新进入焦距状态时:
07-09 13:30:05.430 15569-15569/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:30:05.652 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:30:05.656 15569-15569/com.example.myapplication D/MainActivity: onResume() called
07-09 13:32:02.138 15569-15569/com.example.myapplication D/MainActivity: onPause() called
07-09 13:32:02.194 15569-15569/com.example.myapplication D/MainActivity: onStop() called
07-09 13:33:26.229 15569-15569/com.example.myapplication D/MainActivity: onRestart() called
07-09 13:33:26.277 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:33:26.283 15569-15569/com.example.myapplication D/MainActivity: onResume() called
点击back时:
07-09 13:30:05.430 15569-15569/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:30:05.652 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:30:05.656 15569-15569/com.example.myapplication D/MainActivity: onResume() called
07-09 13:32:02.138 15569-15569/com.example.myapplication D/MainActivity: onPause() called
07-09 13:32:02.194 15569-15569/com.example.myapplication D/MainActivity: onStop() called
07-09 13:33:26.229 15569-15569/com.example.myapplication D/MainActivity: onRestart() called
07-09 13:33:26.277 15569-15569/com.example.myapplication D/MainActivity: onStart() called
07-09 13:33:26.283 15569-15569/com.example.myapplication D/MainActivity: onResume() called
07-09 13:34:15.287 15569-15569/com.example.myapplication D/MainActivity: onPause() called
07-09 13:34:16.116 15569-15569/com.example.myapplication D/MainActivity: onStop() called
07-09 13:34:16.121 15569-15569/com.example.myapplication D/MainActivity: onDestroy() called
以下为设备旋转情况:
点击app进入时:
07-09 13:35:24.349 15698-15698/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:35:24.616 15698-15698/com.example.myapplication D/MainActivity: onStart() called
07-09 13:35:24.617 15698-15698/com.example.myapplication D/MainActivity: onResume() called
点击旋转:
07-09 13:35:24.349 15698-15698/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:35:24.616 15698-15698/com.example.myapplication D/MainActivity: onStart() called
07-09 13:35:24.617 15698-15698/com.example.myapplication D/MainActivity: onResume() called
07-09 13:36:40.968 15698-15698/com.example.myapplication D/MainActivity: onPause() called
07-09 13:36:40.979 15698-15698/com.example.myapplication D/MainActivity: onStop() called
07-09 13:36:40.982 15698-15698/com.example.myapplication D/MainActivity: onDestroy() called
07-09 13:36:41.100 15698-15698/com.example.myapplication D/MainActivity: onCreate(Bundle) called
07-09 13:36:41.138 15698-15698/com.example.myapplication D/MainActivity: onStart() called
07-09 13:36:41.141 15698-15698/com.example.myapplication D/MainActivity: onResume() called
由此可以看出Activity先被销毁再创建。那么问题来了,数据怎么保存? 从上述日志可以看出我们得在旋转前对数据进行保存,这里我们可以使用 protected void onStaveInState(Bundle outState),该方法在onPause(),onStop(),onDestroy()前由系统调用及数据存放在Bundle中,然后再onCreate()中取回数据。
打开MainActivity.java文件,新增一个常量作为将要存储再bundle中的键值对的键。如下:
private static final String KEY_INDEX = ”index“;
然后,覆盖onSaveInstanceState(....)方法,以上面新增的常量的值作为键,将变量的值保存到bundle中。
最后再onCreate()中确认是否成功获取该数值。
添加:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate(Bundle) called"); setContentView(R.layout.activity_main);
if(savedInstanceState != null){ mTextView = savedInstanceState.getInt(KEY_INDEX,0); }} @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); Log. i( TAG, "onSaveInstanceState"); savedInstanceState.putInt( KEY_INDEX, mTextView);}