zoukankan      html  css  js  c++  java
  • Activity的生命周期

    一.摘要  

      一个完整的Activity的生命周期有6个回调函数。

    //创建Activity
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    //Activity快要变成可见的
        @Override
        protected void onStart() {
            super.onStart();
        }
    //Activity变成可见的,处于运行状态
        @Override
        protected void onResume() {
            super.onResume();
        }
    //其他Activity获得用户焦点,(Activity快要暂停了)
        @Override
        protected void onPause() {
            super.onPause();
        }
    //Activity不再可见,处于停止状态
        @Override
        protected void onStop() {
            super.onStop();
        }
    //Activity快要被销毁了
        @Override
        protected void onDestroy() {
            super.onDestroy();
       }
      }
     这些方法定义了Activity完整的生命周期,实现这些方法,我们能监控Activity生命周期中的三个嵌套循环(monitor three nested loops in the activity lifecycle)
     
            1.Activity的entire lifetime(全部的生命期)发生在
                                  调用onCreate()和调用onDestory()之间。
            在onCreate()方法中执行全局状态的建立(例如定义布局),在onDestroy()方法中释放所有保存的资源。
            2.Activity的visible lifetime(可见的生命期)发生在
                                  调用onStart()onStop()之间。
             在这个期间,用户能在屏幕上看见Activity,和它进行交互。
            系统在Activity的完整寿命中可能多次调用onStart()和onStop(),正如Activity交替地对用户可见或隐藏。
     
          3Activity的foreground lifetime (前台的生命期)发生在
                                   调用onResume()onPause()之间。
           在这期间,Activity在屏幕上所有其他Activity的前面,有用户输入焦点。
           一个Activity能频繁的在前台进入和出去之间转变。
     

           下面这张图很好的讲解了Activity的生命周期和上面说的三种生命期:

    二. 实例

    下面通过一个Demo来学习以下Activity的生命周期:Demo很简单,一共三个Activity,MainActivity和NormalActivity和DialogActivity。MainActivity里面有两个按钮,分别可以跳转到NormalActivity和DialogActivity。NormalActivity和DialogActivity的唯一区别就是DialogActivity指定了Activity的主题为Dialog,即在AndroidManifest文件里面注册后者多了一句

    android:theme="@android:style/Theme.Dialog"

    MainActivity:

    public class MainActivity extends Activity {
        public static final String TAG = "MainActivity";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG, "MainActivity_onCreate");
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
    
                Button startNormalActivity = (Button) findViewById(R.id.start_normal_button);
                Button startDialogActivity = (Button) findViewById(R.id.start_dialog_button);
    
            startNormalActivity.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                    startActivity(intent);
                }
            });
    
            startDialogActivity.setOnClickListener(new View.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, "MainActivity_onStart");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "MainActivity_onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "MainActivity_onPause");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "MainActivity_onStop");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "MainActivity_onDestroy");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "MainActivity_onRestart");
        }
    
    }
    MainActivity

    NormalActivity:

    public class NormalActivity extends Activity {
        public static final String TAG = "NormalActivity";
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                Log.d(TAG,"NormalActivity_onCreate");
                requestWindowFeature(Window.FEATURE_NO_TITLE);
                setContentView(R.layout.normal_layout);
            }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, "NormalActivity_onStart");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "NormalActivity_onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "NormalActivity_onPause");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "NormalActivity_onStop");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "NormalActivity_onDestroy");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "NormalActivity_onRestart");
        }
    
    }
    NormalActivity

    DialogActivity:

    package com.example.haisun.activitylifecycle;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Window;
    
    /**
     * Created by HaiSun on 2015/10/1.
     */
    public class DialogActivity extends Activity {
        public static final String TAG = "DialogActivity";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Log.d(TAG,"DialogActivity_onCreate");
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.dialog_layout);
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG, "NDialogActivity_onStart");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG, "DialogActivity_onResume");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG, "DialogActivity_onPause");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG, "DialogActivity_onStop");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG, "DialogActivity_onDestroy");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG, "DialogActivity_onRestart");
        }
    }
    DialogActivity

    AndroidManifest 文件:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.haisun.activitylifecycle" >
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".NormalActivity">
            </activity>
            <activity android:name=".DialogActivity"
                android:theme="@android:style/Theme.Dialog">
    
            </activity>
        </application>
    
    </manifest>
    AndroidManifest

    通过运行应用,可以观察到回调函数的调用情况打印记录:

    1.运行MainActivity

    可以看出一个Activity运行调用的回调方法是:onCreate()->onStart()->onResume()

    2.点击按钮跳转到NormalActivity

    对于MainActivity,由于不可见,状态由运行变为停止。 依次调用了它的回调方法:onPause()->onStop(),NormalActivity正常启动,调用的回调方法是:onCreate()->onStart()->onResume()。

    3.点击按钮跳转到DialogActivity

    由于MainActivity依然可见,所以只调用了它的onPause()方法。其他跟NormalActivity一样。

    4.Activity处于运行状态,旋转屏幕

    可以发现旋转屏幕是一个销毁Activity然后重新创建Activity的过程。依次调用回调方法:onPause()->onStop->onDestroy()->onCreate()->onStart()->onResume()。

    注:本文写作参考了http://www.cnblogs.com/JohnTsai的相关技术博客

  • 相关阅读:
    webpack学习_管理输出(管理资源插件)
    vue路由
    vue动态组件,组件缓存
    vue组件间传参
    模块化
    安装Vue脚手架,创建Vue项目
    Vue常用指令
    VUE概述
    小程序调用微信支付接口
    Android音视频开发之-WebRTC技术实践
  • 原文地址:https://www.cnblogs.com/halbertsun/p/4851513.html
Copyright © 2011-2022 走看看