activity是一种展示型组件,用于和用户进行交互。一个activity组件可以具有特定的启动模式,不同的启动模式都会产生不同的效果。
activity的启动是由Intent触发的,其中Intent可以分为显式Intent和隐式Intent。
显式Intent可以明确地指向一个activity组件。
隐式Intent指向一个或多个目标activity,此时可以在activity上由用户自己选择。
Intent(Context conntext, Class > class)
第一个参数提供一个启动活动的上下文,第二个参数指定想要启动的目标活动。
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。
<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的匹配规则是Intent的action必须和过滤规则中的action完全匹配。
一个过滤规则中可以有多个action,只要Intent中的action能够和其中的任何一个匹配,就算做匹配成功。
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 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
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()方法。
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在异常情况下终止,系统会调用onSaveInstanceState()来保存房钱activity的状态,这个方法的调用时机是在onStop()之前,但和onPause()的时间前后顺序并没有规定。
当activity被重新创建以后,系统会调用onRestoreInstanceState(),并且把onSaveInstanceState()方法所保存的Bundle对象作为参数传递给onRestoreInstanceState()和onCreate()方法。onRestoreInstanceState()调用的时机是在onStart()之后。
两者的区别在于:
activity的Flags有很多,有的标记位可以设定activity的启动模式,有的标记位可以影响activity的运行状态