Activity总结和补充

Activity总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110064346
Android Binder&Aidl理解和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/109862316
handler总结和补充:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110293636
<Service史上最全面解析>理解和补充:
https://blog.csdn.net/fdsafwagdagadg6576/article/details/110696288
四大组件总结:https://blog.csdn.net/fdsafwagdagadg6576/article/details/110631418

本文是读Android四大组件:这是一份全面 & 详细的Activity学习指南
https://blog.csdn.net/carson_ho/article/details/82848840 读后感

1. 作用

显示界面 & 与用户进行交互

  1. 一个Activity通常是一个界面,是四大组件唯一能被用户感知的
    Activity 相当于pane(面板),控件放在其上显示.我们看到的APP界面,其实就是由activity和控件组成的.
  2. 每个活动被实现为一个独立的类, & 从活动基类继承过来

2. 生命周期(状态)

生命周期就是Activity各种状态。
activity: 切换界面,activity 压栈。activity state:onCreate(创建) 、onStart(激活) 、onResume(恢复) 、onPause(暂停) 、onStop(停止) 、onDestroy(销毁) 、onRestart(重启)。
notes:onCreate 生命周期主要进行初始化操作,onResume执行完毕以后页面才会展示出来.

其中,有三个稳定态,其他都是过渡态:

  • Resumed ,此时,Activity处于栈顶,处理用户交互。
  • Paused,当Activity的一部分被挡住的时候进入这个状态,不会与用户交互。
  • Stopped,当Activity完全被覆盖时进入这个状态,此时Activity不可见,仅在后台运行。

详见:Android基础:3分钟详解Activity生命周期 https://blog.csdn.net/carson_ho/article/details/82620404
每种状态有不同的作用,不同的应用场景有不同的状态变化,状态的变化就是作用的变化.

scenario场景状态变化
1第一次打开app. onCreate()-->onStart()-->onResume()
2activity被回收,重启打开activity
 
onCreate(bundle)-->onStart()-->onResume()
3锁屏/开屏锁屏:onPause--onSaveInstanceState--onStop
开屏:onResume
横竖屏切换onCreate()、onStart()、onResume(),onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()
旋转屏幕之后,Activity被销毁的同时会立即创建新的Activity实例onCreate,...
5按home返回主界面pause--->stop
再次打开app
restart--->start---resume
activity压入栈重新被唤起,不同的模式,有不同的启动时序,
详细参见: https://blog.csdn.net/my_csdnboke/article/details/84787281 中的第二部分.
6按back键返回主界面pause--->stop--->destory
7两个activity跳转状态变化当在 A 里面激活 B 的时候, A 会调用 onPause() 方法, 然后 B 调用 onCreate()-->onStart()-->onResume(). 
这时候 B 覆盖了窗体, A 会调用 onStop() 方法. 

notes: activity回收之后重新打开,有几个相关问题.
这属于第二次及以后打开,不同于第一次打开.这次打开在onCreate的时候,会带有上次被回收的时候onSaveInstanceState保存的bundle.
1) bundle是什么时候保存的呢?
是onSaveInstanceState函数
2) 什么情况会调用onSaveInstanceState?
app将要被回收的时候,android os会调这个函数,通常开发人员在这个函数中需要写一些要保存的内容。
比如:进程因为内存不足被回收的时候和横屏,竖屏转换的时候.
使用back键正常退出app,不会调用onSaveInstanceState.
相关引用:Activity中的onSaveInstanceState()解析:https://blog.csdn.net/qq_31753145/article/details/51460663.
上文主要介绍4个方面内容:
a) back原先的 Activity 的界面;
b) onPause()和onSaveInstanceState()区别;
c) default onSaveInstanceState()和自己实现onSaveInstanceState()
d) onSaveInstanceState 什么时候被调用。
3): 回收的优先级:相关引用, Android进程回收优先级:https://my.oschina.net/JiangTun/blog/1557987
4) 什么时候调用onDestroy? a) 按back键 b) 程序后台运行被kill

3 缓存方式(状态保存)

示意图

4. 启动模式

