【安卓基础3】Activity(一)

🏆作者简介:|康有为| ,大四在读,目前在小米安卓实习,毕业入职

🏆本文收录于  安卓学习大全,欢迎关注

🏆安卓学习资料推荐:

        视频:b站搜动脑学院 视频链接 (他们的视频后面一部分没再更新,看看前面也挺好的)

        书籍:《第一行代码》(第3版) by 郭霖 (z-lib.org)

        思维导图: https://www.processon.com/view/link/62427cb2e0b34d0730e20e00(来自动脑学院)

目录

一、Activity入门

Activity的创建

1. 在layout目录下创建XML文件

2. 创建与XML文件对应的Java代码

3. 在AndroidManifest.xml中注册页面配置

Activity的跳转

Activity快捷创建

二、Activity的基本用法

在Activity中使用Toast

三、Activity的启动和结束

四、Activity的生命周期

分析Activity生命周期

将上文的细节提炼

状态之间的切换过程

Activity A 启动一个透明的 Activity B

异常情况下的生命周期

常见异常情况

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建

2.系统内存不足导致低优先级的Activity被杀死


一、Activity入门

Activity可以理解为程序的一个界面或一个屏幕。

在Android中,Activity 是一个用于展示用户界面和处理用户交互的基本组件。它代表了用户与应用程序之间的单一屏幕,用户在应用程序中进行的每个操作通常都与一个 Activity 相关联。在Android应用程序中,通常会包含多个活动,每个活动都代表应用程序的一个界面或一个屏幕

先用Androidstudio创建一个Empty Views Activity 的 HelloWorld程序,java语言的

Activity的创建

完整的页面创建过程包括三个步骤,也就是创建下面的三个文件

1. layout目录下创建XML文件

创建成功后,添加下面代码

并在res/values/strings.xml文件 中添加文字

<resources><string name="app_name">HelloWorld-Java</string><string name="text2">文字2222222</string>
</resources>

2. 创建与XML文件对应的Java代码

写代码:

1.继承AppCompatActivity

2.重写onCreate方法(写onCreate会有提示,自动补全)

重写时选择这个protect修饰的这个onCreate方法

3.写上:setContentView(R.layout.activity_main2);


package com.example.helloworld_java;import android.os.Bundle;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity2 extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);}
}

3. AndroidManifest.xml中注册页面配置

在这里加入一行代码,将这个activity注册到清单文件

<activity android:name=".MainActivity2"/>

 

因为MainActivity2 不是主activity,所以不用再修改 intent-filter的代码。

至此就创建好了 Activity2

Activity的跳转

我们想显示Activity2,就需要从主Activity中跳转到2,所以写一个按钮,加上点击跳转的事件,跳转到2。

在主Activity中加上按钮


<Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="跳转" />

 编写跳转事件(要写到主Activity中的onCreate方法里面,从主Activity 跳转到 其他Activity)


Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(MainActivity.this,MainActivity2.class);startActivity(intent);}
});

 效果

Activity快捷创建

直接在java文件包那里快捷创建

这样layout里面也会自动帮我们创建好文件

清单文件中也会自动帮我们注册好

快捷创建的layout中的xml文件,根是androidx.constraintlayout.widget.ConstraintLayout ,我们可以换成LinearLayout

 androidx.constraintlayout.widget.ConstraintLayoutLinearLayout 是 Android 开发中常用的两种布局管理器,它们在布局设计和子视图排列方面有一些不同之处。

二、Activity的基本用法

Activity中使用Toast

Toast是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通 知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。

在Android中,Toast 是一种简单的通知方式,可以在屏幕底部显示一小段时间的消息。以下是在 Activity 中使用 Toast 的基本步骤:

  1. 创建 Toast 对象: 使用 Toast.makeText() 方法创建一个 Toast 对象。
  2. 设置显示文本: 使用 setText() 方法设置要显示的文本内容。
  3. 设置时长: 使用 setDuration() 方法设置 Toast 的显示时长,可以选择 Toast.LENGTH_SHORT(短时,大约2秒)或 Toast.LENGTH_LONG(长时,大约3.5秒)。
  4. 显示 Toast: 调用 show() 方法显示 Toast

