Activity-生命周期

Activity不是什么陌生的东西,作为Android程序媛对Activity再熟悉不过。每当说起Activity总最关注的还是它的生命周期。

1、一张来自谷歌官方文档的Activity的生命周期图:

 

 

直接来个MainActivity覆盖上面所有的方法通过log打印方式给大家展现,通过一个Activity跳转到另一个Activity

package com.lcw.rabbit.activitydemo;

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

public class MainActivity extends Activity {

    private static final String TAG = "Rabbit";

    private Button mbButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mbButton = (Button) findViewById(R.id.bt_button);
        mbButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });

        Log.i(TAG, "1----------onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "1----------onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "1----------onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "1----------onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "1----------onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "1----------onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "1----------onDestroy");
    }
}

MainActivity.java

 再来个SecondActivity,一样覆写以上所有方法:

package com.lcw.rabbit.activitydemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class SecondActivity extends Activity {

    private static final String TAG = "Rabbit";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.i(TAG, "2----------onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "2----------onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "2----------onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "2----------onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "2----------onStop");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "2----------onRestart");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "2----------onDestroy");
    }


}

SecondActivity.java

     

2、Activity的流程之旅:(参照上面的流程图来理解)

实验一:

  当我们进入第一个Activity的时候,我们的Log日志依次打印出了:onCreate,onStart,onResume方法。

结论:

  当我们第一次启动Activity的时候会调用onCreate方法,然后在界面展示出来的时候调用了onStart方法,当用户获取焦点的时候调用onResume方法。

      

实验二: 

   当我们按下Back键的时候,我们的Log日志依次打印出了:onPause,onStop,onDestroy方法。

结论:

  当Activity处于暂停(未被完全遮挡,比如弹出对话框状态)的时候会调用onPause,当完全不可见(被隐藏)的时候会调用onStop方法,当被销毁的时候会调用onDestroy方法。

      

 

实验三:

  当我们重新进入Activity,它依旧是调用onCreate,onStart,onResume方法,当我们点击按钮跳转第二个Activity的时候,我们的Log日志依次打印出了:onPause,然后第二个Activity打印出依次onCreate,onStart,onResume,然后第一个Activity再调用onStop方法。

结论:

  当Activity处于暂停(未被完全遮挡)的时候会调用onPause,然后启动第二个Activity,执行第二个Activity被创建的生命周期onCreate,onStart,onPause方法,当第一个Activity完全不可见(被隐藏)的时候会调用onStop方法。

      

实验四:

  当我们按下Back键返回到第一个Activity的时候,Log日志依次打印出:第二个Activity的onPause,然后进入第一个Activity的onReStart,onStrat,onResume,然后第二个Activity调用了onStop,onDestroy。

结论:

  当我们按下Back键返回到第一个Activity的时候,第二个Activity会先调用onPause暂停,由于第一个Activity刚才没被调用onDestroy销毁,所以这里没有重新调用onCreate方法创建而是调用了onReStart方法,然后展示界面onStart,获取屏幕焦点onResume,然后第二个Activity被完全覆盖执行onStop,然后被销毁onDestroy。

     

3、Activity设计模式之美

疑问1:  

  为什么不能直接去启动第二个Activiity?

答:

  其实大家可以这样来理解,当我启动一个正在执行音乐播放的Activity的时候,突然有一个电话打进来了,电话也是一个Activity,那么在没有对第一个播放音乐的Activity进行暂停操作,就接通了电话,那么是不是我们在边通话的时候还会边放着音乐啊?很显然这是不符合常理的。

 

疑问2:

  当我们启动别的Activity的时候,为什么不先把一个Activity完全销毁了,然后再去启动另一个?

答:

  还是刚才打电话的例子,如果我们直接完全销毁了前面一个Activity,那么我们在接电话的时候当然就是舒服,因为没有音乐吵你了,但是当我们接完电话呢?我们是不是又要去重新打开那个音乐的Activity,然后再重投开始听?然后刚好又来一个电话呢?我想这时的你应该要摔电话了。

  再来,如果我们直接去销毁了这个Activity,那刚好这个电话Activity由于不知名原因发生问题呢?那么此时电话的Activity没启动起来,音乐的Activity又销毁了,那么用户的手机屏幕就会出现黑屏(闪屏),这点在用户体验上是非常不好的。

  可能敏捷点的朋友已经想到这个暂停方法onPause的好处了,当电话来的时候,我们去暂停音乐Activity的同时调用了onPause方法,我们就可以在这个方法里面去记录一些东西了,比如当前音乐的播放进度,当我们接完电话,回到音乐Activity的时候,我们会调用(实验四)的方法,我们可以在onRestart或者onResume中根据刚记录下来的播放进度去继续播放音乐。

  所以Activity的生命周期这样去设计是非常合理的。

posted @ 2016-07-28 11:29  Daisy-程序媛  阅读(252)  评论(0编辑  收藏  举报