看了标题也许你会想,也许你会说,activity我天天用,我最了解不过了,没有什么是我不清楚的。你怕是在唬我吧?那下面就看看我说的这些你都了解嘛
基础知识
-
正常情况下的生命周期
-
onCreate:表示Activity正在被创建,我们可以做一些初始化工作,没啥子可说的。
-
onRestart:当当前Activity从不可见重新变为可见状态时,该方法会被调用。
-
onStart:这时Activity已经可见的,但是处于后台,无法和用户交互。
-
onResume:这时Activity已经可见的,但是处于前台。
-
onPause:在这个方法可以做一些存储数据,停止动画的操作,但是不能太耗时,因为这会影响到新Activity的显示,onPause必须执行完,新Activity的onResume才会执行。
-
onStop:Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
-
onDestory:表示Activity即将销毁,我们可以做一些回收工作和资源释放工作。
Activity第一次启动会调用onCreate-->onStart-->onResume,当用户打开新的Activity或者切换到桌面的时候,会调用onPause-->onStop,如果这个Activity采用透明主题,不会调用onStop,是因为新Activity透明主题我们还能看到下面那个之前Activity,所以不会调用onStop,再回到原Activity时调用onRestart-->onStart-->onResume.
-
-
异常情况下的生命周期
-
资源相关的系统配置发生改变导致Avtivity被杀死并重新创建
-
资源不足时导致优先级低的Activity被杀死
-
...
Activity会调用onSaveInstanceState方法,系统自动为我们做了一定的恢复工作,并且重启为我们恢复这些数据,比如文本框中用户输入的数据,listView滚动位置等,具体的我们可以查看特定View的源码。
-
-
Activity的启动模式
1、使用场景
-
standard:当需要每次请求都新开一个实例的时候,比如,浏览器开多个浏览窗口。
-
singleTop:适合作为接受通知的启动界面,比如,客户端收到10条推送,如果是标准模式,分别点击这10个推送,就会启动10个这样的显示内容的界面,而如果是singleTop,则只会打开一个显示界面。
-
singleTask:适合作为程序的入口,不管其他程序打开该界面多少次,都只会在任务栈中存在一份,比如浏览器的启动界面。
-
singleInstance:适合永远都不会变化的界面,比如闹钟的提醒界面,在比如拨号程序的呼叫界面。
-
2、它们主要有如下不同:
- 如何决定所属task
“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
“singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。 - 是否允许多个实例
“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;
“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。 - 是否允许其它activity存在于本task内
“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
而另外三种模式,则可以和其它activity共存。 - 是否每次都生成新实例
“standard”对于没一个启动Intent都会生成一个activity的新实例;
“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
“singleInstance”是其所在栈的唯一activity,它会每次都被重用。
“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
2、IntentFilter的匹配规则
- action的匹配规则:要求Intent中的action存在且必须和过滤规则中的其中一个action相同,这个区分大小写,如果相同的字符串,大小写字母不同,action会匹配失败。
- category匹配规则:这个可有可无,如果有,则必须和过滤规则中的其中一个category相同,如果不写的话,在启动Activity时系统会自动加上"android.intent.category.DEFAULT"
- data可进一步分为uri(由scheme、host、port、path | pathPattern | pathPrefix这4部分组成)和mimetype。Intent的uri可通过setData方法设置,mimetype可通过setType方法设置。隐式Intent也必须指定data。同action类似,只要Intent的data只要与Intent Filter中的任一个data声明完全相同,data方面就匹配成功。需要注意的是:若Intent Filter的data声明部分未指定uri,则缺省uri为content或file,Intent中的uri的scheme部分需为content或file才能匹配;若要为Intent指定完整的data,必须用setDataAndType方法,原因请看setData和setType方法的源码:
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
public Intent setType(String type) {
mData = null;
mType = type;
return this;
}
从以上代码可以看到,setData会把mimeType置为null,setType会把uri置为null。下面我们来举例说明一下data的匹配。首先我们先来看一下Intent Filter中指定data的语法:
<data android:scheme="...“
android:host="..."
android:port="..."
android:path="..."
android:pathPattern="..."
android:pathPrefix="..."
android:mimeType="..." />
其中scheme、host等各个部分无需全部指定。假如我们为MyActivity的Intent Filter指定了如下data:
<intent-filter>
<data android:mimeType="vidoe/mpeg" android:scheme="http" android:host="www.xxx.com" />
<data android:mimeType="text/plain" android:scheme="http" />
</intent-filter>
那么我们的Intent想要匹配,mimeType可以为”text/plain"或“video/mpeg",scheme必须为”http“,host则没有限制,因为第二个data没有指定host。
最后
这就是我知道的关于activity的一些知识,若有叙述不清晰或是不准确的地方希望大家指出,如果你知道更多知识,欢迎给我评论,大家一起学习进步。谢谢观看
网友评论