以下是一个简单的示例:


import android.os.Bundle;
import android.view.Gravity;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 创建一个Toast对象Toast toast = Toast.makeText(this, "Hello, this is a Toast!", Toast.LENGTH_SHORT);// 设置Toast的显示位置(可选)toast.setGravity(Gravity.CENTER, 0, 0);// 显示Toasttoast.show();}
}

效果:

三、Activity的启动和结束

从当前页面跳到新页面,跳转代码如下:

startActivity(new Intent(源页面.this,目标页面.class));

A -- B ,那么B就是启动了

从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:

finish();//结束当前的活动页面

B结束之后,就返回到了A

示例

从A跳到B的java代码,xml里面写个按钮就行。

从B跳回A,也就是直接执行 finish 就行

四、Activity的生命周期

分析Activity生命周期

什么是 生命周期,就是从生到死的过程。

正常情况下,新建一个Activity A会顺序经历如下几个生命周期:

  1. onCreate:A正在被创建,这个方法中,我们可以做一些Activity的初始化操作。例如布局文件的加载与事件的绑定(setContentView,findViewById,setOnClickListener等)。
  2. onStart: A 正在被启动,A 由不可见变为可见时调用,此时 A 还无法与用户交互。此时可以做一些数据的初始化操作(开启线程去拉本地数据库数据,或从后台拉数据)。
  3. onResume: A 已经可见,并出现在前台,该Activity位于返回栈栈顶,可以响应用户的操作,即可以与用户交互了。

如果此时用户拉起另一个Activity B, Activity A会顺序经历如下几个生命周期:

4. onPause: 表示 A 正在停止,准备从前台返回至后台,此时可以做一些停止动画,数据存储等工作。值得注意的是,在onPause生命周期进行的工作不能太耗时,不然会影响 B 的显示。(Activity A的onPause执行完后,Activity B的onResume才会执行)。

5. onStop: 在 A 完全不可见时调用,紧随着onPause执行,表 A 即将停止,此时 A 已经不在前台,可以做一些稍微重量级的回收工作,但同样不能太耗时,(如果此时新打开的Activity B是对话框式的Activity,背景存在一定区域是透明的,则Activity A的onStop不会调用)。

6. onDestroy:表示 A 即将被销毁,在这里可以进行资源的回收、释放工作。一般是经过用户按下back键或者系统资源紧张时,将Activity A释放掉以获得更多的内存时调用。

Activity B经历了onResume生命周期后已经显示在前台,如果此时按下back返回键,从 B 页面返回,而 A 还停留在onStop,没有经过onDestroy生命周期的话,A 会经历如下几个生命周期后重新显示:

7. onRestart: A 由onStop停止状态,转为运行状态时调用,表 A 正在被重新启动。

8. onStart

9. onResume

可以看到,排除Activity退到后台的情况,Activity从创建到销毁,总共会经过6个生命周期,分别是onCreate,onStart,onResume,onPause,onStop,onDestroy。

通过上面的文字描述,看这个图应该已经很清楚了,不过,未提到的是,上图中onPause()还有个箭头指向了onResume(),这是一种极端情况。即考虑当Activity A 跳转到Activity B 的情况,此时 A 还在执行onPause() , B 还未显示出来。快速地从B回到A,此时会直接执行 A 的onResume()而不会走onRestart()。不过一般很难复现这种操作,大家留个心眼就行。

将上文的细节提炼

  • onStart、onResume、onPause、onStop看起来回调调用的时机差不多,它们俩区别在哪呢?

onStart和onStop是从Activity是否可见的角度来回调的,而onResume和onPause则是从Activity是否位于前台、是否可以与用户交互的角度来回调的,除了这方面的差别,在时机使用过程中,它们没有其他明显区别。

  • 从Activity A 跳转到Activity B,是先执行 A 的onPause(),还是先执行 B 的onResume()呢?

这部分设计Activity跳转的源码,源码逻辑太深、太复杂就不先在基础篇讨论了,大家目前 先记住结论就好:A onPause()会先执行,然后才执行 B onResume(),这个细节也是面试中可能会问到的点。

  • 在onPause中不能进行耗时的操作,否则会影响新Activity的显示,稍微重一点的操作可以放在onStop中,但依然不能太耗时。

