安卓四大组件之Activity


一、简介

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 的启动

假如是 MainActivity 跳转到SingleActivity

5.1 显式启动

方式一:
    Intent intent = new Intent(MainActivity.this, SingleActivity .class);
    startActivity(intent);

方式二:
   Component component = new Component(this,SingleActivity .class);
  Intent intent = new Intent();
  intent.setComponent(component);
  startActivity(intent);

方式三:
    Intent intent = new Intent();
  intent.setclass(this,SingleActivity .class);
  startActivity(intent);

5.2 隐式跳转

隐式跳转之Action跳转

1.在 AndroidManifest.xml文件中注册

<activity android:name=".SignInActivity";   
     <intent-filter  
         <action android:name="customer_action_here"  />
     </intent-filter>  
 </activity>  

2.在java代码中调用

//创建一个隐式的 Intent 对象:Action 动作 
    Intent intent = new Intent();
//设置 Intent 的动作为清单中指定的action  
   intent.setAction("customer_action_here");
   startActivity(intent);

隐式跳转之Category跳转…还有很多,
参考:
Android 四大应用组件

六、启动过程

当请求启动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(),最后启动完毕

在这里插入图片描述

参考链接:

Android 四大应用组件

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值