安卓四大组件:Activity

生命周期

onCreate Activity开始创建
onStart Activity正在被启动(上述两步进行初始化工作)
onResume ①第一次启动完毕②失去焦点重新返回Activity时(数据恢复+展示)
onPause 失去焦点、Activity停止时(数据存储、动画停止、注销广播)
onStop Activity彻底被挡住(回收、资源释放)
onRestart 在stop后重新完全显示(数据恢复)
onDestory Activity被销毁(回收、资源释放)

启动模式

标准模式

每次启动Activity都会新创建一个Activity实例放在栈顶。
①是默认启动模式
②当Activity A启动了Activity B,该B实例是出于A的栈顶位置
特点: ①Activity可被多次实例化并存在不同任务栈中,且一个任务栈中可含有一个Activity多个实例
②每次都会创建一个新实例
③实例所在栈与Intent发送者在同一栈中

栈顶复用模式

若当前创建的Activity位于任务栈栈顶,此Activity不会重建,而是直接使用(即会调用实例的onNewInten而不是onCreate和onStart);若不在栈顶则创建新实例放在栈顶
特点: ①Activity可被多次实例化并存在不同任务栈中,且一个任务栈中可含有一个Activity多个实例
②不一定每次都创建,取决于栈顶实例
③实例所在栈与Intent发送者在同一栈中

栈内复用模式

查看任务栈是否存在,若不存在则创建一个,再创建Activity实例放在栈顶;
若存在,则查看栈内是否存在所需要的Activity,若有则将其之上所有Activity出栈,使该Activity位于栈顶调用onNewIntent
特点: ①只生成一个实例
②不一定每次创建,取决于栈内是否有该Activity实例
③实例所在栈由参数决定

单例模式

直接创建一个新的任务栈,将该Activity放入栈中
一旦该模式的Activity已经位于某个栈中,后续所有应用都将使用该栈内的Activity实例
特点: ①只生成一个实例
②必定不会每次创建,只实例化一次,后续复用
③必定创建新任务栈
④不允许与其他Activity共存

启动方式

显示Intent

①使用构造函数传入Activity的类对象

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

②使用set方法放入包名+类名 或 包Contest+类名

 Intent intent = new Intent(); 
 intent.setClassName("com.hc.hctest", "com.hc.hctest.SecondActivity"); 

 intent.setClassName(this, "com.hc.hctest.SecondActivity"); 

 startActivity(intent);

③通过ComponentName传入包名+类名

 Intent intent = new Intent(); 
 ComponentName cn = new ComponentName("com.hc.hctest","com.hc.hctest.SecondActivity"); 
 intent.setComponent(cn); 
 startActivity(intent);

隐式Intent

通过Category和Action设置

Intent intent = new Intent(); 
intent.addCategory(Intent.CATEGORY_DEFAULT); 
intent.addCategory("com.hc.second"); 
intent.setAction("com.hc.action"); 
startActivity(intent);

含义:
①Action:与<intent-fliter>中action对应即可(一个inten只能由一个action)(默认匹配失败)
②Category:同样需要和<inten-fliter>中Category相同(可以有多个)(默认匹配成功)
③Data:标注媒体类型、URI地址,同样需要匹配成功(默认匹配失败)

上述三者同时匹配才可以启动Activity(即数据与intent-fliter中数据相同)
匹配:①加载所有intent-fliter列表
②去除action匹配失败的
③去除uri匹配失败的
④去除category匹配失败的
⑤剩余若为0,报错;若非0则按优先级排序返回最高优先级的fliter

状态保存

后台未销毁的activity有可能会被系统回收,使用onSaveInstanceState可以用来保存状态和数据(只有在被动销毁才会调用该方法)

onSaveInstanceState

作用: 保存Activity临时数据、状态
调用: 当Activity被系统销毁时,系统自动调用(必然在onStop前,但不一定在onPause前/后)
实际调用场景: ①从Activity A启动新的Activity(系统不知道新Activity是否会导致A的销毁,所以先保存起来)
②屏幕方向切换(屏幕切换会导致activity销毁,所以一定会执行保存)
③按下Home,同①系统不确定情况下就会保存
④关闭屏幕显示
代码中使用: 用Bundle进行数据保存

onRestoreInstanceState

作用: 恢复Activity状态
调用: 未经允许销毁Activity后,重新启动时调用
实际调用: 参加到生命周期中(保证是被动关闭后重启):onCreate->onStart->onRestoreInstanceState->onResume
代码中使用: 从Bundle中获取数据进行恢复

注:
①上述两个方法不一定被成对调用(保存工作在每次可能被销毁都会执行,而恢复操作只有在确定被销毁后才会执行)
②数据恢复的参数会传到onCreate中,可以在onCreate做数据还原操作
③此处的数据保存只记录瞬时状态(UI状态),不应做数据持久化存储,应该在onPause进行持久化

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔幻音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值