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.生命周期流程图

在这里插入图片描述

 3.程序

 3.1.AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitylifecycletest">

    <application
        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/Theme.ActivityLifeCycleTest">
        <activity
            android:name=".normal"
            android:exported="false" />
        <activity
            android:name=".DialogActivity"
            android:exported="true"
            android:theme="@style/Theme.AppCompat.Dialog"/>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

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

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

 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")
    }
}

实例结果:

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")
        }

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值