Android --- Activity

官方文档-activity

Activity 提供窗口,供应在其中多个界面。此窗口通常会填满屏幕,但也可能小于屏幕并浮动在其他窗口之上。

大多数应用包含多个屏幕,这意味着它们包含多个 Activity。通常,应用中的一个 Activity 会被指定主 Activity,即用户启动应用时显示的第一个屏幕。然后,每个 Activity 都可以启动另一个活动,以执行不同的操作。

Activity提供一个能让用户操作并与之交互的界面。

AppCompatActivity

AppCompatActivity 继承了 Activity 类,拥有了窗口的特性,是一个可视化界面,MainActivity是一个可视化界面正是由于它继承了 AppCompatActivity。

配置清单

声明文件 Activity

在清单文件中声明 Activity,添加<activity>元素作为<application>元素的子元素,如:

<manifest ... ><application ... ><activity android:name=".ExampleActivity" />...</application ... >...
</manifest >

 android:name,必需属性,用于指定Acitiviy的类名称。

该步骤在新建activity文件时会自动创建

IntentFilter 意图过滤器 

<action android:name="xxxxx" />        action表示动作,就是想要做的事情的名称,给当前actitvity起别名,但不能乱起
<category android:name="android.intent.category.DEFAULT" />        指定当前活动的类型
<data android:mimeType="text/plain" />        指定活动能发送的类型

<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

 android.intent.action.MAIN -> 入口activity

Intent

Intent是 Activity、Serviece和 BroadcastReceiver三个应用组件之间进行通信的信使,它还可以携带数据。

Intent分类

显示意图:明确目标组件的意图

Intent(Context packageContext, Class<?> cls)

常用在操作当前应用的组件

隐式意图:没有明确目标组件的意图

Intent(String action)

常用在使用其他应用的组件时

activity 的启动(跳转)

 activity的跳转

Intent intent = new Intent(ButtonActivity.this,MainActivity.class);
startActivity(intent);

一般启动 

隐式启动使用隐式意图

在运行时才知道能打开哪一个界面

隐式启动的两种构造方法
* public Intent(String action, Uri uri)
* public Intent(String action)
* action:Activity的别名 ,编译阶段无论写什么的都不会报错
* uri: Uri对象,打开的路径
// 打开百度 
Intent intentS = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
startActivity(intentS);
显示启动使用显式意图

在运行前知道到底要启动哪一个界面-使用意图

Intent(Context packageContext, Class<?> cls)

一般返回

跳转后返回只需要使用 finish() 结束当前activity 

带回调启动

startActivityForResult(Intent intent,int requestCode);

跳转到第二个页面,设置请求码为1000

Intent intent = new Intent(this,ActivityLife.class);
// 参数2:请求码
startActivityForResult(intent,1000);

带结果的返回

setResult(int resultCode,Intent data) 设置要返回的结果 

第二个页面返回数据:

 // 通过startActivityForResult启动activity-返回结果public void backRes(View view) {// 设置结果Intent intent = new Intent();  //此时intent不作为跳转使用,而是用来传递返回的数据intent.putExtra("返回的数据","第二个界面返回的是10000000");/*参数1:请求码 参数2:返回的数据*/setResult(RESULT_OK,intent);finish(); //结束当前Acticity}

 在第一个页面调用 onActivityResult 方法处理返回的数据:

如果通过 startActivityForResult 启动了第二个activity,当第二个activity处理结束后,再回到当前activity时,一定会自动回调 onActivityResult 方法 。在 onActivityResult 方法中我们可以处理第二个activity返回的结果。(如。拍照后得到的照片,从图库中选取的图片)

  • 参数1 requestCode:请求码。当有多个 startActivityForResult 时,可以用来判断该结果来自于哪个activity,从而进行什么操作
  • 参数2 resultCode:结果码 0 = RESULT_CANCEL->取消 | -1 = RESULT_OK 正确处理后返回。判断它是为了判断新开的activity有没有处理完这些事
  • 参数3 Intent (可以为空):返回的结果存放在这里。通过 getStringExtra() 获取数据(此时已经知道结果是String类型的数据)
    @Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);// 判断新开的activity返回的结果/* 当返回结果都是成功时,请求码==1000则进行操作 */if(resultCode == -1){if(requestCode == 1000){assert data != null;Log.e("ActivityWithResults","自动进入onActivityResult requestCode:"+requestCode+",resultCode:"+resultCode+",返回的数据"+data.getStringExtra("返回的数据"));}}

