原文点击打开链接
Allowing Other Apps to Start Your Activity
前两次课集中在一侧的故事:从你的应用程序启动另一个应用程序的活动。但是如果你的应用
程序执行的一个动作可能对另一个应用程序有用的,应用程序应该准备响应来自其他应用程序
的请求。例如,如果你做了个可以分享消息和照片的社交app,你支持ACTION_SEND 意图,使
用户们可以从另一个app要做一次share行为来启动你的app。
允许其他应用程序启动你的activity,您需要添加一个< intent-filter >元素在你的清单文件
对应的<活动>元素中。
设备上安装应用程序时,系统识别你的意图过滤器并将信息添加到一个所有已安装的应用程序
支持的意图的内部目录。当应用程序调用startActivity()或startActivityForResult(),与隐
式意图,系统找到可以应对意图的活动(或多个活动)。
Add an Intent Filter
为了正确地定义哪些意图可以处理你的活动,每个意图过滤器添加应尽可能具体的行动和活动接受数据的类型。
系统可能发送一个给定的意图到一个活动,如果那个活动有intent filter符合下面intent对象的标准:
Action
一个字符串命名的执行的action。通常一个平台的值如ACTION_SEND或ACTION_VIEW。
指定该在你的意图过滤器<行动>元素。您所指定的这个元素的值必须是完整的字符串,而不是API的常数(见下面的例子)。
Data
意图数据的描述。
指定该在你的意图过滤器<数据>元素。在这个元素使用一个或多个属性,你可以指定仅仅MIME类型,仅仅一个URI的前缀,仅仅一个URI方案,或这些的组合。
注意:如果你不需要声明数据uri的特性,你应该指定仅仅android:mimeType属性来声明你的activity处理的数据类型,如text/plain 或 image/jpeg。
Category
有几种不同类别的支持系统,但大多数是很少使用。然而,默认所有与CATEGORY_DEFAULT定义隐式意图。
在intent filte中指定 <category>元素。
例如,这里有一个活动,一个意图过滤器处理ACTION_SEND意图时,数据类型是文本或图像:
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
每个传入的意图只指定一个动作和一个数据类型,但是没关系去声明多个实例<行动>、<目录>,<数据>元素在每个< intent-filter >。
如果任何两对行动和数据在他们的行为是相互排斥的,您应该创建单独的意图过滤器时指定哪些行为是可以接受的。
例如,假设你的活动处理文本和图像ACTION_SEND和ACTION_SENDTO意图。在这种情况下,您必须定义两个单独的两个动作的意图过滤器,因为ACTION_SENDTO意图必须使用数据Uri指定收件人的地址使用发送或sendto Uri方案。例如:
<activity android:name="ShareActivity">
<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
注意:为了得到隐含的意图,你必须包括CATEGORY_DEFAULT类别的意图过滤器。方法startActivity()和startActivityForResult()对所有的意图,他们默认加了CATEGORY_DEFAULT类别。如果你不声明意图过滤器,没有隐式意图将解决你的活动。
Handle the Intent in Your Activity
你activity开始的时候,调用getIntent()来取出开始这个activity的意图。在activity生命周期中的任意时刻做,但你应该早做这个操作,在oncreateview()或onstart()。
例如:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();
// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}
Return a Result
如果你想返回一个结果给开启你的activity,仅仅调用setResult()来指定结果code和结果意图。例如:
// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
setResult(Activity.RESULT_OK, result);
finish();
您必须指定一个结果代码。总体来说,这是RESULT_OK或RESULT_CANCELED。然后您可以提供额外的数据与一个意图,是必要的。
注意:默认设置为RESULT_CANCELED结果。所以,如果设置结果之前用户按下后退按钮,原来的活动收到“取消”的结果。
如果你简单地需返回一个整数,你可以设置任何值大于0的结果代码。如果你不需要返回intent对象,也可以只设置结果code。例如:
setResult(RESULT_COLOR_RED);
finish();
注意:不需要检查是否你的活动是始于startActivity()或startActivityForResult()。如果最初的activity调用startActivityForResult(),系统支持分发一个结果给它,否则结果会被忽略。