2015年5月16日星期六

用Log体验Activity完整生命周期

如图为Activity生命周期示意图,虽然直观,但是不太利于记忆和理解,那就上代码吧。




代码源自《第一行代码》,在main_activity基础上,创建两活动(按钮),点击分别显示文字。
package com.example.activitylifecycletest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

public class MainActivity extends Activity {

 public static final String TAG = "MainActivity";
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  Log.d(TAG, "onCreat");
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  Button startNormalActivity = (Button) findViewById (R.id.start_normal_activity);
  Button startDialogActivity = (Button) findViewById (R.id.start_dialog_activity);
  startNormalActivity.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v){
    Intent intent = new Intent(MainActivity.this, NormalActivity.class);
    startActivity(intent);
   }
  });
  startDialogActivity.setOnClickListener(new OnClickListener(){
   @Override
   public void onClick(View v){
    Intent intent = new Intent(MainActivity.this, DialogActivity.class);
    startActivity(intent);
   }
  });
 }
 
 @Override
 protected void onStart(){
  super.onStart();
  Log.d(TAG, "onStart");
 }
 
 @Override
 protected void onResume(){
  super.onResume();
  Log.d(TAG, "onResume");
 }
 
 @Override
 protected void onPause(){
  super.onPause();
  Log.d(TAG, "onPause");
 }
 
 @Override
 protected void onStop(){
  super.onStop();
  Log.d(TAG, "onStop");
 }
 
 @Override
 protected void onDestroy(){
  super.onDestroy();
  Log.d(TAG, "onDestory");
 }
 
 @Override
 protected void onRestart(){
  super.onRestart();
  Log.d(TAG, "onRestart");
 }


}


这里引入Log来输出相应信息。注意,在Eclipse中,widows->show view->other->Android->LogCat位置打开Log控制台。这是Android调试相当有用的工具。

LogCat输出信息很多,为了方便查看,这里给LogCat加入过滤器,代码中我们命名TAG为“MainActivity”,故我们加入同名过滤器,by Log Tag为MainActivity即可。

一切就绪。运行程序,如图


LogCat中选中MainActivity过滤器可见,


当MainActivity第一次创建时,会执行onCreate(), onStart(), onResume()方法。

点击Start NormalActivity按钮,如图所示,


LogCat输出如下,

此时NormalActivity已经把MainActivity完全遮挡住,故执行onPause()和onStop()方法。

按下返回键,回到MainActivity,此时输出,



之前MainActivity活动已进入停止状态,故此时执行onRestart()方法,又依次执行onStart()和onResume()方法以重启MainActivity活动。

点击Start DialogActivity按钮,如图所示,


LogCat输出如下,



因为此时DialogActivity并没有完全覆盖MainActivity活动,MainActivity只是暂时进入了暂停状态,并没有停止,故只执行了onPause()方法。

按下返回键,回到MainActivity,此时也只有onResume()方法得到执行,如图,


试想,手机锁屏了,MainActivity会处于什么状态呢?(其实是测试时手机自动锁屏发现的)锁屏,点亮,LogCat变化如下,


很显然,当我们锁屏时,MainActivity执行onStop()方法,点亮屏幕,依次执行onRestart(), onStart(), onResume()方法。

最后,按下返回键,退出MainActivity回到桌面,LogCat输出,


同理,我们可知,当用Home建回到桌面时,会执行onPause(), onStop()方法,

再次从最近应用或点击应用回到MainActivity时,会执行onRestart(), onStart(), onRusume()方法。


这win10自带输入法老跟chrome冲突导致后者,多亏了自动保存...


没有评论:

发表评论