我爱编程

Android:探究活动的生命周期

2018-04-10  本文已影响0人  zhang_yongfeng

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

上一篇下一篇

猜你喜欢

热点阅读