Android Studio----------Acrivity的生命周期

1.生命周期介绍

1.1 活动栈

Android中的活动是可以层叠的每启动一个新的活动,就会覆盖在原活动之上,点击Back键或调用finish()方法会销毁最上面的活动,下面的一个活动就会重新显示

1.2 活动的四种状态

运行状态:处于活动栈的栈顶
暂停状态:不再处于栈顶,但仍然可见
停止状态:不再处于栈顶,且完全不可见
销毁状态:从活动栈中移除

1.3 活动的生存期

onCreate():活动第一次创建的时候调用,完成初始化操作
onStart():由不可见变为可见的时候调用
onResume():活动准备好和用户进行交互的时候调用,此时的活动一定位于返回栈的栈顶
onPause():在系统准备去启动或者恢复另一个活动的时候调用,释放消耗cpu的资源,保存关键数据
onStop():在活动完全不可见的时候调用
onDestroy():在活动被销毁之前调用
onRestart():在活动由停止状态变为运行状态之前调用
完整生存期:onCreate()与onDestroy()之间经历的,在onCreate()完成初始化,在onDestroy()释放内存
可见生存期:onStart()与onStop()之间经历的,活动对于用户总是可见的
前台生存期:onResume()与onPause()之间经历的,活动总是运行状态,与用户交互

2.生命周期流程图

Android Studio----------Acrivity的生命周期_第1张图片

 3.程序

 3.1.AndroidManifest.xml




    
        
        
        
            
                

                
            
        
    

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

这句程序是将这个Activity定义成对话框的形式

Android Studio----------Acrivity的生命周期_第2张图片

 3.2  MainActivity

package com.example.activitylifecycletest

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.example.activitylifecycletest.databinding.ActivityMainBinding


class MainActivity : AppCompatActivity() {
    private  val tag="MainActivity"
    private  lateinit var binding: ActivityMainBinding //1

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(tag,"onCreate")
        setContentView(R.layout.activity_main)
        val binding=ActivityMainBinding.inflate(layoutInflater)//2
        setContentView(binding.root)//3

        binding.startNormalActivity.setOnClickListener {
            val intent=Intent(this,normal::class.java)
            startActivity(intent)
        }

        binding.startDiglogActivity.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 onPause() {
        super.onPause()
        Log.d(tag,"onPause")
    }

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

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

实例结果:Android Studio----------Acrivity的生命周期_第3张图片

4.Activity被回收数据怎么办 

首先先定义一个onSaveInstanceState()接口

 //通过调用onSaveInstanceState,将临时数据进行保存,当内存不够时,这个活动界面被杀掉时,会保证在被回收前被调用
    //onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方法用于保存数据,
    // 比如可以使用putString()方法保存字符串,使用putInt()方法保存整型数据,以此类推。每个保存方法需要传入两个参数,
    // 第一个参数是键,用于后面从Bundle中取值,第二个参数是真正要保存的内容。
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        val tempData="这是一个测试数据"
        outState.putString("data_key",tempData)
    }

 然后在onCreate中设置如下:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d(tag,"onCreate")
        setContentView(R.layout.activity_main)

        //onCreate()方法其实也有一个Bundle类型的参数。这个参数在一般情况下都是null,
        // 但是如果在Activity被系统回收之前,你通过onSaveInstanceState()方法保存数据,这个参数就会带有之前保存的全部数据,
        // 我们只需要再通过相应的取值方法将数据取出即可。
        if (savedInstanceState != null){
            val tempData=savedInstanceState.getString("data_key")
        }

你可能感兴趣的:(kotlin)