状态之间的切换过程

打开新页面的方法调用顺序为:

onCreate→onStart→onResume

关闭旧页面的方法调用顺序为:

onPause→onStop→onDestroy

Activity A 启动一个透明的 Activity B

  • 如果 Activity A 启动一个透明的 Activity B,会经历哪些生命周期呢?

这是面试容易遇到的一个问题,因为 B 页面透明, 所以跳转到 B 页面后,A 页面依然可见,因此就不会调用 Activity A onStop 方法。

一般情况,A/B 均不是透明页面:

A 跳转 B 页面会经历的生命周期:A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume() -> A.onStop。

从 B 页面返回 A 页面经历的生命周期:B.onPause() -> A.onRestart() -> A.onStart() -> A.onResume() -> B.onStop()。

B是透明页面的情况:

如果 B 是透明的,A 跳转到 B:A.onPause() -> B.onCreate() -> B.onStart() -> B.onResume()。

从 B 返回 A:B.onPause() -> A.onResume() -> B.onStop()

异常情况下的生命周期

考虑一种异常情况,Activity C 打开了Actvity D后,C进入了停止状态(调用了onStop()),此时系统内存不足,需要回收 C(调用C的onDestroy()) ,当用户从 D 返回到 C,C 会被重新创建(调用onCreate())。如果原来 C 里边有临时状态存储着,比如TextView中的文字。那么从 D 返回 C 时,C因为重新创建,如果TextView未指定ID,那它原来的文字就会消失,这一定程度影响了用户的体验。

因此为了优化用户体验,Activity提供了一个onSaveInstanceState()回调方法,这个方法可以保证异常情况下,在Activity被回收之前一定会被调用。

onSaveInstanceState()方法会携带一个bundle参数,我们可以通过bundle对象,存储一些简单的状态信息。

Activity重新创建后,系统会调用onRestoreInstanceState(),并把Activity销毁时onSaveInstanceState()方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState()onCreate()

你可以选择这两个方法中任意一个来恢复数据,二者的区别是:onRestoreInstanceState一旦被调用,其bundle对象一定是有值的,而onCreate在正常启动Activity的情况下bundle对象是无值的。

调用时机

onSaveInstanceState()onStop()之前调用,onRestoreInstanceState()会在onStart()之后调用。

异常情况下,Activity数据的存储和恢复的生命过程都是一样的。

常见异常情况

常见的异常情况主要有以下两种:

1.资源相关的系统配置发生改变导致Activity被杀死并重新创建

首先说说什么是系统配置信息。

不同手机设备的分辨率不同,要将图片适配不同大小的手机屏幕,我们通常会在drawable-xhdpi,drawable-xxhdpi,drawable-xxxhdpi等目录中存放对应大小的图片Resource文件。

当App启动时,系统就会根据当前设备的屏幕情况去加载合适的Resource资源。同一台设备的横屏和竖屏时的屏幕大小也是不一样的,如果当前Activity处于竖屏状态,突然旋转至横屏,那么此时系统的屏幕配置发生了改变。

默认情况下,Activity会被销毁并重建。因为这种销毁是一种非用户主导的、异常的情况,Activity会调用onSaveInstanceState()方法后销毁,重建时会再调用onRestoreInstanceState()方法,即走一遍异常情况的生命周期。

如何避免这种因为系统配置更改而导致Activity重建的异常情况?

如果app在应用配置变更期间无需更新资源,我们可以在AndroidManifest.xml文件中相应的Activity声明,自行处理相关配置的变更,从而阻止系统重建Activity。

只需指定相关的configChanges属性。比如下面的例子,就阻止了当屏幕发生旋转时Activity的系统自动重建。


<activity android:name=".MainActivity"android:configChanges="orientation|screenSize" />

当configChanges中指定的配置发生变化时,系统会调用Activity的onConfigurationChanged()方法,如果有需要处理配置变更的话,可以在这个方法手动处理。一般我们在屏幕旋转时,希望Activity能保持原样,不重建就好了,所以空实现该方法即可。

当然,需要自行处理时,比如检查当前设备的方向,你可以这么写:


