700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Android开发艺术探索 第一章 Activity的生命周期和启动模式

Android开发艺术探索 第一章 Activity的生命周期和启动模式

时间:2021-05-16 13:24:49

相关推荐

Android开发艺术探索 第一章 Activity的生命周期和启动模式

文章目录

第一章 Activity的生命周期和启动模式生命周期启动模式和flagIntentFilter的匹配机制相关小记

第一章 Activity的生命周期和启动模式

生命周期

分为典型情况下的生命周期和异常情况下的生命周期

典型情况

当打开新的Activity或者切换到桌面, 会调用onPause->onStop. 如果新的Activity是透明主题, 那么当前Activity不会回调onStop当启动新的Activity时, 旧的Activity先执行onPause, 然后新的Activity才启动. 所以在onPause中不能执行耗时操作, 尽量在onStop中做操作创建与销毁onCreateonDestroy

位于可见状态onStartonStop

位于前台状态onResumeonPause异常情况 资源配置的更改

@Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putBoolean(SAVED_SUBTITLE_VISIBLE, mSubtitleVisible);}

上面的数据会传入给onCreateonRestoreInstanceState, 区别在于在onCreate正常启动时Bundle 为空,判断不为空才能取出. 而onRestoreInstance一旦被调用, 就一定是有值的

内存不足被系统杀死

1.过程与1中的恢复重建相同

2.优先度的问题

从高到低依次为 前台 可见 后台(执行了onStop)

启动模式和flag

任务栈

Activity需要任务栈, 而标志着任务栈名称的参数为TaskAffinity(任务相关性). 默认情况下Activity的任务栈名称为包名.

指定时不能与包名相同, 否则没有意义. 通常与singleTask模式 或allowTaskReparent属性配对使用 singleTask启动: 会创建新的任务栈allowTaskReparent属性 设为true时, 应用会将有此属性的Activity, 从别的启动这个Activity的应用的应用栈中移回来

指定启动模式 在Activity的AndroidManifest文件中指定启动模式在Intent中设置flag(标志位)来设置启动方式且2的优先级大于1.
启动模式的种类 standard(标准模式): 谁启动这个activity, 就运行在启动她的那个activity的栈中. 且每次启动都会创建一个新的activity实例

如: 启动d 时该栈有 abcd -> abcddsingleTop(栈顶复用模式): 新的activity已经位于栈顶, 则不会创建新的activity, 即不会调用onCreate和onStart. 同时会被回调onNewIntent方法. 如: 启动d 有 abcd -> abcd

若不在栈顶, 则会重新创建该activity. 如:启动b 有abcd -> abcdbsingleTask(栈内复用模式): 创建时activity时, 系统寻找是否有该activity的栈, 如果没有就创建该栈. 栈若存在. 则寻找(或创建)activity实例并放到栈顶(寻找的会使上层activity出栈并回调onNewIntent方法).singleInstance(单实例模式): 增强版的栈内复用, 具有此模式的activity只能单独位于一个任务栈中, 且具有栈内复用的特性.

flag的种类

在使用flag时需要注意的是有些标志位是系统调用的, 不能手动调用以防出现问题 FLAG_ACTIVITY_NEW_TASK

等同于singleTaskFLAG_ACTIVITY_SINGLE_TOP

等用于singleTopFLAG_ACTIVITY_CLEAR_TOP

一般与FLAG_ACTIVITY_NEW_TASK配合使用, 如果实例存在, 就会回调onNewIntent来得到相关的参数 abc -> a

如以 standard 模式启动, 那么连同他及以上的activity都要出栈, 且系统会创建新的activity实例放入栈中. abc -> 新aFLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

等同于指定activity的属性:android:excludeFromRecents=“true”, 具有此标记的activity不会出现在历史activity的列表里

IntentFilter的匹配机制

在AndroidManifest中action下的IntentFilter中设置过滤规则

过滤规则有action(系统预设或自定义字符), category(系统预设或自定义字符), data(默认URI为contentfile)intent匹配过滤规则 action: 必须有且至少匹配过滤规则中的一个, 否则无法启动相应的activity’category: 可以没有(因为发送Intent时系统会自动添加android.intent.category.DEFAULT, 因此必须在需要隐式调用的activity的IntentFilter中加上这个)data: 必须有且至少匹配过滤规则中的一个, 否则无法启动相应的activity

不能分别设置setData和setType, 两者会相互清除对方的值. 若要完整指定, 则为setDataAndType

由两部份组成, mimeType(媒体类型)和 URI.

URI结构:<scheme>://<host>:<post> <port>/ [<path>| <pathPrefix>| <pathPattern>]

1.scheme:模式, 比如:http, content, file等,不指定, 则整个URI无效.

2.host:主机名不指定则无效

3.port: 端口号

4.path完整的路径信息.pathPattern:完整的路径信息, 可以含通配符, *(代表任意字符).pathPrefix: 路径的前缀信息 匹配机制同样适用于Service 和BroadcastReceiver, 但系统对于Service的建议是尽量使用显示调用.

相关小记

任务栈的特殊情况

查看任务栈 执行 adb shell dumpsys activity 命令查看日志中的 Running activities(most resent first)项

位于同一个栈内的activity会列在一起.

可以判断是否有activity匹配隐式intent(如果不进行判断, 当找不到匹配Intent就会报错ActivityNotFoundException) PackageManager的resolveActivity或intent的resolveActivity, 找不到,则返回nullPackageManager的queryIntentActivity, 返回所有成功匹配的Activity信息. 参数需要需要传入flagMATCH_DEFAULT_ONLY. , 该标志表明仅仅匹配那些在intentFilter中声明了DEFAULT规则的activity. 即, 如果没有使用该标志, 那么就会匹配没有声明DEFAULT的activity, 而没有声明该DEFAULT的activity不能接收隐式intent, 从而导致startActivity可能失败. (所以在需要时给其声明)
以下两者相互依存, 共同标明是应用的入口activity, 且会出现在系统的应用列表中

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。