activity是一种展示型组件,用于和用户进行交互。一个activity组件可以具有特定的启动模式,不同的启动模式都会产生不同的效果。
activity的启动是由Intent触发的,其中Intent可以分为显式Intent和隐式Intent。
显式Intent可以明确地指向一个activity组件。
隐式Intent指向一个或多个目标activity,此时可以在activity上由用户自己选择。
Intent启动activity
显式Intent
Intent(Context conntext, Class <?> class)
第一个参数提供一个启动活动的上下文,第二个参数指定想要启动的目标活动。
隐式Intent
Intent(String action)
Intent.addCategory(String category)
Intent.setDate(Uri uri)
Intent.setDateAndType(Uri uri, String mimeType)
隐式Intent是通过匹配设置在Manifest.xml中的过滤信息Intent-filter来进行设置的。一般过滤信息包括了action、category、data。
- action:指明了当前activity可以响应的action
- category:包含了一些附加信息,更加精准的指明activity可以响应的
- data:指明了activity能够响应什么类型的数据
<activity android:name=".testActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.example.activitytest.DEFAULT"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http" />
</intent-filter>
</activity>
action的匹配规则
action是一个字符串,系统预定义了一些action,我们也可以自定义action。action的匹配规则是Intent的action必须和过滤规则中的action完全匹配。
一个过滤规则中可以有多个action,只要Intent中的action能够和其中的任何一个匹配,就算做匹配成功。
category的匹配规则
category是一个字符串,系统预定义了一些category,我们也可以自定义category。
如果Intent中有category,那么Intent中所有的category都应该在过滤规则中匹配到相应的category,才可以匹配成功
如果Intent中没有category,系统在startActivity()或者startActivityForResult()时,会为Intent添加一个”android.intent.category.DEFAULT”。这也是为什么在< intent-filter >中必须有”android.intent.category.DEFAULT”这个category了。
data的匹配规则
data的语法
<data android:scheme="String"
<!-- scheme指定URI的协议,如http file content -->
android:host="String"
<!-- host指定URI的主机名 -->
android:port="String"
<!-- host指定URI的端口号 -->
android:path="String"
android:pathPathern="String"
android:pathPrefix="String"
android:mimeType="String" />
data由两部分组成,URI和mimeType
- mimeType指媒体类型,比如image/jpeg audio/mpeg4-generic video/*等,表示图片、文本、视频的不同媒体格式
URI(uniform resource identifier 统一资源标识符)用来唯一的标识一个资源。
URI(uniform resource identifier)统一资源标识符,用来唯一的标识一个资源
URL(uniform resource locator)统一资源定位器,是一种具体的URI,即URL不但用来标识一个资源,而且还指明了如何locate这个资源。
URN(uniform resource name)统一资源命名,是通过名字来标识资源。
URI是以一种抽象的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。data的匹配规则和action类似,要求Intent中含有data数据,并且能够完全匹配过滤规则中的data。如果要为Intent设置完整的data,必须调用setDateAndType()方法。
activity之间传送数据
向下一个activity传送数据
Intent.putExtra(String key, Object value)
startActivity(Intent intent)
通过startActivity方法来启动intent,Intent的putExtra()方法接收两个参数,第一个参数是键,用于后一个activity取值,第二个参数是真正要传递的数据,且数据是序列化的数据。
Intent.getStringExtra(String key)
Intent.getIntExtra(String key)
第二个activity可以通过getIntent()方法获得Intent,然后调用相应的函数获取intent中的值。
返回数据给上一个活动
在第一个activity中调用startActivityForResult()方法,第一个参数是相应的Intent对象,第二个参数是请求码,用于在之后的回调中判断数据的来源。
startActivityForResult(Intent intent, int requestCode)
在第一个activity中重写onActivityResult()来接收返回的数据,第一个参数就是上面设置的请求码,第二个参数为返回的处理结果,第三个参数是回调的Intent。
public void onActivityResult(int requestCode, int resultCode, Intent data)
在第二个activity中调用setResult()方法
setResult(RESULT_OK, Intent intent)
setResult(RESULT_CANCELED, Intent intent)
finish()
activity的生命周期
活动状态
- 运行状态:活动位于栈顶,能够和用户进行交互时,活动就处于运行状态。
- 暂停状态:活动不位于栈顶,但仍然可见时,活动就进入暂停状态。
- 停止状态:活动不位于栈顶,并且完全不可见时,活动就进入停止状态。系统仍然会为这种活动保存相应的状态和成员变量。
- 销毁状态:活动从返回栈中移除,活动就进入销毁状态。
正常情况下activity生命周期
- onCreate():表示activity正在被创建,在这个方法中可以做一些初始化的工作。
- onRestart():表示activity正在重新启动,一般是activity在不可见状态变成可见状态下会被调用。
- onStart():表示activity正在被启动,这时activity已经可见了,只是还没有出现在前台,无法和用户进行交互。
- onResume():表示activity已经可见了,activity状态变为运行状态。
- onPause():表示activity正在停止,activity状态从运行状态变为暂停状态。
- onStop():表示activity即将停止,activity状态从暂停状态变为停止状态。
- onDestroy():表示activity即将销毁,activity从停止状态变为销毁状态。
异常情况下activity生命周期
activity在异常情况下终止,系统会调用onSaveInstanceState()来保存房钱activity的状态,这个方法的调用时机是在onStop()之前,但和onPause()的时间前后顺序并没有规定。
当activity被重新创建以后,系统会调用onRestoreInstanceState(),并且把onSaveInstanceState()方法所保存的Bundle对象作为参数传递给onRestoreInstanceState()和onCreate()方法。onRestoreInstanceState()调用的时机是在onStart()之后。
activity的启动模式
activity指定启动模式
- 通过在AndroidManifest.xml对< activity >指定的android:launchMode设置
- 通过Intent.addFlags()设置标志位来指定启动模式
两者的区别在于:
- Intent的指定优先级更高,当两种同时存在,以Intent的方式为准
- 第一种无法设定FLAG_ACTIVITY_CLEAR_TOP标识
- 第二种无法为activity指定singleInstance模式
activity LaunchMode
- standard:标准模式,这是系统的默认模式。每次启动一个activity都会创建一个实例。创建的实例会进入到启动它的activity所属的任务栈中。
- singleTop:栈顶复用模式,如果新的activity已经位于任务栈的栈顶,那么activity不会被重新创建,同时它的onNewIntent()会被回调。
- singleTask:栈内复用模式,如果新的activity已经存在在任务栈中,则将任务栈的该activity以上的activity全部出栈。
- singleInstance:单实例模式,具有此模式的activity只能单独的位于一个任务栈中。
activity Flags
activity的Flags有很多,有的标记位可以设定activity的启动模式,有的标记位可以影响activity的运行状态
- FLAG_ACTIVITY_NEW_TASK:相当于指定了activity的“singleTask”启动模式
- FLAG_ACTIVITY_SINGLE_TOP:相当于指定了activity的“singleTop”模式
- FALG_ACTIVITY_CLEAR_TOP:当有此标记位的activity启动时,在同一个任务栈中所有位于它上面的activity都会出栈,一般会和singleTask启动模式一起出现。