Android:探究活动的生命周期

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容