前言
一直以来就有想法,想把自己学过的知识通过写文章的方式记录下来,一来有什么错误可能还可以借助大家的力量帮忙指出,二来也可以成为自己复习的一个参考。可是,由于工作任务繁重,就只是当时把知识做了笔记,现在回头找笔记才发现自己很多知识都没那么熟练了,所以想开一个重学Android专题,复习一下学过的知识,本文就是重学Android的开篇,整理一下Activity的相关知识。
概述
本篇文章将会从以下几个方面来对Activity进行一个复习,为了不浪费大家的时间,简单列一下本篇文章的知识点,不感兴趣的可以略过。
- Activity启动模式分析
- IntentFilter匹配规则
- Acitivity 日常使用需要注意的点
接下来我们就对以上知识点一一进行复习。
-
Activity启动模式分析
我们对Activity的启动模式应该都很熟悉了,目前启动模式共有四种:standard(标准模式,也是默认模式),singleTop(栈顶复用模式),singleTask(栈内复用模式)和singleInstance(单实例模式)。
standard
标准模式,在这种模式下,每次启动Activity都会创建一个新的实例,此时,哪个Activity启动了这个Activity,这个Activity就会运行在启动它Activity所在的任务栈中 比如有两个Activity A和B,B的启动模式是standard,A启动B,B就会运行在A所在的任务栈中,所以,当用非Activity类型Context启动时,需要为其指定FLAG_ACTIVITY_NEW_TASK 这个标志位,因为非Activity类型Context是没有所谓任务栈的。
singletop
栈顶复用模式,在这种模式下,如果要启动的Activity已经位于栈顶,则不会创建新的实例,同时会回调它的onNewIntent方法,onCreate和onStart方法都不会回调,如果要启动的Activity不在栈顶,那么此时就相当于standard模式。
singleTask
栈内复用模式,只要要启动的Activity的实例存在,就不会再创建新的实例了,和singleTop一样,会回调它的onNewIntent方法,onCreate和onStart方法都不会回调。如果它的实例不存在,则首先会确认它所需任务栈是否存在,不存在则先创建任务栈,然后把它压入栈中,存在则直接入栈,需要注意的是,singleTask默认具有clearTop的功能,而且这种模式下,要启动的Acitivity是运行在自己所需要的任务栈中。
singleInstance
单实例模式,它总是单独的运行在它自己的任务栈中,只要启动它,系统便会为它创建一个任务栈并把它压入栈中,以后每次启动它均不会创建新的实例。
启动模式应用场景
singleTop:现在很多App都有推送功能,那么点击推送消息打开的Activity用singleTop模式就比较合适,这样当多条推送消息来的时候,点击不同的消息,不需要每次都创建新实例。也就是说,假如一个Activity很可能被多次启动,这时候就可以考虑用singleTop模式。
singleTask:这个模式具有clearTop的功能,所以当我们希望Activity不能保留其之上的Activity的时候,可以考虑singleTask模式,例如App主页面。
singleInstance:单实例模式,当很多App都需要打开这个Activity,我们可以考虑用这个模式,这样就可以避免创建很多实例。
-
IntentFilter匹配规则
tips:一个Intent需要同时匹配过滤规则中的 action,category,data才算匹配成功,否则匹配失败。
action
Intent必须有action且其内容必须和过滤规则中其中一个action内容完全相同。
category
如果Intent中含有category,那么所有的category都要和过滤规则中的一个category完全相同才算匹配成功,否则匹配失败,如果Intent没有category,那么在启动activity时,系统会默认加上"android.intent.category.DEFAULT"这个category,所以如果我们Activity需要隐式启动,需要加上这个默认的category,否则容易匹配失败。同时也要注意下category和action的区别。
data
data匹配规则和action一样。data是由mimeType和URI组成的,URI默认值为content和file。
-
Activity注意事项
-
Activity 间通过隐式 Intent 的跳转,在发出 Intent 之前必须通过resolveActivity(PackageMananger.queryIntentActivities(),PackageMananger.resolveActivity,Intent.resolveActivity())
检查,避免找不到合适的调用组件,造成 ActivityNotFoundException 的异常。 -
Activity间通过Intent传递数据是有大小限制的,所以不能传递过大的数据。否则容易crash或导致新Activity无法启动。可以借助EventBus,静态类等等方式来传递大数据。
-
Activity#onDestroy()方法有可能执行的晚甚至不会执行,所以有些资源回收工作可以不在这里进行,可以在onpause()或onStop()中结合isFinishing()判断执行。
参考
- 《Android开发艺术探索》
- 《阿里巴巴Android开发手册》
网友评论