Intent携带数据 

intent.putExtra(String name,XXX value) 保存数据

intent.getXXXExtra(String name) 获取数据

activity 之间数据传递

getIntent()获取携带数据的意图

  • 传递简单内容

A的activity(传递)

  Intent intent = new Intent(this,ActivityLife.class);//添加参数intent.putExtra("传递的String类型参数","这是上一个页面传递过来的String类型参数");intent.putExtra("传递的double类型参数",24.99);intent.putExtra("传递的int类型参数",24);intent.putExtra("传递的bool类型参数",false);startActivity(intent);

B的activity(接收)

// 获取上一个页面传递过来的数据,获取数据时有些需要给出默认值
Intent getIntent = getIntent();
String dataString = getIntent.getStringExtra("传递的String类型参数");
int dataInt = getIntent.getIntExtra("传递的int类型参数",1);
double dataDouble = getIntent.getDoubleExtra("传递的double类型参数",2.1);
boolean dataBool = getIntent.getBooleanExtra("传递的bool类型参数",true);TextView textView = findViewById(R.id.show);
textView.setText("上一个页面传递是数据"+dataString+dataInt+dataDouble+dataBool);
  • 传递对象内容 

intent.getSerializableExtra(String name)  获取序列化对象数据

新建一个Student对象类

package com.example.androidstudiostudy.data;import java.io.Serializable;// 将对象序列化,序列化的作用
/* 1.想把内存中的对象保存到一个文件活数据库中时* 2.想利用套接字Socket在网络中传递对象*/
public class Student implements Serializable {private String name;private  int age;private  double money;private  boolean check;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}public boolean isCheck() {return check;}public void setCheck(boolean check) {this.check = check;}public Student(String name, int age, double money, boolean check) {this.name = name;this.age = age;this.money = money;this.check = check;}
}

A页面传递:

// 实例化一个新建的 Student 对象
Student student1 = new Student("沈成林",23,200000.999,true);
// 参数1:String name - 本次数据的名称
// 参数2:@Nullable Serializable value - 序列化数据对象
intentC.putExtra("data_object",student1);
startActivity(intentC);

B页面接收: 

