Android四大组件——Activity(二)

一、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"><EditTextandroid: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" /><EditTextandroid: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" /><Buttonandroid: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.review02import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import java.io.Serializableclass Demo06Activity : AppCompatActivity() {//定义一个User类的对象,我们先使用putExtra进行传递data class User (val name:String,val age:Int,val gender:String):Serializableoverride 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.ConstraintLayoutxmlns: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"><TextViewandroid: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.review02import androidx.appcompat.app.AppCompatActivity
import android.os.Bundleclass Demo07Activity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_demo07)val user = intent.getSerializableExtra("user") as Demo06Activity.Userprintln(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"><EditTextandroid: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" /><EditTextandroid: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" /><Buttonandroid: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.review02import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import java.io.Serializableclass Demo08Activity : AppCompatActivity() {data class User(private val name:String,private val age:Int,private val gender:String):Serializableoverride 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.ConstraintLayoutxmlns: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"><TextViewandroid: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.review02import androidx.appcompat.app.AppCompatActivity
import android.os.Bundleclass Demo09Activity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_demo09)val bundle = intent.extrasval user = bundle?.getSerializable("user") as? Demo08Activity.Userprintln(user)}
}

二、Activity消息回传

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

activity_demo01.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns: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"><Buttonandroid:id="@+id/btn_login01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="有账号?请登录"tools:ignore="MissingConstraints" /><TextViewandroid: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.review03import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextViewclass 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 = 1startActivityForResult(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"><EditTextandroid: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" /><EditTextandroid: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" /><Buttonandroid: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.review03import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextViewclass 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 = 2setResult(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.rhkb.cn/news/489001.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot基于Redis+WebSocket 实现账号单设备登录.

引言 在现代应用中&#xff0c;一个账号在多个设备上的同时登录可能带来安全隐患。为了解决这个问题&#xff0c;许多应用实现了单设备登录&#xff0c;确保同一个用户只能在一个设备上登录。当用户在新的设备上登录时&#xff0c;旧设备会被强制下线。 本文将介绍如何使用 Spr…

【架构】从 Socket 的角度认识非阻塞模型

文章目录 前言1. 阻塞模型2. 非阻塞模型2.1 Reactor 模型优势2.2 Reactor 模型劣势 后记 前言 近期看了很多中间件的文章&#xff0c;RocketMQ&#xff0c;Dubbo 这些中间件内部的rpc通信都用的是非阻塞的模型。(Netty)&#xff0c;这里从 Socket 的角度总结一下。 1. 阻塞模…

location和重定向、代理

location匹配的规则和优先级 在nginx当中&#xff0c;匹配的对象一般是URI来匹配 http://192.168.233.62/usr/local/nginx/html/index.html 182.168.233.61/ location匹配的分类&#xff1a; 多个location一旦匹配其中之一&#xff0c;不在匹配其他location 1、精确匹配 …

ragflow连ollama时出现的Bug

ragflow和ollama连接后&#xff0c;已经添加了两个模型但是ragflow仍然一直warn&#xff1a;Please add both embedding model and LLM in Settings &#xff1e; Model providers firstly.这里可能是我一开始拉取的镜像容器太小&#xff0c;容不下当前添加的模型&#xff0c;导…

软件测试面试问答

文章目录 什么是软件&#xff1f;软件测试工程师的工作内容什么是软件测试&#xff1f;软件开发生命周期软件开发的几个阶段软件bug的五个要素Bug的十大要素:软件测试的分类软件测试方法分类单元测试设计测试用例的主要方法什么是测试用例测试用例几大要素你的测试职业发展是什…

python学习笔记—7—变量拼接

1. 字符串的拼接 print(var_1 var_2) print("supercarry" "doinb") name "doinb" sex "man" score "100" print("sex:" sex " name:" name " score:" score) 注意&#xff1a; …

Win10环境vscode+latex+中文快速配置

安装vscodelatex workshop 配置&#xff1a; {"liveServer.settings.donotVerifyTags": true,"liveServer.settings.donotShowInfoMsg": true,"explorer.confirmDelete": false,"files.autoSave": "afterDelay","exp…

AI生成不了复杂前端页面?也许有解决方案了

在2024年&#xff0c;编程成为了人工智能领域最热门的赛道。AI编程技术正以惊人的速度进步&#xff0c;但在生成前端页面方面&#xff0c;AI的能力还是饱受质疑。自从ScriptEcho平台上线以来&#xff0c;我们收到了不少用户的反馈&#xff0c;他们表示&#xff1a;“生成的页面…

【热力学与工程流体力学】流体静力学实验,雷诺实验,沿程阻力实验,丘里流量计流量系数测定,局部阻力系数的测定,稳态平板法测定材料的导热系数λ

关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…

360极速浏览器不支持看PDF

360安全浏览器采用的是基于IE内核和Chrome内核的双核浏览器。360极速浏览器是源自Chromium开源项目的浏览器&#xff0c;不但完美融合了IE内核引擎&#xff0c;而且实现了双核引擎的无缝切换。因此在速度上&#xff0c;360极速浏览器的极速体验感更佳。 展示自己的时候要在有优…

【深度学习】深刻理解ViT

ViT&#xff08;Vision Transformer&#xff09;是谷歌研究团队于2020年提出的一种新型图像识别模型&#xff0c;首次将Transformer架构成功应用于计算机视觉任务中。Transformer最初应用于自然语言处理&#xff08;如BERT和GPT&#xff09;&#xff0c;而ViT展示了其在视觉任务…

idea 配置 git .gitignore文件配置

.gitignore 内容 .idea/ *.iml target/ *.class *.log .iml在idea项目里面创建一个.gitignore名字的文件&#xff0c;然后把这个文件提交到git上。我一般是放到.idea同级目录。 我遇到了几种情况这个文件配置了但是不生效的情况 第一种 Git的缓存可能会导致配置不生效。尝试…

Scala的隐式转换

&#xff08;一&#xff09;隐式转换&#xff1a; 编译器 偷偷地&#xff0c;自动地帮我们把一种数据类型转换为另一种类型。例如&#xff1a;int --> double 它有失败的时候(double-->int),有成功的时候。 当它转换失败的时候&#xff0c;我们提供一个工具&#xff0c;让…

Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决

在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。 想要在Windows上安装Docker(实际上是基…

F12抓包01:启动、面板功能介绍、语言设置、前端样式调试

浏览器检查工具通常用来作为浏览器web服务测试过程中&#xff0c;辅助测试、排查问题、定位缺陷的工具。 本文以mac系统下&#xff0c;当前比较常用的Chrome浏览器为例&#xff0c;讲解“检查”工具的常用功能操作方法。 一、打开方式 **1、****鼠标操作&#xff1a;**浏览器…

仿iOS日历、飞书日历、Google日历的日模式

仿iOS日历、飞书日历、Google日历的日模式&#xff0c;24H内事件可自由上下拖动、自由拉伸。 以下是效果图&#xff1a; 具体实现比较简单&#xff0c;代码如下&#xff1a; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color;…

特征交叉-CAN学习笔记代码解读

一 核心模块coaction 对于每个特征对(feature_pairs)weight, bias 来自于P_inductionP_fead是MLP的input 举个例子&#xff1a;如果是用户ID和产品ID的co-action&#xff0c;且产品ID是做induction&#xff0c;用户ID是做feed。 step1 用户ID/产品ID都先形成一个向量&#xf…

Java从入门到工作3 - 框架/工具

3.1、SpringBoot框架结构 在 Spring Boot 或微服务架构中&#xff0c;每个服务的文件目录结构通常遵循一定的约定。以下是一个常见的 Spring Boot 服务目录结构示例&#xff0c;以及各个文件和目录的简要说明&#xff1a; my-service │ ├── src │ ├── main │ │…

基于SpringBoot的青少年心理健康教育网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

基于事件驱动的websocket简单实现

websocket的实现 什么是websocket&#xff1f; WebSocket 是一种网络通信协议&#xff0c;旨在为客户端和服务器之间提供全双工、实时的通信通道。它是在 HTML5 规范中引入的&#xff0c;可以让浏览器与服务器进行持久化连接&#xff0c;以便实现低延迟的数据交换。 WebSock…