Android四大组件之Activity,Activity生命周期

      Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

     

      Activity作为四大组件之一,其生命周期也就是它所在的进程的生命周期。Activity生命周期需要深入理解,后续的开发和调试都会使用到。

      

  一、  应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。

          下图是一张经典的Activity生命周期流程图

                                  Android四大组件之Activity,Activity生命周期_第1张图片

     1、onCreate()当第一次调用一个Activity就会执行

     2、onStart()表示当前的Activity处于可见状态

     3、onResume()表示当Activity可以得到用户焦点

     4、onPause()表示当前Activity被遮挡,即失去用户焦点

     5、onStop()表示当前Activity不可见

     6、 onDestory()表示当前的activity被销毁

     7、 当Activity没有被销毁的时候重新调用这个Activity就会调用onRestart方法

     根据官方给出的说明,可以清楚的知道,在什么状态下,应该处理那些事件。即那些事件放在哪个状态下处理是合适的。


二、为了加深对Activity生命周期的认知,需要看下在多个Activity的时候,对应的生命周期的信息。

       例如,我们在第一个Activity里面,通过点击button按钮来启动第二个Activity。

package com.android.activity.demo;

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

public class FirstActivity extends Activity implements View.OnClickListener {

    private static final String TAG = "FirstActivity";

    private Button mButton1 = null;
    private Button mButton2 = null;
    private Button mButton3 = null;
    private Button mButton4 = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        XLog.i(TAG, "onCreate()");
        setContentView(R.layout.activity_first);
        findView();
        setListener();
    }

    private void findView() {
        mButton1 = (Button) findViewById(R.id.btn_start_second_activity01);
        mButton2 = (Button) findViewById(R.id.btn_start_second_activity02);
        mButton3 = (Button) findViewById(R.id.btn_start_second_activity03);
        mButton4 = (Button) findViewById(R.id.btn_start_second_activity04);
    }

    private void setListener() {
        mButton1.setOnClickListener(this);
        mButton2.setOnClickListener(this);
        mButton3.setOnClickListener(this);
        mButton4.setOnClickListener(this);
    }


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

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

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

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

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

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

    @Override
    public void onClick(View view) {
        int id = view.getId();
        XLog.i(TAG, "onClick() id = 0x" + Integer.toHexString(id));
        switch (id) {
        case R.id.btn_start_second_activity01: {
            startSecondActivityByAction();
            break;
        }

        case R.id.btn_start_second_activity02: {
            startSecondActivityByClass();
            break;
        }

        case R.id.btn_start_second_activity03: {
            startSecondActivityByPackage();
            break;
        }

        case R.id.btn_start_second_activity04: {
            startSecondActivityByComponent();
            break;
        }

        default:
            break;
        }
    }

    private void startSecondActivityByAction() {
        XLog.i(TAG, "startSecondActivityByAction()");
        Intent intent = new Intent();
        intent.setAction("android.intent.action.SECONDACTIVITY_START");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByClass() {
        XLog.i(TAG, "startSecondActivityByClass()");
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByPackage() {
        XLog.i(TAG, "startSecondActivityByPackage()");
        Intent intent = new Intent();
        intent.setClassName(getPackageName(), getPackageName() + ".SecondActivity");
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }

    private void startSecondActivityByComponent() {
        XLog.i(TAG, "startSecondActivityByComponent()");
        Intent intent = new Intent();
        intent.setComponent(new ComponentName(getPackageName(), getPackageName() + ".SecondActivity"));
        try {
            startActivity(intent);
        } catch (Exception e) {
            XLog.i(TAG, "start activity error!");
        }
    }
}

  第二个Activity的部分

package com.android.activity.demo;

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

public class SecondActivity extends Activity {
    private static final String TAG = "SecondActivity";

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

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

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

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

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

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

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

  对应的AndroidManifest.xml的配置

        
            
                
                
            
        


1、当我们启动一个Activity的时候,输出的log如下

03-17 09:02:21.766: I/ActivityDemo(12870): FirstActivity onCreate()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:02:21.776: I/ActivityDemo(12870): FirstActivity onResume()
可以看到,分别先后调用了 onCreate()  onStart() onResume()


2、当我们按返回键退出第一个应用的时候,输出log如下

03-17 09:04:01.624: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onStop()
03-17 09:04:02.115: I/ActivityDemo(12870): FirstActivity onDestroy()

 退出应用的时候,分别先后调用了onPause() OnStop() onDestroy()  


3、第一个应用启动到第二个应用的时候,输出log如下:

03-17 09:05:36.637: I/ActivityDemo(12870): FirstActivity onClick() id = 0x7f060002
03-17 09:05:36.638: I/ActivityDemo(12870): FirstActivity startSecondActivityByAction()
03-17 09:05:36.765: I/ActivityDemo(12870): FirstActivity onPause()
03-17 09:05:36.777: I/ActivityDemo(12870): SecondActivity onCreate()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onStart()
03-17 09:05:36.780: I/ActivityDemo(12870): SecondActivity onResume()
03-17 09:05:37.222: I/ActivityDemo(12870): FirstActivity onStop()
启动到第二个Activity的时候,先是第一个应用的onPause(),失去焦点,被压到后台。

第二个应用的onCreate(创建) onStart(可见) onResume(可以获取焦点)。

当第二个应用onResume()可以获取焦点的时候,在把第一个应用onStop()不可见


4、从第二个应用返回第一个应用,输出log如下:

03-17 09:07:03.518: I/ActivityDemo(12870): SecondActivity onPause()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onRestart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onStart()
03-17 09:07:03.523: I/ActivityDemo(12870): FirstActivity onResume()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onStop()
03-17 09:07:03.905: I/ActivityDemo(12870): SecondActivity onDestroy()

先是第二个应用的onPause,失去焦点。

第一个应用被重新唤醒 onRestart, onStart可见,onResume可以获取焦点

然后才是第二个应用的onStop不可见,被销毁ondestory


附件:Demo对应的Sorce Code




你可能感兴趣的:(Android四大组件之Activity,Activity生命周期)