1) 任务栈: Android使用任务栈管理Activity.任务栈是一种后进先出的结构,位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法.一个App一个任务栈,对于用户来说,看不见任务栈全部内容,只能看到栈顶.不是所有app公用一个任务栈.
任务栈不是后台运行的多个程序,多个程序是多进程关系。任务栈是一个进程,后退键返回同一个进程上一个的activity.
用户查看正在运行的app,是看到的不同App的栈顶activity。当切换app的时候,是切换app的状态,切换任务栈,不是弹出activity。home键,app切换到后台,重新点击app等是对同一个activity不同status. 切换app状态和任务栈进出没关系.
上面是大多数App任务栈的管理方式.
notes:分成前台和后台任务栈.当前使用的app是前台,其他app全是后台.
QA: 问系统里面有多少个任务栈存在?
有多少个应用程序正在运行

2) Activity的启动模式

为了满足多种管理activity的需求,android变成4种管理任务栈的方式.

  • standard,标准模式,每次都会创建新的Activity覆盖在原Activity上

  • singleTop,栈顶复用模式,首先判断栈顶Activity是否是要启动的Activity,如果是则不创建新的Activity而直接引用这个Activity;如果不是则创建新的Activity。
  • singleTask,栈内复用模式,检测整个Activity栈中是否存在当前需要启动的Activity,如果存在则将该Activity置于栈顶,并销毁其上所有Activity。
  • singleInstance,单实例模式,创建新的任务栈,且该任务栈仅有一个Activity。

4种启动模式的区别
示意图

3) 4 种模式的适用场景和配置

5 启动方式

参见原文,这个是activity通信的基础。
从一个first activity跳转到second activity,道理是一样的.指定类名即可.
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent); (startActivityforresult(intent)不需要对方再发一下replay,直接将结果代回来)

上面是显示Intent实现,下面补充隐式Intent。
隐式Intent 将显示intent实现的代码放入配置文件. 有4个属性Action、Data、Category、Extras。重点是action, 它决定了start组件的行为,比如:start new activity or start webpage or start dial. 隐式常用的start new activity 的时候,不同于显示使用类名,而是使用别名(路径名+类名).
显示Intent和隐式Intent讲解与实例应用 https://blog.csdn.net/shaochen2015821426/article/details/79685260
Intent中的四个重要属性——Action、Data、Category、Extras https://blog.csdn.net/reboot123/article/details/9198101

6  启动过程

参见原文,同时参见https://blog.csdn.net/u012267215/article/details/91406211

7 Fragment

activity 是整个屏幕,fragment是分屏.
这里写图片描述
详细参见:https://blog.csdn.net/carson_ho/article/details/51588609
https://carsonho.blog.csdn.net/article/details/107755559

8 Activity通信

Handler是和创建它的Activity绑定的,如果你用单独一个类来写handler的话,实例化时要传入activity的上下文。

(1) 直接调用
1) Activity与Fragment通信:
i) activity到fragment
因为fragment是activity的一个成员,直接调用变量传递数据,数据格式是bundle.
ii) fragment到activity
a) activity向fragment传入callback对象(通常是匿名类).
b) fragment 向callback对象的函数,传入变量var即设置变量var.
c) activity中callback对象的函数中获取了,fragment的传值.
原理类似主函数向子函数中传入指针,指针在子函数中被赋值,这样主函数中使用指针就是最新的值.
碎片之间通信:不能通信,fragment依赖于activity,通过activity通信
(2) 基于intent传输
两个activity之间:通信使用intent机制,bundle结构。
activity和本地service通信:intent 属于线程通信

Intent intent = new Intent(WayBillActivity.this, WayBillMessage.class);
intent.putExtra("listdetail", (Serializable) listdetail);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

(3) 基于外部存储的传c输,file/preference/sqlit,如果要针对第三方应用需要Content provider
(4) 基于ipc的通信机制(例如:context与service之间的传输,如Activity与service之间的通信(aidl))
activity和远程service通信:aidl 属于进程通信
(5) 基于Application的context(例如:将要传递的数据存在父类activity中)
(6) 使用static 变量通信(不推荐,app被回收,重新启动,页面的启动不会走默认的流程,而是会直接打开上次离开时的页面,而这个static 变量就会为 null造成错误。static变量一起保存能解决这个问题吗??).

其他参考:activity的简要介绍:https://www.jianshu.com/p/35fd45135d99

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值