override fun onConfigurationChanged(newConfig: Configuration) {super.onConfigurationChanged(newConfig)// Checks the orientation of the screenif (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) {Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show()} else if (newConfig.orientation === Configuration.ORIENTATION_PORTRAIT) {Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show()}
}

configChanges属性可以指定很多属性,如果你还想指定更多配置,不同配置间用"|"分隔,比如上面那样。

部分常用的configChanges配置项目如下:

2.系统内存不足导致低优先级的Activity被杀死

这种情况就是我们分析异常情况下的生命周期时举的例子。Activity C 跳转至Activity D,C 处于后台,当系统内存资源不足时,C的优先级较低,会被系统销毁以获得更多的内存,然后再从 D 回到 C ,C 会被重建,走一遍异常时的数据存储和恢复的生命过程。

Activity按照优先级从高到低,可以分为如下三中情况:

  • 前台Activity,正在与用户交互的Activity,其优先级最高。
  • 可见但非前台Activity,比如Activity中弹出了一个对话框,导致Activity可见但出于后台,无法与用户直接交互。
  • 后台Activity,已经被暂停的Activity,比如执行了onStop,用户看不见,优先级最低。

当系统内存不足时,系统会按照上述优先级的顺序去杀死Activity所在的进程。并在后续通过onSaveInstanceState()和onRestoreInstanceState()去存储和恢复数据。

如果一个进程中没有四大组件在执行,那么这个进程将会很快被系统杀死,因此一些后台工作不适合脱离四大组件而单独运行在后台中。比较好的方法是将后台的工作放到Service服务中,从而保证进程有一定的优先级,就不会容易被系统杀死了。

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

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

相关文章

Sora横空出世!AI将如何撬动未来?

近日&#xff0c;OpenAI 发布首个视频生成“Sora”模型&#xff0c;该模型通过接收文字指令&#xff0c;即可生成60秒的短视频。 而在2022年末&#xff0c;同样是OpenAI发布的AI语言模型ChatGPT&#xff0c;简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…

【IC设计】Chisel API之Arbiter和RRArbiter的使用

文章目录 介绍Chisel的Valid和Ready流控build.sbtRRArbiter代码示例 介绍 仲裁器在NoC路由器中是重要的组成部分&#xff0c;虚通道仲裁和交叉开关仲裁都需要使用仲裁器。 Chisel提供了Arbiter和RRArbiter仲裁器 Arbiter是基础的低位优先仲裁器&#xff0c; RRArbiter初始情况…

前端构建效率优化之路

项目背景 我们的系统&#xff08;一个 ToB 的 Web 单页应用&#xff09;前端单页应用经过多年的迭代&#xff0c;目前已经累积有大几十万行的业务代码&#xff0c;30 路由模块&#xff0c;整体的代码量和复杂度还是比较高的。 项目整体是基于 Vue TypeScirpt&#xff0c;而构…

ProtoBuf认识与Windows下的安装

protobuf简介 Protobuf 是 Protocol Buffers 的简称&#xff0c;它是 Google 公司开发的一种数据描述语言&#xff0c;是一种轻便高效的结 构化数据存储格式&#xff0c;可以用于结构化数据&#xff0c;或者说序列化。它很适合做数据存储 或 RPC 数据交换格 式 。可用于通讯…

WebServer -- 定时器处理非活动连接(上)

目录 &#x1f34d;函数指针 &#x1f33c;基础知识 &#x1f419;整体概述 &#x1f382;基础API sigaction 结构体 sigaction() sigfillset() SIGALRM, SIGTERM 信号 alarm() socketpair() send() &#x1f4d5;信号通知流程 统一事件源 信号处理机制 &#x…

2024全球网络安全展望|构建协同生态,护航数字经济

2024年1月&#xff0c;世界经济论坛发布《2024全球网络安全展望》报告&#xff0c;指出在科技快速发展的背景下&#xff0c;网络安全不均衡问题加剧&#xff0c;需加强公共部门、企业组织和个人的合作。 报告强调&#xff0c;面对地缘政治动荡、技术不确定性和全球经济波动&am…

基于springboot+vue的美发门店管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Cartographer框架简述

