Android Activity生命周期探寻

Android Activity生命周期探寻

返回栈

Android是通过使用任务(task)来管理Activity的,一个task就是一组存放在栈里的Activity集合,这个栈也叫返回栈(back stack),在默认情况下每当启动一个新的Activity,它就会在返回栈的栈顶出现,每当使用back或者调用finish()方法时候,栈顶的Activity就会出栈,前一个出现的Activity就会重新回到栈顶的位置。
在这里插入图片描述

Activity状态

1.运行状态

当Activity位于栈顶,就是运行状态,该状态不被回收

2.暂停状态

当Activity不处于栈顶,但仍然可见,此时处于暂停状态。比如对话框Activity,没有完全不见,所以处于暂停状态,一般这种状态不会被回收,只有内存极低的情况下才会回收,

3.停止状态

当一个Activity不再处于栈顶位置时,并且完全不可见,此时进入停止状态,即使在这种状态下仍会为其保存相应的状态和变量,但是并不完全可靠,当需要内存时,系统会将其回收

4.销毁状态

一个Activity从返回栈中完全移除后就变成了销毁状态,系统最倾向于回收这种Activity

Activity的生存期

Activity定义了七个回调方法,覆盖了其每一环

(1)onCreate():在Activity第一次被创建时调用,在其初始化操作,加载布局,绑定事件等

(2)onStart():在Activity不可见时候调用

(3)onResume() :在Activity准备好和用进行交互时候使用,此时activity在返回栈的栈顶,处于运行状态

(4)onPause() :在系统准备去启动或者恢复另一个activity时候调用,这个方法会释放占用cpu的资源,以及保存写关键数据,快速操作

(5)onStop() :在Activity完全不可见再去调用它与onPause的区别是,如果是一个dialog的activity 会调用onPause 否则调用onStop

(6)onDestory() :在activity被销毁之前调用,之后activity变为销毁状态

(7)onRestart() : 在activity变为停止状态之前调用, 顾名思义重启

以上除了最后第一个以外,其他都是两两相对,所以可以分为三个生存期

1.完整生存周期:在onCreate()进行初始化 在onDestory()完成销毁

2.可见生存期:在可见生存期Activity是可见的,可以通过这俩方法合理的管理那些对用户可见的资源,onStart()方法中完成各种初始化操作,onStop()方法中对资源进行释放,保证停止的资源不会占用太多内存。

3.前台生存期:在onPause() 和onResume() 之间的就是这个时期,在此期间Activity总是运行的,这个时期的Activity可以和用户产生交互
在这里插入图片描述
借用一张图片更好的理解Activity的生存期

实例

该例子可以更好的理解的Android的七个生存期,该例子需要有一个mainActivity 和 一个普通的对话框Activity和一个normalActivity

//main Activity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/startNormalActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/startnormalactivity"
        />

    <Button
        android:id="@+id/startDialogActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/startdialogactivity"
        />

</LinearLayout>

//dialog <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/startNormalActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/startnormalactivity"
        />

    <Button
        android:id="@+id/startDialogActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/startdialogactivity"
        />

</LinearLayout>

//dialog Activity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a dialog activity"
        />
//文字部件<TextView/>
</LinearLayout>

//normal Activity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a normal activity"
        />

</LinearLayout>

然后将DialogActivity设置为对话框模式,在AndroidManifest.xml修改以下代码

 <activity android:name=".DialogActivity"
           android:theme="@style/Theme.AppCompat.Dialog">
//android:them属性 相当于给Activity指定主题 此处就是对话框主题
  </activity>

最后实现MainActivity的代码

package com.ybr.activitylifecycletest

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    private val tag = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(tag, "OnCreate")//初始化onCreate
        setContentView(R.layout.activity_main)
        startNormalActivity.setOnClickListener {//按键ID
            val intent = Intent(this, NormalActivity::class.java)
            startActivity(intent)//显示调用Activity
        }
        startDialogActivity.setOnClickListener {
            val intent = Intent(this,DialogActivity::class.java)
            startActivity(intent)
        }
    }

    override fun onStart() {
        super.onStart()
        Log.d(tag, "Onstart")
    }

    override fun onResume() {
        super.onResume()
        Log.d(tag, "onResume")
    }

    override fun onStop() {
        super.onStop()
        Log.d(tag, "onStop")
    }

    override fun onPause() {
        super.onPause()
        Log.d(tag, "onPause")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d(tag, "onDestroy")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d(tag, "onRestart")
    }
}

在onCreate()方法中,为两个按键注册了点击事件,第一个启动NormalActicity,第二个则启动DialogActicity。在这里插入图片描述
在这里插入图片描述
启动 先调用了onCreate函数用于初始化主Acticity,接着主Acticity还没有显示的情况下调用onStart函数,而onResume调用则是在前台生存期和用户交互时候。接下来按第一个按键
在这里插入图片描述
在这里插入图片描述
此时需要启动NormalActicity 此时调用onPause函数,接下来 当NormalActicity加载出来 主Acticity彻底不可见,所以直接调onStop函数,接下来进行返回操作
在这里插入图片描述
此时主Acticity重新启动,又回来和第一步一样的流程接下来按第二个按键
在这里插入图片描述
在这里插入图片描述
此时 主Acticity消失了又没有完全消失处在暂停状态,所以只调用了onPause函数,接下来再进行返回操作,直接返回主Acticity继续和用户交互
在这里插入图片描述
最后退出程序在这里插入图片描述
用栈的思想理解如下图所示
在这里插入图片描述
最后将栈内的所有按顺序出栈就完整的结束了整个app的生命

注:上图内存不足 dialog返回会调用onCreate方法,重新创建

感谢《第一行代码(第3版)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值