Android四大组件——Activity(二)

news2024/12/24 2:14:05

一、Activity之间传递消息

在(一)中,我们把数据作为独立的键值对进行传递,那么现在把多条数据打包成一个对象进行传递:

1.假设有一个User类的对象,我们先使用putExtra进行传递

activity_demo06.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo02Activity">

    <EditText
        android:id="@+id/et_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="账号:"
        android:hint="请输入账号"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码:"
        android:hint="请输入密码"
        app:layout_constraintTop_toBottomOf="@+id/et_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"
        app:layout_constraintTop_toBottomOf="@+id/et_password"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo06Activity.kt

package com.example.review02

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import java.io.Serializable

class Demo06Activity : AppCompatActivity() {
    //定义一个User类的对象,我们先使用putExtra进行传递
    data class User (val name:String,val age:Int,val gender:String):Serializable
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo06)

        val btn = findViewById<Button>(R.id.btn_login)
        val user = User("ebb",26,"male")
        btn.setOnClickListener {
            val intent = Intent(this,Demo07Activity().javaClass)
            intent.putExtra("user",user)
            startActivity(intent)
        }
    }
}

activity_demo07.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo03Activity">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="activity2"
        android:textSize="26sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo07Activity.kt

package com.example.review02

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class Demo07Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo07)

        val user = intent.getSerializableExtra("user") as Demo06Activity.User
        println(user)
    }
}

2.再使用Bundle来传递

activity_demo08.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo02Activity">

    <EditText
        android:id="@+id/et_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="账号:"
        android:hint="请输入账号"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码:"
        android:hint="请输入密码"
        app:layout_constraintTop_toBottomOf="@+id/et_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"
        app:layout_constraintTop_toBottomOf="@+id/et_password"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo08Activity.kt

package com.example.review02

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import java.io.Serializable

class Demo08Activity : AppCompatActivity() {
    data class User(private val name:String,private val age:Int,private val gender:String):Serializable
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo08)

        val btn = findViewById<Button>(R.id.btn_login)
        val user = Demo06Activity.User("ebb", 26, "male")
        btn.setOnClickListener {
            val intent = Intent(this,Demo09Activity().javaClass)
            val bundle = Bundle()
            bundle.putSerializable("user",user)
            intent.putExtras(bundle)
            startActivity(intent)
        }
    }
}

activity_demo09.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo03Activity">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="activity2"
        android:textSize="26sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo09Activity.kt

package com.example.review02

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class Demo09Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo09)

        val bundle = intent.extras
        val user = bundle?.getSerializable("user") as? Demo08Activity.User
        println(user)
    }
}

二、Activity消息回传

目前我们已经可以从Activity向另一个Activity传递消息。有时候从当前Activity返回上一个Activity时也需要传递消息。这时候需要使用安卓中Activity的消息回传。

activity_demo01.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo01Activity">

    <Button
        android:id="@+id/btn_login01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="有账号?请登录"
        tools:ignore="MissingConstraints" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="游客"
        android:textSize="26sp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo01Activity.kt

package com.example.review03

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class Demo01Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo01)

        val btn = findViewById<Button>(R.id.btn_login01)
        btn.setOnClickListener {
            val intent = Intent(this,Demo02Activity().javaClass)
            val REQUEST_CODE = 1
            startActivityForResult(intent,REQUEST_CODE)
        }
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == 2) {
            val name = data?.getStringExtra("name")
            val tvName = findViewById<TextView>(R.id.tv_name)
            tvName.text = name
        }
    }
}

activity_demo02.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Demo02Activity">

    <EditText
        android:id="@+id/et_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="账号:"
        android:hint="请输入账号"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="密码:"
        android:hint="请输入密码"
        app:layout_constraintTop_toBottomOf="@+id/et_name"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

    <Button
        android:id="@+id/btn_login01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录"
        app:layout_constraintTop_toBottomOf="@+id/et_password"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

Demo02Activity.kt

package com.example.review03

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView

class Demo02Activity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_demo02)

        val etName = findViewById<EditText>(R.id.et_name)
        val intent = Intent()
        intent.putExtra("name",etName.text.toString())
        val RESULT_OK = 2
        setResult(RESULT_OK,intent)
        finish()
    }

}

三、Activity的任务栈和启动模式

当我们从Activity_2向Activity_1中回传消息时,调用Activity_2的finish方法,返回到了Activity_1,而不是退出程序。这就是因为安卓中存在任务栈。

