美文网首页我爱编程
Android:探究活动的生命周期

Android:探究活动的生命周期

作者: zhang_yongfeng | 来源:发表于2018-04-10 19:17 被阅读0次

    1、介绍

    Android的活动是可以层叠的,我们每启动一个新的活动,就会覆盖有原活动之上,点击Back键之后会销毁最上面的活动,下面的一个活动就会重新显示出来。

    2、 返回栈

    Android使用(Task)来管理活动;

    一个任务就是一组存放在栈里的的活动集合,这个栈也称之为返回栈(back Stack);

    栈是一种先进先出的数据结构;

    工作流程:

    在默认情况下,

    每当启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置,

    每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的位置的活动就会出栈,这时前一个入栈的活动就会重新处于栈顶的位置,系统就会是显示处于栈顶的活动给用。

    3、活动状态(每个活动其生命周期最多可能会有4种状态)

    3.1、运行状态

    当一个活动位于返回栈的栈顶时,活动就处于运行状态。

    3.2、暂停状态

    当一个活动不再处于栈顶位置,但仍然可见时,活动就进入了暂停状态。

    示例:并不是每一个活动都会占满整个屏幕,比如对话框形式的活动就只会占用屏幕中间的部分区域,你仍然可以看到后面的活动;

    处于暂停状态的活动仍然是完全存活着的;

    只有在内存极低的情况下才会考虑回收这种活动;

    3.3、停止状态

    当一个活动不再处于栈顶位置,并且完成不可见的时候,就进入了停止状态。系统会为这种活动保存相应的状态和成员变量(但是当其他地方需要内存时,处于停止活动下的活动有可能会被系统回收。)

    3.4、销毁状态

    当一个活动从返回栈中移除后变成了销毁状态。系统会倾向回收这种状态的活动,以保证手机内存的充足。

    4、活动的生存期

    Activity中定义了7个回调方法,覆盖了生命周期的每一个环节;

    onCreate()

    每个活动基本都会重写这个方法,它会在活动第一次创建的时候调用;这个方法会完成活动的初始化操作,比如:加载布局、绑定事件;

    onStart()

    这个方法在活动由不可见变为可见的时候调用;

    onResume()

    这个方法在活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶,并且处于运行状态;

    onPause()

    这个方法在系统准备去启动或者恢复另一个活动的时候调用;

    (通常会在这个方法中将一)

    onStop()

    这个方法在活动完全不可见的时候调用;

    onDestroy()

    在活动被销毁之前调用,之后活动的状态变为销毁状态;

    onRestart()

    这个方法在活动由停止状态变为运行状态之前调用,就是活动被重新启动的时候调用;

    5、体验活动的生命周期

    准备工作

    新建一个项目,允许自动创建活动和布局,并设置主活动;

    再分别创建两人子活动NormalActivity(布局命名:normal_layout)和DialogActivity(布局命名:dialog_layout);

    normal_layout.xml 修改成内容如下:

                  android:orientation="vertical"

                  android:layout_width="match_parent"

                  android:layout_height="match_parent">

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="this is a mormal activity"

            />

    dialog_layout.xml 修改成内容如下:

                  android:orientation="vertical"

                  android:layout_width="match_parent"

                  android:layout_height="match_parent"

                  >

            android:layout_height="match_parent"

            android:layout_width="wrap_content"

            android:text="This is a dialog activity"

            />

    修改注册表AndroidManifest.xml如下:

              package="com.bignerdranch.android.activity_text">

            android:allowBackup="true"

            android:icon="@mipmap/ic_launcher"

            android:label="@string/app_name"

            android:roundIcon="@mipmap/ic_launcher_round"

            android:supportsRtl="true"

            android:theme="@style/AppTheme">

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

    添加两个按钮,一个用于启动活动NormalActivity,一个用于启动DialogActivity

    主活动的布局如下:

                  android:orientation="vertical"

                  android:layout_width="match_parent"

                  android:layout_height="match_parent">

            android:id="@+id/start_normal_activity"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="Start normal activity"/>

            android:id="@+id/start_dialog_activity"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="Start dialog activity"

            />

    活动修改代码如下:

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.util.Log;

    import android.view.View;

    import android.widget.Button;

    public class MainActivity extends AppCompatActivity {

        public static final String TAG = "MainActivity";

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            Log.w(TAG,"onCreate");

            super.onCreate(savedInstanceState);

            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 View.OnClickListener(){

                public void onClick(View v){

                    Intent intent = new Intent(MainActivity.this,NormalActivity.class);

                    startActivity(intent);

                }

            });

            //设置按钮的签听事件

            startDialogActivity.setOnClickListener(new View.OnClickListener(){

                public void onClick(View v){

                    Intent intent = new Intent(MainActivity.this,DialoActivity.class);

                    startActivity(intent);

                }

            });

            }

        protected void onStart(){

            super.onStart();

            Log.w(TAG,"onStart");

        }

        protected  void onResume(){

            super.onResume();

            Log.w(TAG,"Onresume");

        }

        protected  void onPause(){

            super.onPause();

            Log.w(TAG,"onpause");

        }

        protected  void onStop(){

            super.onStop();

            Log.w(TAG,"onstop");

        }

        protected void onDestroy(){

            super.onDestroy();

            Log.w(TAG,"onDestroy");

        }

        protected void onRestart(){

            super.onRestart();

            Log.w(TAG,"onRestart");

        }

    }

    进入时打印如下:

    04-10 01:18:06.875 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动第一次创建的时候调用>> onCreate

    04-10 01:18:06.908 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动由不可见变为可见的时候调用>> onStart

    04-10 01:18:06.911 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动准备好和用户进行交互的时候调用>> Onresume

    点击START NOTMAL ACTIVITY 按钮时会打印 如下:

    04-10 01:18:27.265 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系统准备去启动或者恢复另一个活动的时候调用>> onpause

    04-10 01:18:27.589 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动完全不可见的时候调用>> onstop

    再点击返回主活动页面时打印 如下:

    04-10 01:18:46.132 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动由停止状态变为运行状态之前调用>> onRestart

    04-10 01:18:46.133 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动由不可见变为可见的时候调用>> onStart

    04-10 01:18:46.134 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动准备好和用户进行交互的时候调用>> Onresume

    点击Start dialog activity 按钮进打印如下:

    04-10 17:22:18.739 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 系统准备去启动或者恢复另一个活动的时候调用>> onpause

    再点击返回主活动页面时打印 如下:

    04-10 17:22:46.798 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 活动准备好和用户进行交互的时候调用>> Onresume

    再点击返回退出app时打印

    04-10 01:20:35.510 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系统准备去启动或者恢复另一个活动的时候调用>> onpause

    04-10 01:20:36.031 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活动完全不可见的时候调用>> onstop

        活动被销毁之前调用>> onDestroy

    遇到的问题

    在运行过程中点击Start dialog activity 按钮弹出框的时候,会发生闪退

    分析出原因为类继承的问题,修改方法如下;

    修改DialoActivity.class中DialoActivity为继承Activity类,代码如下:

    package com.bignerdranch.android.activity_text;

    import android.app.Activity;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    public class DialoActivity extends Activity {

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.dialog_layout);

        }

    }

    zhangyongfeng"s blogs

    相关文章

      网友评论

        本文标题:Android:探究活动的生命周期

        本文链接:https://www.haomeiwen.com/subject/fwgnhftx.html