Intent getIntent = getIntent();
// 获取对象数据 - 强转成 Student 对象
Student student = (Student) getIntent.getSerializableExtra("data_object");
if (student != null) {TextView textView2 = findViewById(R.id.show2);textView2.setText("上一个页面传递是数据"+student.getName()+student.getAge()+student.getMoney()+student.isCheck());
else {// 处理student对象为空的情况,比如给出一个默认值或者显示错误信息TextView textView2 = findViewById(R.id.show2);textView2.setText("上一个页面未传递有效的Student对象");}

activity 的生命周期

  • onCreate() 在系统创建 activity 时触发,完成加载布局和初始化的工作。
  • onStart() 可以理解为启动状态,此时的界面还没能完全的展示出来, 还在准备中
  • onResume() 说明activity已经完全进入到了前台准备完成,可以和用户进行交互了,只有经历此方法,才能进入运行状态。
  • onPause() 当activity进入到不可操作的状态时,会回调该方法。

何时会进入到不可操作的状态?

有另一个activity进入到了前台(本activity被部分挡住了)。此时虽然不可操作,但是部分可见的

  • onRestart()
  • onStop() 当activity完全看不到了,就会回调该方法
  • onDestory() 当要退出activity的时候,就会执行这个方法

当有一个活动A来到前台完全启动后,有一个活动B也来到前台,慢慢启动时,A就会进入到onPause()方法,暂停活动,当B完全准备好后,A就会彻底的停止,进入onStop()方法

activity的四种状态

  • 运行状态:可见且可操作
  • 暂停状态:可见但不可操作
  • 停止状态:不可见,但对象存在
  • 死亡状态:对象不存在

activity 状态变化

运行-死亡:onPause() ->onStop()->onDestory()

死亡-运行:onCreate() ->onStart()->onResume()

运行-停止:onPause() ->onStop()

停止-运行:onRestart()->onStart()->onResume()

运行-暂停:onPause()

暂停-运行:onResume()

activity的Task Stack(任务栈 )

栈:后进先出

一个应用启动,系统就会为其创建一个对应的任务栈来存储并管理该应用的Activity对象。

只有栈顶的activity才会被显示。

系统中会有多个应用,同时也会有多个任务栈。

当前应用的任务栈会在我们打开其他应用或者转到主屏幕时转移到后台,在后台时,任务中的所有 activity 都会停止,但任务的返回堆栈保持不变,即当其他任务发生时,任务会失去焦点。

 当它回到前台时,会从上次停下的地方继续执行。

由于返回堆栈中的 activity 绝不会重新排列,因此,应用中的一个 activity 可能会多次实例化,即使来自不同的任务也是如此,如果不想启动多次,可以管理activity的启动模式。

activity 的四种启动(加载)模式

Standard  标准模式 (默认)

每一次调用startActivity()都会创建一个新的实例,不管栈内是否存在该实例,打开就会放入任务栈,返回时依次从后退栈。

在清单文件中设置启动模式:

android:launchMode="standard"

SingleTop 顶部复用

顶部是你正想要打开的activity,直接复用,不会新建实例,如果没有,则会新建实例再放入栈中。

注意,一定要在顶部,不然退栈顺序和标准模式一样

 在清单文件中设置启动模式:

android:launchMode="singleTop"

从MainActivity -> MainActivity->MainActivity-> MainActivity

此时顶部就是要打开的activity,直接复用,所以只返回一次就到了主页

SingleTask 栈内复用模式

想打开已经打开过的 activity B,此模式会保证栈中只有一个,会弹出B之后的所有activity,保证它重回栈顶

android:launchMode="singleTask"

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

只返回一次就回到主页,因为此时想打开MainActivity,但栈中此时已经有了,根据栈内复用的特性它会退出MainActivity后的所有activity, ButtonActivity ->ConstraintActivity

SingleInstance 全局唯一模式

想要打开新activity,会放在一个新的任务栈中且该Task有且只有一个activity实例,如果已经创建过该activity实例,则不会再创建新的任务栈,只会将之前的唤醒。

<activityandroid:launchMode="singleInstance"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>

MainActivity ->ButtonActivity ->ConstraintActivity ->MainActivity

返回到ButtonActivity后再返回就直接回到了主页。这是由于MainActivity在一个单独的任务栈中,在第一次返回的时候已经被撤销了。

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

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

相关文章

【计算机考研】「软件工程」VS「电子信息」专硕有什么不同?

就今年的24国考来说&#xff0c;计算机技术&#xff08;085404&#xff09;能报的只是比计算机科学与技术少那么一点点&#xff08;因为“计算机类”它都可以报&#xff0c;只有写计算机科学与技术的报不了&#xff09;相对于其他天坑专业来说还是好很多的&#xff01; 本人双…

flask 应用程序

flask 程序示例 创建 hello.py 文件&#xff1a; # 导入 Flask 模块。Flask 类的一个对象是 wsgi 应用程序。 from flask import Flask# 创建app对象, Flask构造函数将当前模块的名称(__name__)作为参数。 app Flask(__name__)# route() 函数是一个装饰器&#xff0c;它告诉应…

redmibook 14 2020 安装 ubuntu

1. 参考博客 # Ubuntu20.10系统安装 -- 小米redmibook pro14 https://zhuanlan.zhihu.com/p/616543561# ubuntu18.04 wifi 问题 https://blog.csdn.net/u012748494/article/details/105421656/# 笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠 https://blog.csdn.net/…

Redis从入门到精通(十四)Redis分布式缓存(二)Redis哨兵集群的搭建和原理分析

文章目录 前言5.3 Redis哨兵5.3.1 哨兵原理5.3.1.1 集群的结构和作用5.3.1.2 集群监控原理5.3.1.3 集群故障恢复原理 5.3.2 搭建哨兵集群5.3.3 RedisTemplate5.3.3.1 搭建测试项目5.3.3.2 场景测试 前言 Redis分布式缓存系列文章&#xff1a; Redis从入门到精通(十三)Redis分…

VM虚拟机安装Linux系统Redhat7.4版本

1、打开VM软件创建一个新的虚拟机&#xff1a; 可选择经典安装&#xff0c;也可以选择自定义安装&#xff0c;本次选择自定义安装&#xff0c;然后选择下一步 2、直接默认选择下一步即可 3、选择稍后安装操作系统&#xff0c;选择下一步 4、之后选择呢需要安装客户机的操作系统…

[Algorithm][滑动窗口][长度最小的子数组] + 滑动窗口原理

目录 0.滑动窗口原理讲解1.长度最小的子数组1.题目链接2.算法原理讲解3.代码实现 0.滑动窗口原理讲解 滑动窗口&#xff1a;“同向双指针”滑动窗口可处理「⼀段连续的区间」问题如何使用&#xff1f; left 0, right 0进窗口判断 是否出窗口 更新结果 -> 视情况而定 可能…

ChatGPT4.5:能力大提升,全新体验

说明 ChatGPT4是2023年的5月份发布的&#xff0c;马上就发布一周年了。其他的大语言模型&#xff0c;比如Claude和开源的Lama也相继更新了最新版本。而根据目前国外发布的各种消息来看&#xff0c;ChatGPT4.5也即将发布。 GPT-4.5 Turbo 发布时间 最新消息显示&#xff0c;Op…

OceanBase 4.3 列存存储格式和列存索引存储格式

以 t1 表和索引为例子&#xff0c;下面两张图说明了存储层如何存储数据。 create table t1 (id1 int, id2 int, name varchar(10), salary int, primary key(id1, id2)) with column group (each column);create index idx (name) storing(salary) with column group(each co…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置&#xff0c;然后标记起来对应left&#xff0c;如果只有一个零&#xff0c;只需要left后面的数中有>1的数就能跳过去&#xff0c;如果是00&a…

深澜计费管理系统 /demo/proxy存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 深澜计费管理系统是一款用于网络设备计费管理的软件…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称&#xff1a;InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点&#xff0c;1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…

【.Net动态Web API】背景与实现原理

&#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09; 专栏介绍&#xff1a;通过源码实例来讲解Asp.Net Core进阶知识点&#xff0c;让大家完全掌握每一…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…

【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Sele…

大型网站系统架构演化实例_1.单体架构和垂直架构

大型网站的技术挑战主要来自于庞大的用户&#xff0c;高并发的访问和海量的数据&#xff0c;任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户&#xff0c;问题就会变得很棘手。通常大型网站架构主要解决这类问题。 1.第一阶段&#xff1a;单体架构 大型网站都是…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Go 单元测试之Mysql数据库集成测试

文章目录 一、 sqlmock介绍二、安装三、基本用法四、一个小案例五、Gorm 初始化注意点 一、 sqlmock介绍 sqlmock 是一个用于测试数据库交互的 Go 模拟库。它可以模拟 SQL 查询、插入、更新等操作&#xff0c;并且可以验证 SQL 语句的执行情况&#xff0c;非常适合用于单元测试…

如何安装MacOS的虚拟机?mac安装虚拟机的步骤 虚拟机安装MacOS VMware Fusion和Parallels Desktop19

要在Mac上运行MacOS的虚拟机&#xff0c;常用的方法是使用虚拟化软件如VMware Fusion或Parallels Desktop。 以下是安装MacOS的虚拟机的主要步骤&#xff1a; 1. 检查系统要求&#xff1a;确定您的Mac硬件和操作系统满足安装要求。您需要一台具备足够性能的Mac&#xff0c;并…

【前端Vue】Vue从0基础完整教程第7篇:组件化开发,组件通信【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

GPT国内怎么用?4月最新版本来了

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…