catographer框架分为前端和后端 前端包括雷达数据处理&#xff1b;位姿预测&#xff1b;扫描匹配和栅格地图更新。 后端包括后端&#xff1a;线程池任务与调度&#xff1b;向位姿图添加节点&#xff0c;计算节点的子图内约束和子图间约束&#xff08;回环检测&#xff09;&…

C++之Easyx——图形库的基本功能(1):界面操作

最近&#xff0c;我觉得使用控制台编写游戏太没意思了&#xff01;&#xff01; 所以我开始研究图形库了~ 一、setinitmode 函数定义 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //设置初始化模式&#xff0c;mode0为普通&#xff0c…

Javascript怎么输出内容?两种常见方式以及控制台介绍

javascript是一种非常重要的编程语言&#xff0c;在许多网页中它被广泛使用&#xff0c;可以实现许多交互效果和动态效果。输出是javascript中最基本的操作之一&#xff0c;下面将介绍两种常见的输出方式。 一、使用console.log()函数输出 console.log()函数是常用的输出函数…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1&#xff1a;安装jmeter 管理插件&#xff1a; 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;将下载下来的jar包放到jmeter文件夹下的lib/ext路径下&#xff0c;然后重启jmeter。 2&#xff1a;接着打开 选项-Plugins Ma…

三十年一个大轮回!日股突破“泡沫时期”历史高点

2月22日周四&#xff0c;英伟达四季报业绩超预期&#xff0c;而且本季度业绩指引非常乐观&#xff0c;提振美股股指期货并成为芯片股和AI概念股情绪的重要催化剂。今日亚洲芯片股和AI股起飞&#xff0c;日本在芯片股的带动下突破1989年泡沫时期以来的历史最高收盘价。 美股方面…

(十三)【Jmeter】线程(Threads(Users))之tearDown 线程组

简述 操作路径如下: 作用:在正式测试结束后执行清理操作,如关闭连接、释放资源等。配置:设置清理操作的采样器、执行顺序等参数。使用场景:确保在测试结束后应用程序恢复到正常状态,避免资源泄漏或对其他测试的影响。优点:提供清理操作,确保测试环境的整洁和可重复性…

租用海外服务器,自己部署ChatGPT-Next-Web,实现ChatGPT聊天自由,还可以分享给朋友用

前言 如果有好几个人需要使用ChatGPT&#xff0c;又没有魔法上网环境&#xff0c;最好就是自己搭建一个海外的服务器环境&#xff0c;然后很多人就可以同时直接用了。 大概是情况是要花80元租一个一年的海外服务器&#xff0c;花15元租一个一年的域名&#xff0c;然后openai 的…

一 些有代表性的相位解包裹算法

Itoh首先给出了传统解包裹算法的数学描述!。传统的相位解包裹操作是通过对空间相邻点相位值的比较来完成的。根据抽样定理&#xff0c;如果相邻采样点的相位差不超过z&#xff0c;则对应的相位解包裹处理是非常简单的&#xff0c;理论上以某点为起始点沿某一路径对包裹相位的差…

中科院计算所:什么情况下,大模型才需要检索增强?

ChatGPT等大型语言模型在自然语言处理领域表现出色。但有时候会表现得过于自信&#xff0c;对于无法回答的事实问题&#xff0c;也能编出一个像样的答案来。 这类胡说乱说的答案对于医疗等安全关键的领域来说&#xff0c;是致命的。 为了弥补这一缺陷&#xff0c;研究者们提出…

ios抓包Tunnel to......443

fiddler官网下载“CertMaker for iOS and Android”插件&#xff0c;官网插件&#xff1a;https://www.telerik.com/fiddler/add-ons 双击运行插件后&#xff0c;重启fiddler&#xff0c;ios重新安装证书即可

猫头虎分享已解决Bug || 系统更新失败(System Update Failure):UpdateError, UpgradeFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Sora:视频生成模型作为世界模拟器

我们探索了视频数据上生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和长宽比的视频和图像上联合训练文本条件扩散模型。我们利用了一个在视频和图像潜在码的时空块上操作的变压器架构。我们规模最大的模型 Sora 能够生成一分钟的高保真视频。我们的结…

一周学会Django5 Python Web开发-Django5路由重定向

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计25条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…