浅谈四大组件之Activity
一.什么是Activity
以下都是我学习之后对activity的理解和笔记,以及自己的看法和总结:
Activity在应用中的表现为一个用户界面,他会加载各种ui来与用户进行交互,在我看来,activity译为活动,可以理解为一个网页,activity之间可以相互跳转,就像用户浏览一个个的网页,将不同的页面连在一起,完成一系列操作流程。
如果一个activity在AndroidManifes.xml中被设置为如下的intent-filter:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
那么这个Activity就会作为这个应用的入口,所以一般读一个应用时,优先找到这个入口的activity,然后再找到这个activity的布局进行分析就会简单多了。
二.Activity的生命周期
每个activity都有生命周期,官方给出了生命周期的流程图,以下是我对activity生命周期的理解:
- onCreated:每次创建Activity的类是默认生成这个方法,Activity创建时调用,通常在此方法中完成Activity的初始化操作,例如setContentView()设置布局,绑定事件等等。
- onStart():表示activity正在启动,即将开始,注意即将俩字,广义上可以理解为activity显示了,但还没出现在前台。
- onResume:Activity拿到了焦点,可以理解为显示到了前台
- onPause:Activity被遮挡,失去焦点时调用,可以在此时做一些数据存储,停止动画的,但不能太耗时。为什么下面会解释。
- onStop:Activity隐藏时调用,注意隐藏表示activity在前台看不见了,但还没被销毁,此时可以做些重量级回收,但也不能太耗时
- onDestroy:activity被销毁,这是Activity生命周期的最后回调。在这可以释放资源
- onRestart:activity重新启动,意为当前activity从隐藏变为可见是调用
那么Activity的切换或者开启有各种具体情况,我们只需要根据上述结合焦点的理解就能分析出典型activity情况下的生命周期,比如:
假设由Activity跳转到一个新的Activity,那么是当前activity的onPaues先执行,还是新activity的onResume先执行?
那么针对这个问题,在表面上我们只需用焦点来理解,当前activity消失,意味着失去焦点,随后新activity才能拿到焦点,所以onPause必须执行完,新activity的onResume才会执行,所以这就解释了为什么不能再onPause里做太耗时的操作,因为这会影响新activity的显示。
三.Activity的启动模式
当我们创建一个Activity的时候,系统会创建一个Activity的实例并且把它放入任务栈中,任务栈是一种“先进后出”的栈结构。Activity有4种启动模式,可以在Manifext或代码中设置。
1.standard
标准启动模式:Activity的默认启动模式,每次启动一个Activity都会为它创建一个实例,不管这个实例是否存在。后面这句话很重要,也就是多次打开这种Activity的话,就会重复创建这个Activity,非常耗资源。
2.singleTop
栈顶复用:顾名思义,在这种模式下,如果要创建的Activity已经在栈顶,那么此Activity不会再创建,而是重用位于栈顶的那个Activity实例,并且会调用onNewIntent方法,但是要创建的Activity不在栈顶,那么还是会创建一个新的实例。
3.singleTask
栈内复用:一个任务栈中只能有一个Activity的实例,要注意的是,如果已经存在Activity,系统会把处在该Activity上的所有Activity退栈。
4.singleInstance
单例模式:Activity会在一个独立的任务栈中开启,并且这个新的任务栈有且只有这一个实例。而且能够保证这种Activity在系统中只有一个实例,不管有多少应用要启动该Activity,这个Activity有且只有一个。
三.IntentFilter的匹配规则
提到启动Activity就不得不提Intent和IntentFilter,我们知道,启动Activity分为显示启动和隐式启动,显示调用需要明确指出被启动的组件的信息,包括包名和类名,而隐式则不需要。intent就不需多提了,一般翻译为意图,是组件之间的桥梁,我理解为条件。打开Activity都需要某种条件,IntentFilter就是我开出的条件,而满足我开出条件的组件就会被打开。如果匹配不成功就无法启动目标Activity。
一个Activity可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可启动对应的Activity,那么下面介绍最常用的action,category和data属性的过滤规则:
1.action
一个过滤规则中可以有多个action,只要intent中的action能够和过滤规则中的任何一个action相同就算匹配成功。
2.category
intent可以没有category,如果有,不管有几个, 每一个都要与过滤规则的任何一个相同。category意为类别,我们可以理解这是对action的具体描述,action理解为一个大致的条件,category越多这个描述越具体,当然条件越苛刻,所能与之匹配的组件越少。
3.data
data规则类似action,匹配规则中定义了data的话,那么Intent中必须也要定义可匹配的data。data由两部分组成,mimeType和Uri。前者指媒体类型,比如jpeg,MP4之类的,可以表示图片文本视频的媒体格式,而Uri很熟悉就不多做介绍。
总结下:隐式调用过程很像相亲,相亲会开出很多大体框架的条件,比如是否漂亮,身材,性格。。。这就是action那么,category就是对这个action的具体描述,比如action是漂亮,那么category就像问你哪里漂亮,是眼睛鼻子等等(不知道比喻恰当不(-__-))。