Activity的生命周期和启动模式

1、假设当前Activity为A,如果这时打开一个新的ActivityB,那么A的onPause()先执行,B的onResume()后执行

2、onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显区别。

3、系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程。

4、如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死。

5、在屏幕旋转的时候不想让Activity重新创建就可以给android:configChange="orientation"这个值。

6、Context,该类为Long型,类似于Win32中的handle句柄,很多方法需要通过Context才能识别调用者的实例。

7、实现Context的类主要有Activity、Service,Application ,主要功能是加载和访问资源

8、在Android中有两种Context,一种是Application context,一种是activity context,通常在类和方法间传递的是activity context。

9、

 

10、四种启动模式:

a、standard:标准模式;当用ApplicationContext启动standard模式的Activity时会报android 运行时错误,解决这个问题的方法是为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这时会新建一个新的任务栈,这个时候待启动的Activity实际上是以singleTask模式启动的。

b、singleTop:栈顶复用模式;如果新Activity已经位于栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调。

c、singleTask:栈内复用模式;这是一种单实例模式,和singleTop一样,系统也会回调onNewIntent。系统首先会寻找是否存在新启动的Activity的任务栈,如果不存在,就重新创建一个任务栈,然后创建新启动的Activity放入栈中;如果存在需要的任务栈,检查是否待启动的Activity在栈中,如果有,就将其调到栈顶并调用它的onNewIntent方法,如果不存在,就创建待启动的Activity实例压人栈中。SingleTask具有clearTop的效果。

d、singleInstance:单实例模式;这是一种加强的singleTask模式,它除了具有singleTask的所有特性外,还加强了一点,只能单独地位于一个任务栈中。

11、参数TaskAffinity:任务相关性。这个参数表示了一个Activity所需要的任务栈的名字。默认情况下,所有Activity所需的任务栈的名字为应用的包名。TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配对使用。

当TaskAffinity和singleTask启动模式配对使用的时候,它是具有该模式的Activity的目前任务栈的名字,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。

12、如何给Activity指定启动模式呢?有两种方法:

a、通过AndroidManifest为Activity指定启动模式:android:launchMode;这种无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识

b、通过在Intent中设置标志位为Activity指定启动模式。无法为Activity指定singleInstance模式

13、SingleTask:当从栈中启动一个已经存在的Activity时,系统不会再执行onCreate方法,而是执行onNewIntent方法。比如SingleTask模式的Activity,连续点击3次后,Activity没有被重新创建,只是连续三次执行:暂停onPause,然后调用onNewIntent,接着调用onResume方法

14、标志位:

FLAG_ACTIVITY_NEW_TASK,作用同“singleTask”启动模式;

FLAG_ACTIVITY_SINGLE_TOP,作用同“singleTop”启动模式;

FLAG_ACTIVITY_CLEAR_TOP,具有此标记位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。singleTask启动模式默认就具有此标记位的效果;

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中

15、Intent显示启动需要明确指定被启动对象的组件信息,包括包名和类名,隐式启动则不需要明确指定组件信息。

16、隐式启动需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息。IntentFilter中的过滤信息有action、category、data。只有一个Intent同时匹配action类别、category类别、data类别才算完全匹配,只有完全匹配才能成功启动目标Activity。

17、一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。

18、action是一个字符串,一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。

19、action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同,action区分大小写

20、category要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。

21、如果不设置category,系统会默认为Intent加上“android.intent.category.DEFAULT”这个category。

22、data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、video/*等,可以表示图片、文本、视屏等不同的媒体格式,而URI的结构是:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]。

23、data的匹配的规则和action类似,如果IntentFilter中有data,它也要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。

24、URI的默认值是content和file

25、如果要为Intent指定完整的data,必须要调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法会彼此清除对方的值。

26、在action和category中,有一类action和category比较重要:

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

这两者的共同作用是用来表明这是一个入口Activity并且会出现在系统的应用列表中,缺一不可。

posted @ 2017-07-19 19:59  fankongkong  阅读(168)  评论(0编辑  收藏  举报