Android Studio 四大组件之Activity

目录

生命周期

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

启动方式-Intent

启动方式

显示启动

隐式启动

启动模式

四种启动模式

数据传递


Activity是构建用户界面的基础组件,方便用户实现应用交互。可以看作单一的屏幕。

生命周期

Activity的生命周期可以分为7个部分,分别是onCreate,onStart,onResume,onPause,onStop,onDestory,onRestart。 

onCreate

创建

做初始化工作,setviewcontent界面资源,初始化资源

onStart

启动

Activity可见但此时不能与用户交互,此时可以看到活动界面,但是活动此时未获得焦点

onResume

获得焦点

Activity可见且在前台开始活动

onPause

即将停止

做数据存储,停止动画等动作

onStop

正在停止

轻量级回收工作,取消网络链接,注销广接收器

onDestory

即将销毁

做回收工作,释放资源

onRestart

重新启动

后台到前台,不可见到可见

如果有服务或事件需要注册,一般在onCreate中进行,相对应的解注册onregister也会在onDestory中进行。

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

A 的onPause()会先执行,然后才执行 B 的onResume()

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

如果 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()。

启动方式-Intent

intent主要用于不同组件(活动Activity、服务service、广播broadcast)之间传递消息和数据,实现应用内部和应用之间的交互。

使用场景

启动活动(Activity)

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

启动服务(service)

 Intent intent = new Intent(this,Myservice.class);
 StartService(Intent)

发送广播(broadCast)

Intent intent= new Intent("com.example.CUSTOM_ACTION");
SendBroadcost(Intent);

传递数据

Intent intent = new Intent(this,DetailActivity.class);
Intent putExtra("EXTRA_KEY","some date");
StartActivity(Intent);

与内容提供者交互(content Prproder)

启动方式

  显示启动,隐式启动

显示启动
  • 确保目标Activity在AndroidManifest.XML文件中声明

  • 确保不同包的包名正确

  • 显示启动一般用于应用内的内部组件之间的通信,因它直接指定了组件的类名

  1. 隐式启动

是指没有明确指定目标Activity,是通过Intent的Action,category,date等属性描述目标Activity,经过系统在AndroidManifest.XML匹配对应的Activity。

//启动Activity:
Intent intent1 = new intent();
intent1 setActivity("Android.intent.action.super");
startActivity(intent1);
  • 确保在AndroidManifest.XML中设置了正确的intent-filter,包括action,category,date这些属性/scheme协议

  • 常用于应用之间,应用与系统之间的通信,不直接指定Activity,而是根据intent的属性去查找匹配的组件

  • 应确保目标应用已被安装,且有一个Activity可以影响这个应用

  1. 启动模式

任务栈(task stack):为了管理Activity的启动和导航

  • 入栈(Push):当新的Activity被启动时,它会被推入任务栈的栈顶

  • 出栈(Pop):当一个Activity完成任务或被用户销毁时,它会被任务栈移除

  • 跨栈(Overlap):特殊情况下,新的Activity在当前Activity上显示

  1. 四种启动模式

standard

每次启动Activity时都会创建一个新的实例,并将其推入任务栈的栈顶

singleTop

如果任务栈中已经存在该Activity的实例,并且在找顶,则不再创建新的实例,直接使用栈顶的实例(调用栈顶Activity的onNewIntent函数,从intent里解析数据来刷新界面)。,如果该Activity不在栈顶,则会创建新的实例,并将其推到栈顶。

场景:点击推送消息,跳转的详情界面

singleTask

启动Activity之前检查整个任务栈是否有相同的Activity,如果当前前Activity不存在则实例化一个新的Activity,如果当前Activity在任务栈中已经存在,则会复用这个Activity实例,启动已经存在在Activity任务栈中但不在栈顶的Activity,同时把压在它前面的所有Activity弹出任务栈。

场景:忘记密码->重置密码后回到登陆界面重新登陆

singleInstance

全局单例,启动Activity时,重新为它分配一个任务栈,让该Activity独享一个任务栈,所有进程共享这个Activity所在的栈。适合需要与主程序分离的界面,业务上属于独立,单独栈运行与其他页面不相干与上述singleTask的规则2一样,只是task中只有一个Activity,如果在singleInstance的Activity又启动一个Activity,

则会再用被启动Activity的栈(独立于SingleInstance)

场景:闹钟

  1. 数据传递

传递数据-Intent:传递简单数据通常通过Intent的putExtra和getExtras方法来实现

返回数据-startActivityForResult:Activity在finish的时候需要向上一个Activity传值的时候,我们就可可以使用startActivityForResult。比如打开相册选取照片,拍照,关闭页面需要返回一个参数给打开我们的页面。使用startActivityForResult(Intent intent,int requestCode)方法打开新的Activity,新Activity关闭前需要向前面的Activity返回数据需要使用系统提供的setResult(int resultCode,Internt data),前面的Activity中通过onActivityResult(int requestCode, int resultCode, Intent data)方法接受回传值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值