Activity需要了解的基础知识

知识点总结,在生疏的时候方便回顾以下

目录

1 Activity的生命周期:

1.1 正常情况下的生命周期

1.2 异常情况下生命周期:

1.2.1 资源相关的系统配置发生改变导致Activity被杀死并重新创建。

1.2.2 内存不足导致低优先级的Activity被杀死

2 Acitivty启动模式

2.1 LauncheMode

2.2 Flag

3 IntentFilter


1 Activity的生命周期:

1.1 正常情况下的生命周期

  1. onCreate(Bundle bundle)
  2. onStart()
  3. onResume()
  4. onPause()
  5. onStop()
  6. onDestroy()

onCreate: 当Activity创建的时候会回调该方法。

onStart:当Activity对用户可见的时候回调该方法。

onResume:当Activity变为用户可交互状态时对该方法进行回调。

onPause:当Activitytivity正在停止的时候被回调。正常情况下,紧接着onStop会被调用。在这里可以做一些存储数据,停止动画等工作,但是不能太耗时。

onStop:Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

onDestroy:表示activity即将被销毁,这是Activity生命周期的最后一个阶段。在这里,我们可以做一些回收工作和最终的资源释放工作,例如handler的释放、网络接口取消请求等。

场景:

  1. 对于一个Activity,第一次启动,回调过程是:onCreate-->onStart--> onResume
  2. 当用户打开新的Activity时或者切换到桌面的时候,回调过程如下:onPause-->onStop
  3. 当用户回到原来的Activity时,回调过程是:onRestart-->onStart-->onResume
  4. 用户点击物理返回键,回调过程是:onPause-->onStop-->onDestroy

注意:1)Activity只有被其他activity遮挡的情况下才会调用opause,如果被dialog遮挡并不会调用该方法,dialog对activity 的生命周期没有任何影响。2)可以把第二个activity的theme设置为dialog主题,这样,第二个activity被调起的时候,第一个activity就会调用onPause方法,但是不回调用onStop。

1.2 异常情况下生命周期:

1.2.1 资源相关的系统配置发生改变导致Activity被杀死并重新创建。

这种情况一个典型的场景就是手机横屏和竖屏切换。屏幕方向切换的时候会依次调用生命后期函数onpause, onStop, onDestory, onCreate, onStaet, onResume.
在该场景下onStop之前会调用onSaveInstanceState.Activity重新创建后在onStart之后会调用onRestoreInstanceState.

1.2.2 内存不足导致低优先级的Activity被杀死

当系统内存不足时,系统会按照Activity的优先级,从低到高依次杀死Activity。优先级从低到高依次是后台Activi、可见非前台Activity,如被遮挡了一部分的Activit、前台Activity。并在过程中通过onSaveInstanceState和onResotreInstanceState进行数据的存储和恢复工作。如果进程中没有Activity,那么进程会很快被系统杀死。因此后台任务不适合脱离四大组件进行工作,我们通常将后台工作放到service中执行,因为service可以保证进程有一定的优先级(Android开发艺术探索中讲到这个)。

2 Acitivty启动模式

2.1 LauncheMode

launcheMode可以在manifest中通过android:launchemode属性指定。主要有三种:

  1. standard:标准模式:Activity每次启动,都会创建一个新的。不管在stack中这个Activity的实例是否已经存在。
  2. singleTop:栈顶复用:如果Activity已经在任务栈的栈顶,那么Activity就不会被重新创建。但是此时会回调onNewIntent方法,通过参数intent可以解析出相关的数据。
  3. singleTask:栈内复用模式:这是一种单实例模式,只要一个栈中有该Activity,那么它就不会被重新创建,系统同样会回调onNewIntent方法。
    singleTask比较特殊:如果一个Activity T启动,T需要的任务栈为S:1)如果S不存在,就会创建S,并创建T的实例,压入到S中。2)如果S存在,但是S中没有T的实例,那么会创建T的实例,然后入栈;3)如果S存在T也存在,会将T切换到S的栈顶,T上边的所有Activity会被清除出栈。
  4. singleInstance: 单实例模式:Android开发与艺术探索中称之为加强的singleTask模式。这种模式的Activity启动的时候系统会为它创建一个单独的任务栈,只要这个任务栈存在,后续的请求都不会创建新的该Activity的实例。

    注:默认的任务栈是包名。如果需要为Activity指定任务栈,可以使用taskAffinity来进行指定。taskAffinity通常和singleTask结合使用,或者和allowTaskRepaarenting结合使用。

2.2 Flag

以下是几种常用的flags

  1. FLAG_ACTI VITY_NEW_TASK
    将Activity设置为singleTask模式。
  2. FLAG_ACTIVITY_SINGLE_TOP
    将Activity指定为singleTop模式
  3. FLAG_ACTIVITY_CLEAR_TOP
    将同一个任务栈中它上面的Activity退栈,这个Flag通常会和singleTask结合使用,系统调用onNewIntent.如果是和standard模式结合使用,设置了该Flag的Activity在启动时,它和它上面的所有Activity都会出栈,然后系统新建一个该Activity的实例放入栈顶。
  4. Flag_ACITIVITY_EXCLUDE_FROM_RECENTS
    设置了这个Flag的Activity不会在最近列表中显示出来。和在xml中设置android:excludefromrecent有相同的效果。
  5. FLAG_ACTIVITY_REORDER_FRONT
    如果要启动的activity已经在栈中,将其提出到栈顶,其他activity位置不变

3 IntentFilter

IntentFilter主要用于Activity的隐式调用。隐式调用是通过intent和IntentFilter中的信息进行匹配来启动Activity。主要是进行action、category、data三个方面的过滤。可以在manifest中给Activity添加intent-filter标签来确定启动该Activity需要满足的过滤规则,在intent-filter中可以添加action、category和data子标签。

  1. action过滤:
    启动一个Activity时可以通过Intent的构造函数传入参数action或者通过setAction进行action的设置。一个IntentFiter中可以有多个action,intent的action只要和其中一个匹配即可。
  2. category过滤:
    启动Activity的时候通过addCategory来为intent添加category信息。一旦intent通过addCategory方法添加了category,那么它添加的每个category都要时intent-filter过滤规则中的category才能够启动Activity。如果没有通过addCategory为intent添加任何category,那么系统会默认添加一条android.intent.category.DEFAULT.因此,需要在待启动的Activity的intent-filter标签中添加同样的category才能正常启动。
  3. data过滤:
    data过滤主要包括mimeType和URI两个部分。mimeType表示媒体类型,URI包含了scheme、host、port、path、pathPattern、pathPrefix等。data的过滤规则要求intent必须包含data并且和intent-filter标签中的某一条一致,类似action的匹配规则。

猜你喜欢

转载自blog.csdn.net/xululu0401/article/details/90183428