浅谈Activity

浅谈四大组件之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就像问你哪里漂亮,是眼睛鼻子等等(不知道比喻恰当不(-__-))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值