在 Android 中,Activity 的启动模式定义了当一个活动已经存在时,系统如何处理新的启动请求。Android 提供了四种不同的启动模式来管理 Activity 的行为。这些启动模式通过在AndroidManifest.xml 文件中的 <activity> 元素中设置 android:launchMode 属性来指定。

standard(标准模式)

这是默认的启动模式。 每次启动一个新的活动时,系统都会创建一个新的实例,并将其放置在任务的顶部。 无论活动是否已经存在,都会创建新的实例。 这意味着,无论何时启动该活动,都会创建该活动的新实例。

singleTop(单顶模式)

在这种模式下,如果新的活动已经位于任务的顶部,且具有相同的类型,则系统不会创建新的实例,而是会重用位于栈顶的现有实例。 如果新的活动不在任务的顶部,系统将会创建新的实例,并将其置于栈顶。 例如应用具有一个主界面或主菜单,用户可能会在任何时候返回到该界面。使用 singleTop 模式可以确保不会创建新的主界面实例。

singleTask(单任务模式)

在这种模式下,系统会为活动创建一个新的任务,并且在这个任务中只能存在一个该类型的实例。 如果已经存在该类型的任务,则系统会将该任务调到前台,而不会创建新的实例。 适合作为应用的入口点的活动。例如应用启动时依次压入主界面和启动页面(比如显式广告),启动完毕后进入主界面,并且不会回退到任何页面。

singleInstance(单实例模式)

在这种模式下,系统会创建一个新的任务,并且该任务只能有一个该类型的实例。 即使从其他应用启动该活动,系统也会在新的任务中创建该活动的实例。 适合作为全局共享的单一资源。例如,一个音乐播放器应用可能会有一个后台播放服务,该服务需要在应用处于前台或后台时播放音乐,而不管用户在应用中的哪个部分。

不管如何调用Activity,该Activity都独立存在于一个任务中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32G4系列MCU双ADC多通道数据转换的应用

目录 概述 1 STM32Cube配置项目 1.1 基本参数配置 1.1.1 ADC1参数配置 1.1.2 ADC2参数配置 1.2 项目软件架构 2 功能实现 2.1 ADC转换初始化 2.2 ADC数据组包 3 测试函数 3.1 Vofa数据接口 3.2 输入数据 4 测试 4.1 ADC1 通道测试 4.2 ADC2 通道测试 概述 本文…

STM32串口接收与发送(关于为什么接收不需要中断而发生需要以及HAL_UART_Transmit和HAL_UART_Transmit_IT的区别)

一、HAL_UART_Transmit和HAL_UART_Transmit_IT的区别 1. HAL_UART_Transmit_IT&#xff08;非阻塞模式&#xff09;&#xff1a; HAL_UART_Transmit_IT 是非阻塞的传输函数&#xff0c;也就是说&#xff0c;当你调用 HAL_UART_Transmit_IT 时&#xff0c;它不会等到数据完全发…

constexpr、const和 #define 的比较

constexpr、const 和 #define 的比较 一、定义常量 constexpr 定义&#xff1a;constexpr用于定义在编译期可求值的常量表达式。示例&#xff1a;constexpr int x 5;这里&#xff0c;x的值在编译期就确定为5。 const 定义&#xff1a;const表示变量在运行期间不能被修改&…

BMS电池管理系统

一.项目简介 1.该项目是基于BQ7692003PWR STM32F103C8T6研发的一块锂电池控制板&#xff0c;本控制板可供五串18650锂电池&#xff08;目前软件仅支持三元锂类型&#xff0c;标称电压为4.2V&#xff09;串联使用&#xff0c;电芯均衡采用被动均衡方式 二.本项目功能 1.监控任…

Milvus向量数据库01-基础概念

Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection&#xff0c;然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …

【OpenCV】模板匹配

理论 模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。为此&#xff0c;OpenCV 带有一个函数 cv.matchTemplate&#xff08;&#xff09; 。它只是在输入图像上滑动模板图像&#xff08;如在 2D 卷积中&#xff09;&#xff0c;并比较模板图像下的模板和输入图像的补…

深入解析下oracle的number底层存储格式

oracle数据库中&#xff0c;number数据类型用来存储数值数据&#xff0c;它既可以存储负数数值&#xff0c;也可以存储正数数值。相对于其他类型数据&#xff0c;number格式的数据底层存储格式要复杂得多。今天我们就详细探究下oracle的number底层存储格式。 一、环境搭建 1.…

MySQL Binlog 日志监听与 Spring 集成实战

