安卓四大组件之Activity

发布于:2024-05-03 ⋅ 阅读:(129) ⋅ 点赞:(0)


一、简介

ctivity是安卓四大组件之一,用于展示用户界面和处理用户交互。每个Activity都会占据屏幕上的一部分空间,并且可以包含各种UI元素,如按钮、文本框、图片等。Activity通常会响应用户的操作,如点击按钮、输入文本等。


二、生命周期

在这里插入图片描述

方法 调用时刻 使用场景
onCreate() Activity开始创建时(生命周期的第1个方法) 初始化工作(如setContentView加载界面布局资源)
onStart() Activity正在被启动时(此时,Activity还不可见(在后台)&还无法与用户交互)
onResume() 时刻1:Activity第1次启动完毕。时刻2:当前Activity被挡住1部分后(失去焦点,处于onPause状态),重新回到当前Activity时(Ul最顶层)(如:弹窗消失) 数据恢复 & 展示
onPause() Activity 停止时 &仍可见时(如 弹窗出现) 数据存储、停止动画、注销广播等操作(注:不能做耗时操作)
onStop() Activity不在U最顶层 & 完全被挡住不可见时 回收工作 & 资源释放
onRestart() 处于onStop()状态时(不可见)重新回到该Activity(Ul最顶层) 数据恢复
onDestory() Activity 即将被销毁时 回收工作 & 资源释放

在这里插入图片描述
①进入页面→退出页面:
进入的时候: oncreate->onstart→onresume
退出的时候: onpause->onstop->ondestroy

在这里插入图片描述
在这里插入图片描述

②进入页面→按 HOME 使页面后台运行→返回页面

进入页面: oncreate→onstart→onresume

在这里插入图片描述
进入 HOME,页面后台运行: onpause→onstop

在这里插入图片描述
返回页面: onrestart->onstart->onresume
在这里插入图片描述
退出的时候: onpause->onstop→ondestroy
在这里插入图片描述
③进入页面->finish 返回上层->再次进入->虚拟返回键退出
进入页面: oncreate→onstart→onresume
在这里插入图片描述
finish 返回上层: onpause->onstop→ondestroy
在这里插入图片描述
再次进入: oncreate→onstart→onresume
在这里插入图片描述
虚拟按键退出: onpause->onstop→ondestroy
在这里插入图片描述
③中可得, finish 方法返回所走的生命周期与虚拟返回键的生命周期一致。


三、启动模式

3.1 Standard

在这里插入图片描述
在这里插入图片描述

3.2 Single Task

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3 SingleTop

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 Single Instance

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.5 启动模式的配置

在这里插入图片描述


四、Activity 的跳转和数据传递

4.1 Activity 的跳转

主要有以下两种方式

startActivity(Intent intent);
startActivityForResult(Intent intent,int requestCode);

这两个函数,传递数据的话利用 Intent 进行传递,复杂数据需要配合 Bundle 使用。可以
利用这两个函数在 Activity 之间的跳转以及传递数据。

4.1.1 直接跳转

这里有两个 Activity: FirstActivity 与 SecondActivity,从 FirstActivity 中跳转到SecondActivity 中只需要一个 startActivity()即可:

startActivity(new Intent(this,SecondActivity.class));

一般需要在 SecondActivity 中加上 finish()函数,表示这个 Activity 结束,比如这里直接在 SecondActivity 的按钮事件里面加上了 finish():
在这里插入图片描述

4.1.2 回调

很多情况下需要在 FirstActivity 跳转到 SecondActivity 后,在 SecondActivity 进行相应的操作,如更新数据之类,然后返回 FirstActivity,通知 FirstActivity 执行某些操作,这时候就需要使用 startActivityForResult()。
startActivityForResult 有两个参数,一个是 Intent,表示将要跳转的 Activity,一个是requestCode,表示请求码,用于调用 Activity 的 onActivityResult()函数。
如 FirstActivity 中:

startActivityForResult(new Intent(this,SecondActivity.class),11);

这里 11 就是请求码,然后在 SecondActivity 中,使用 setResult()函数:

setResult(22,new Intent().putExtra("str","from second activity"));

setResult()接受两个参数,第一个参数表示 resultCode,从这个 SecondActivity 返回的结果码,另一个 Intent,表示要返回给 FirstActivity 的数据。
最后在 FirstActivity 中重载 onActivityResult():
在这里插入图片描述

4.2 Activity 的数据传递

4.2.1 传递普通数据

传递普通类型的数据直接使用 Intent 的 putExtra()即可, putExtra 接受两个参数,第一个是一个 String,表示键,第二个是值,类型可以是 byte、 char、 short、 long 等基本类型与这些基本类型组成的数组,当然 String 也可以。
比如在 FirstActivity 中,传递数据给 SecondActivity:
在这里插入图片描述
然后在 SecondActivity 中使用 getIntent()获取 Intent 后,再从里面获取数据:
在这里插入图片描述
如果想从 SecondActivity 中返回数据给 FirstActivity,也就是从被调用的 Activity 中返回数据,可以使用前面介绍过的 setResult()方法。
其中第二个参数是一个用于存储数据的 Intent,把数据 put 进去即可。
在这里插入图片描述
最后记得在 onActivityResult 做相应的判断处理:
在这里插入图片描述
在这里插入图片描述

4.2.2 传递一组数据

当数据的种类变多时,比如混合了 int、 String、 byte、 char 等,可以对逐个类型使用putExtra(),但更好的方法是使用 Bundle。
Bundle 的使用与 Intent 类似,也是对于不同的类型采用键值对的添加方法,直接
putXXX:

在这里插入图片描述
数据添加完毕之后,在 intent 中使用 putExtras(bundle):

在这里插入图片描述
然后就可以在 SecondActivity 中接收数据了。
首先需要使用 getIntent().getExtras()获取 Bundle,再获取里面的数据。
在这里插入图片描述
注意一下获取到的 Bundle 有可能为 null,取数据前需要判断一下。
在这里插入图片描述

4.2.3 传递对象

如果想要传递的数据是一个对象怎么办?难道对每一个属性都使用 get 再放进去吗?
并不是, Bundle 提供了一个处理序列化对象的方法:
在这里插入图片描述
只要对象实现了 Serializable,就可以被 Bundle 处理,比如这里有一个测试类 Student:
在这里插入图片描述
然后在 FirstActivity 中直接 new 一个,并使用 Bundle 的 putSerializable 即可。
在这里插入图片描述接着再 SecondActivity 中通过 Intent 取出 Bundle 后,使用其中的 getSerializable()取
出对象,最后使用强制类型转换
在这里插入图片描述
在这里插入图片描述


五、启动过程

当请求启动Activity时:

  • 1.Launcher进程通过Binder驱动向ActivityManagerService类发起startActivity请求;
  • 2.ActivityManagerService类接收到请求后,向ActivityStack类发送启动Activity的请求;
  • 3.ActivityStack类记录需启动的Activity的信息 & 调整Activity栈 将其置于栈顶、通过 Binder 驱动 将 Activity 的启动信息传递到ApplicationThread线程中(即Binder线程)
  • 4.ApplicationThread线程通过Handler将Activity的启动信息发送到主线程ActivityThread
  • 5.主线程ActivityThread类接收到该信息 & 请求后,通过ClassLoader机制加载相应的Activity类,最终调用Activity的onCreate(),最后启动完毕

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到