Android技术要点【一】四大组件之Activity

Activity是一个用户界面的概念。Activity通常表示应用程序中的一个屏幕。他通常包含一个或者多个View,但也可以不包含View。Activity与他这个词的本身的含义很相似:帮助用户完成某一个操作,这个操作可能是查看数据,创建数据或编辑数据。大部分Android应用程序内部都拥有多个Activity。

1、Activity的生命周期

  • onCreate:Activity正在被创建,生命周期中的第一个方法,可以应用去做一些初始化工作,setContentView、initData。
  • onRestart:表示Activity正在重新启动,当Activity从不可见到可见状态时,此方法就会被调用。
  • onStart:表示Activity正在被启动,这时Activity已经可见,但是还没有出现在前台,无法和用户进行交互。
  • onResume:表示Activity已经可以看见了,并且可以和用户交互了,与onStart的区别是一个在前台,一个在后台。
  • onPause:表示Activity正在被停止,通常紧接着onStop就会被调用,此方法中可以做一些保存数据,停止动画等操作,但是不能太耗时,因为新的Activity的onResume会等到前一个Activity的onPause执行完成后才执行。
  • onStop:表示Activity即将停止,可以做一些稍微重量的工作,但是同样不能太耗时。
  • onDestroy:表示Activity即将被销毁,这是Activity中最后的方法,此时可以做一些最后的资源释放回收的工作。

2、Activity启动流程

  1. 一般的Activity启动流程:onCreate -> onStart -> onResume
  2. 当用户打开新的Activity或者退回到桌面时:onPause -> onStop, 如果Activity采用了透明的主题时,Activity就不会回调onStop
  3. 当用户再次回到Activity时:onRestart -> onStart -> onResume
  4. 当用户按back时:onPause -> onStop -> onDestroy
  5. 当Activity被系统回收时,会再次像(1)一样走一遍生命周期
  6. 从整个生命周期来说,onCreate和onDestory相配对,标志着Activity 的创建与销毁,并且只会被调用一次,从Activity是否可见来说,onStart与onStop随着用户的操作或者时点亮熄灭屏幕这两个方法会被调用多次,从Activity是否在前台来说,onResume和onPause是配对的,随着用户的操作或点亮熄灭屏幕,此两个方法会被调用多次。
问题一:onStart、onResume、onPause、onStop区别
onStart、onStop是从Activity是否可见这个角度来回调的
onResume、onPause是从Activity是否位于前台这个角度来回调的
问题二:从Activity A跳转到Activity B,A的onPause和B的onResume哪个先执行?
会先执行A的onPause,再执行B的onResume

3、Activity异常生命周期

a、在Activity异常退出时,比如说被系统回收,就会调用onSaveInstanceState方法来保存当前的Activity状态,调用时机是在onStop之前,但和onPause没有确定时许关系,有可能在之前或者之后,当Activity又被重新调用打开时,会调用onRestoreInstanceState方法,会把onSaveInstanceState保存的bundle对象同时传递给onRestoreInstanceState和onCreate方法,此时就可以通过这两个方法来判断是否被重建来恢复 数据,从时许上来说,onRestoreInstanceState方法是在onStart之后。
b、当系统配置发生改变时,比如切换屏幕时,Activity会被重新创建,不想系统重新创建Activity,就可以给Activity制定configChanges属性添加orientation这个值。

4、Activity启动模式 standard、singleTop、singleTask、singleInstance

standard:标准的启动模式,每启动一次,就会创建一个该Activity的实例,被创建的实例会走Activity的各个生命周期,而且一个任务栈中也允许多个实例存在,A启动了B,B就会进入到A的任务栈中,当使用ApplicationContext去启动Activity时,会保错,是因为Application没有一个任务栈供Activity进入,解决此问题,需给待启动的Activity指定FLAG_ACTIVITY_NEW_TASK这个值,会以一个singleTask形式去启动这个Activity
singleTop:栈顶复用模式,当新的Activity被创建时它正位于栈顶,那么此时它不会被创建,同时onNewIntent方法会被调用。通过此方法会获取到新的启动消息,通常这个Activity的生命周期不会走onCreate和onStart两个。如果Activity没有位于栈顶,那么会在栈顶在创建出来一个Activity(比如新闻客户端的内容页面)
singleTask:栈内复用模式,这是一种单例模式,这种模式下,只要Activity存在于栈中,多次启动该Activity只会调用onNewIntent方法,这种模式启动有三种情况,1、所要启动的Activity,和所需要的任务栈都不存在,那么系统会自动开一个新的任务栈,并同时创建出Activity放入栈中,2、Activity所需的任务栈已经存在,那么就会直接创建出Activity放入任务栈中,3、存在需要启动的Activity和任务栈,那么就会复用此Activity,并把它提到栈顶,并将它之上的全部剔除栈。(适用于一个程序的主界面)
singleInstance:单实例模式,加强的singleTask模式,出了拥有singleTask全部属性外,此种模式下的Activity只能单独的位于一个任务栈中。后续的请求也不会重新创建该Activity(适用于需要和程序其他页面分开的页面)

在singleTask启动模式中,我们多次提到Activity启动所需的任务栈,那么什么是Activity启动所需的任务栈呢?这要从一个参数说起,TaskAffinity,翻译过来就是任务相关性,参数标识了一个Activity启动所需要的任务栈的名字,通常情况下是应用的包名。也可以为TaskAffinity单独设置,但是不能和包名相同,TaskAffinity主要和singleTask或者allowTaskReparenting属性相配对使用。

如何给Activity指定启动模式呢?有两种方法,一种是在Androidmenifest中设置launchMode属性来指定,第二种,是在启动Activity时,给intent设置Flags属性。
两种设置方式的区别:第二种优先级高于第一种,第一种无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP,第二种无法为Activity设置singleInstance属性。

5、Activity的Flags
Activity中的Flags很多,作用也很多,主要咱们能够用到的就是影响Activity的启动模式,和影响Activity的运行状态。
FLAG_ACTIVITY_NEW_TASK = singleTask
FLAG_ACTIVITY_SINGLE_TOP = singleTop
FLAG_ACTIVITY_CLEAR_TOP :设置这个属性,在同一个任务栈中位于所启动Activity之上的Activity都会被出栈,一般和FLAG_ACTIVITY_NEW_TASK配合使用
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:这个标记表示Activity不会出现在历史Activity列表中。等同于XML中设置Activity属性android:excludeRecents = "true"


6、Activity Intent启动的intentFilter匹配规则
启动Activity有隐式和显示两种方法,显示的不用过多解释,重点说一下隐式启动时IntentFilter的匹配规则,IntentFiler中的过滤信息又action、category、data
action:Intent中的action必须和intent-filter中的某一个action相同
category:Intent中如果含有category,那么所有的category都必须和intent-filter中的某个category相同 它和action的不同是Intent要求必须有一个action且和infiliter中的某一个action相同,这是Activity的隐式调用所必须的 Intent中category可以没有category,因为它启动的时候默认会追加一个android.intent.category.DEFAULT,所以这也就要求intent-filiter中必须有android.intent.category.DEFAULT
data:intent-filter如果定义了data,那么Intent中的data必须和Itent-filter中某一个data相同 
data是有两部分组成,mimeTypeURI,mimeType是指媒体类型 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值