MySQL Binlog 日志监听与 Spring 集成实战 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种常见的格式&#xff1a;Statement 模式、Row 模式和Mixed 模式。每种模式的设计目标不同&#xff0c;适用于不同的场景&#xff0c;以下是它们的详细对比和…

Vmware Vcenter7.0证书web续期发生错误

1. 故障描述 vSphere Client 版本 7.0.2.00200 vCenter _MACHINE_CERT快到期了&#xff0c;通过web界面更新证书失败 第一步先这样&#xff0c;重新续订一下证书 续订发生错误 2. 解决办法 2.1. 前提工作 登陆ssh到vcenter&#xff0c;重新生成证书 先关掉HA&#xff…

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展

向Oracle 19g数据库中批量插入数据&#xff0c;当插入近2亿条数据后&#xff0c;报出如下错误&#xff1a; ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间&#xff0c;发现表空间大小已达到32G&#xff0c;表空间无法进行自动扩展了。&#xff08;初始…

数据结构(3)单链表的模拟实现

上一节我们进行了数据结构中的顺序表的模拟式现&#xff0c;今天我们来实现一下另外一个数据结构&#xff1a;单链表。 我们在实现顺序表之后一定会引发一些问题和思考&#xff1a; 1.顺序表在头部和中间插入数据会用到循环&#xff0c;时间复杂O&#xff08;N&#xff09; …

如何高效的向AI大模型提问? - 提示工程Prompt Engineering

大模型的输入&#xff0c;决定了大模型的输出&#xff0c;所以一个符合要求的提问Prompt起到关键作用。 以下是关于提示工程Prompt Engineering主要方法的详细表格&#xff0c;包括每种方法的优点、缺点、应用场景以及具体示例&#xff1a; 主要方法优点缺点应用场景示例明确性…

python正则化表示总结

1.字符 总结&#xff1a; .匹配除“\n”以外的所有字符[…]字符集&#xff0c;…为所给出的范围&#xff0c;如&#xff1a;[a-zA-Z]表示逐个列出所有字符&#xff0c;[0-9]表示逐个列出所有数字[^…]^表示取反&#xff0c;如 [^0-9] 等同于出数字以外所有字符[…]并[…]也可…

BlueOS安装与DVL插件安装

我的blueos端又进不去了&#xff0c;查了查原因SD卡竟然裂开了&#xff01;故重新下载附步骤&#xff1a; 官方网址&#xff1a;BlueOS Documentation DVL插件安装参考&#xff1a;Water Linked DVL A50 Support - Third Party Products / Sonar and Acoustics - Blue Roboti…

学者观察 | Web 3.0生态治理及其安全——北京交通大学副教授李超

导语 李超教授认为Web 3.0中无论是链上治理还是链下治理都有其优劣。链下治理机制更侧重于社区广泛参与和讨论&#xff0c;过程较为繁琐&#xff0c;但能够形成广泛的社区支持和参与&#xff0c;增强决策的合法性和接受度&#xff1b;链上治理机制通过直接在区块链上执行决策&…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

二叉树节点相关算法题|双分支节点个数|所有左叶子之和|每一层节点平均值(C)

双分支节点个数 假设二叉树采用二叉链表存储结构存储&#xff0c;试设计一个算法&#xff0c;计算一棵给定二叉树的所有双分支节点个数 算法思想 计算一棵二叉树中所有双分支节点个数的递归模型 若树为空&#xff0c;结果为0 若当前节点为双分支节点&#xff0c;递归左右孩子…

交互开发---测量工具(适用VTK或OpenGL开发的应用程序)

简介&#xff1a; 采用VTK开发应用程序时&#xff0c;经常需要开发各种各样的测量工具&#xff0c;如果沿用VTK的widgets的思路&#xff0c;绘制出来的的控件不够漂亮&#xff0c;且交互不太灵活&#xff0c;并且随着测量工具的增强&#xff0c;渲染的效率也会有所降低。基于上…

【LEAP模型建模】能源需求/供应预测、能源平衡表核算、空气污染物排放预测、碳排放预测、成本效益分析、交通运输碳排放、电力系统优化等专题应用

采用部门分析法建立的LEAP&#xff08;Long Range Energy Alternatives Planning System/ Low emission analysis platform&#xff0c;长期能源可替代规划模型&#xff09;是一种自下而上的能源-环境核算工具&#xff0c;由斯德哥尔摩环境研究所和美国波士顿大学联合研发。该模…

HarmonyOS-中级(三)

文章目录 合理使用动画和转场Web组件和WebView给应用添加通知和提醒 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;HarmonyOS专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月08日12点12分 合理使用动画和转场 动效场景设计&#x…