Activity
本博客:http://blog.csdn.net/xiaowu_zhu/article/details/70142479
Activity是android与用户交互的组件,Activity中的所有操作都与用户密切相关,可以通过setContentView(View)来显示指定的控件。
在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听处理用户的事件并作出反应。
Activity形态
- Active/Running –> Paused –> Stop –> Killed
生命周期
正常情况下:
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
Activity的重新创建过程
如果activity长时间处于stopped形态,而此时系统内存紧张时,系统就会回收activity,并将activity的状态通过onSaveInstanceState()方法保存到Bundle对象中,当需要重新创建的时候,保存的Bundle对象就会传入Activity的onRestoreInstanceState()方法与onCreate()方法中。
onSaveInstanceState()并不是每次都会被调用,如果调用了finish(),就不会。
Activity优先级:
- 前台Activity— 正在和用户交互的activity,优先级最高
- 可见非前台Activity — 比如Activity中弹出了一个对话框,导致activity可见,但是位于后台无法和用户交互
- 后台Activity — 已经被暂停的activity,比如执行了onStop的,优先级最低
屏幕旋转后不重新创建activity
android:configChanges="orientation|keyboard|keyboardhidden|screensize"
上述设置,系统会调用onConfigurationChanged()方法
AndroidManifest启动模式
standard
- android默认的模式,每次启动都会创建一个实例
singleTop
- 在启动时,系统会判断当前启动的activity是不是和栈顶的相等,是就不会重新创建,否则才创建。这种启动模式,虽然不会重新创建实例,但是会调用onNewIntent()方法。
singleTask
- singTask和singTop类似,但是singleTask是检测的整个activity栈,需要注意的是如果启动模式为singleTask的activity已经在后台一个任务栈中了,那么在启动的时候会将这个任务栈切回到前台 ,并将该activity以上的activity全部出栈。
singInstance
- 这种模式和使用的浏览器类似,申明的singleInstance的Activity会出现在一个新的任务栈中,而且该栈中只存在这一个activity。
注意 : singleTop和singleTask模式下,通过startActivityForResult()方法来启动一个activity时,系统会直接返回Activity.Result_Canceled,而不再等待返回。这是由于Framework层对这两种启动方式的限制,因为开发者认为,不同Task之间默认是不能传递数据的,如果一定要传递,那就只能通过Intent来绑定。
IntentFlag启动模式
通过设置Intent的Flag来设置一个Activity的启动模式。
Intent.FlAG_ACTIVITY_NEW_TASK
- 通常在service中启动Activity情景,由于service并不存在Activity栈,所以使用该Flag来创建一个新的栈,并创建新的Acitivity实例
FLAG_ACTIVITY_SINGLE_TOP
- 与指定的android:launchMode=”singleTop” 效果类似
FLAG_ACTIVITY_CLEAR_TOP
- 与指定的android:launchMode=”singleTask”效果类似
FLAG_ACTIVITY_NO_HISTORY
- 使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了
清空任务栈
在AndroidManifest.xml的 中使用以下几种属性,可用来清理任务栈
clearTaskOnLaunch
- androdi:clearTaskOnLaunch=”true”,在每次返回该Activity时,都将该Activity之上的所有Activity都清除。
finishOnTaskLaunch
- 当离开这个Activity所处的Task,那么用户再返回时,该Activity就会被finish掉
AlwaysRetainTaskState
- 这个Activity所在的Task,将不会接受任何清理命令,一直保持的当前的Task状态
IntentFilter匹配规则
启动activity分为两种,显示和隐式。
隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果信息不匹配则无法启动目标Activity。IntentFilter中的过滤信息有action、category、data.
action匹配规则
- action是一个字符串,系统预定了一些action,同时我们也可以在应用中自定义 ,action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,一个规则中可以有多个action,只要有一个匹配,则就匹配成功,这里说的匹配是指action的字符串完全一样,另外,action区分大小写
category的匹配规则
- category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。
category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个相同。
- category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。
data的匹配规则
data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中也要定义可匹配的data.
data由两部分组成,mimeType和URI。mimeType指媒体类型。
- Scheme: URI的模式,如http、file、content
- Host: URI的主机名
- Port: URI中端口号
Path、pathPattern和pathPrefix: 这三个参数表述路径信息,其中path表示完整路径信息;pathPattern也表示完整的路径信息,但是它可以包含通配符 “*” 表示0个或多个任意字符;pathPrefix表示路径的前缀信息。
<intent-filter> <action android:name="com.xiaowu.test01.third" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter>`