android四大组件笔记之Activity(一)
安卓的开发主要是围绕activity、broadcastReceiver、service、ContentProvider四大组件和基于view的子类组成,其中activity、broadcastReceiver、service都是通过它们的桥梁Intent创建和传递消息。通过Handler来执行消息、线程通讯的操作。而关于IPC,我觉得不得不说的就是binder。咱们这篇的主角是android的四大天王之一Activity。
Activity
是什么(what)?
activity是最基本也是最常见的android组件之一,负责与用户交互,一个activity通常就是一个屏幕。
在这我区分一下activity、window和view。
window相当于显示屏,通过LayoutInflater.inflate()加载view,通过addView加载到window上显示。
view(或viewgroup)是我们控件的基类。
activity相当于window的控制类,它可以通过phoneWindow的setContentView创建一个window。
启动模式(launchmode)
- standard
standard属于默认设置 ,启动一个activity会生成新的activity - singletop
如果该activity已经启动过了,且正好位于栈顶,那么并不会为程序生成一个新的activity,而是直接使用栈顶的activity,至有满足上述两个条件(已经启动过和位于栈顶)才会这样,否则也会生成一个新的activity。 - singletask
该模式下,只会创建该activity一个实例,在此模式下启动activity ,如果栈中已经有了该activity,那么直接使用。(而如果它不是位于栈顶,那么位于它上面的activity实例要依次出栈) - singleInstance
该模式下,将会创建一个task,且在该task下生成要启动的activity实例。该task下只会生成一个activity实例,且不会重复被实例化。后续的请求都不会创建该实例,除非这个任务栈被销毁了。
生命周期
流程图
这是我用渣渣像素丛书上照下来的。
基本情况
- 启动Activity:系统会先调用onCreate方法,然后调用onResume,activity进入运行状态。
- 当activity被其他activity覆盖其上或锁屏:系统会调用onPause方法,暂定当前activity的运行。
- 当前Activity由被覆盖状态回到前台或解锁,系统会调用onResume方法,再次进入运行状态。
- 当前activity转到新的activity界面或者按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
- 用户回到此activity:系统先调用onStart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
- 用户退出当前activity:系统先调用onPause方法,然后迪奥用onStop,最后调用OnDestroy
activity的状态保存
- 通过onRestoreINstanceState(Bundle)方法对信息进行保存,之后在onCreate(Bundle)或者onRestoreInstanceState(Bundle)方法中恢复信息,值得一提的是,onSaveInstanceState(Bundle)只有在该activity所在的进程被系统杀死的时候才会调用,比如说突然来了电话,系统内存不够。
- 通过activity的生命周期中的onPause和onResume方法;在pause的时候保存信息,在resume时恢复信息。值得注意的是,onResume和onPause不能做太耗时的工作。
IntentFilter的匹配规则
- action的匹配规则
Intent中的actionability必须能够和过滤规则中的action匹配。这里说的匹配是指action的字符串值完全相同,并且区分大小写,一个过滤规则可以有多个action,只要其中一个匹配成功就OK。但只要过滤规则中有action,Intent中必须有其中一个action和 过滤规则中其中一个相同才可以匹配成功。 - category的匹配规则
Intent中如果有category,那么所有的category都必须和过滤中的其中一个category相同。换句话说,Intent中如果出现了擦特工容易,不管有几个category,他都必须是过滤规则中定义了的。当然,如果Intent中没有定义,也可以匹配成功。 - data的匹配规则
匹配规则和action类似,如果过滤规则中定义了data,那么intent中必须也要定义可匹配的data。因为data的结构比较复杂,建议自行去查阅一下相关资料,学习一下。