讲到了Intent-filter如何配置,以便让其他应用能够开启自己App的界面。
如果您的应用可以执行对另一个应用可能有用的操作,您的应用应准备好响应来自其他应用的操作请求。 例如,如果您构建一款可与用户的好友分享消息或照片的社交应用,您最关注的是支持 ACTION_SEND
意向以便用户可以从另一应用发起 “共享”操作并且启动您的应用执行该操作。
要允许其他应用开始您的Activity,您需要
在相应元素的宣示说明文件中添加一个
元素。
当您的应用安装在设备上时,系统会识别您的意向过滤器并添加信息至所有已安装应用支持的意向内部目录。当应用通过隐含意向调用 startActivity()
或 startActivityForResult()
时,系统会找到可以响应该意向的Activity。
为了正确定义您的Activity可处理的意向,您添加的每个意向过滤器在操作类型和Activity接受的数据方面应尽可能具体。
如果Activity具有满足以下 Intent
对象条件的意向过滤器,系统可能向Activity发送给定的 Intent
:
ACTION_SEND
或
ACTION_VIEW
。
使用
元素在您的意向过滤器中指定此值。您在此元素中指定的值必须是操作的完整字符串名称,而不是 API 常数(请参阅以下示例)。
用 元素在您的意向过滤器中指定此内容。使用此元素中的一个或多个属性,您可以只指定 MIME 类型、URI 前缀、URI 架构或这些的组合以及其他指示所接受数据类型的项。
注意:如果您无需声明关于数据的具体信息 Uri
(比如,您的Activity处理其他类型的“额外”数据而不是 URI 的时间),您应只指定 android:mimeType
属性声明您的Activity处理的数据类型,比如text/plain
或 image/jpeg
。
CATEGORY_DEFAULT
进行定义。
用
元素在您的意向过滤器中指定此内容。
在您的意向过滤器中,您可以通过声明嵌套在
元素中的具有相应 XML 元素的各项,来声明您的Activity接受的条件。
例如,此处有一个在数据类型为文本或图像时处理 ACTION_SEND
意向的意向过滤器:
android:name="ShareActivity">
android:name="android.intent.action.SEND"/>
android:name="android.intent.category.DEFAULT"/>
android:mimeType="text/plain"/>
android:mimeType="image/*"/>
每个入站意向仅指定一项操作和一个数据类型,但可以在每个
中声明
、
和 元素的多个实例。
如果任何两对操作和数据的行为相斥,您应创建单独的意向过滤器指定与哪种数据类型配对时哪些操作可接受。
比如,假定您的Activity同时处理 ACTION_SEND
和 ACTION_SENDTO
意向的文本和图像。在这种情况下,您必须为两个操作定义两种不同的意向过滤器,因为 ACTION_SENDTO
意向必须使用数据 Uri
指定使用 send
或 sendto
URI 架构的收件人地址。 例如:
android:name="ShareActivity">
android:name="android.intent.action.SENDTO"/>
android:name="android.intent.category.DEFAULT"/>
android:scheme="sms" />
android:scheme="smsto" />
android:name="android.intent.action.SEND"/>
android:name="android.intent.category.DEFAULT"/>
android:mimeType="image/*"/>
android:mimeType="text/plain"/>
注意:为了接收隐含意向,您必须在意向过滤器中包含 CATEGORY_DEFAULT
类别。方法 startActivity()
和startActivityForResult()
就像声明 CATEGORY_DEFAULT
类别那样处理所有意向。 如果您不在意向过滤器中声明它,则没有隐含意向分解为您的Activity。
如需了解有关发送和接收 ACTION_SEND
执行社交共享行为的意向的详细信息,请参阅有关从其他应用接收简单数据的课程。
为了决定在您的Activity执行哪种操作,您可读取用于开始Activity的 Intent
。
当您的Activity开始时,调用 getIntent()
检索开始Activity的 Intent
。您可以在Activity生命周期的任何时间执行此操作,但您通常应在早期回调时(比如, onCreate()
或 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 ... } }
如果您想要向调用您的Activity的Activity返回结果,只需调用 setResult()
指定结果代码和结果 Intent
。当您的操作完成且用户应返回原始Activity时,调用 finish()
关闭(和销毁)您的Activity。 例如:
// 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
。您之后可以根据需要为 Intent
提供额外的数据。
注意:结果默认设置为 RESULT_CANCELED
。因此,如果用户在完成操作动作或设置结果之前按了返回按钮,原始Activity会收到“已取消”的结果。
如果您只需返回指示若干结果选项之一的整数,您可以将结果代码设置为大于 0 的任何值。 如果您使用结果代码传递整数,并且您无需包含 Intent
,您可以调用 setResult()
并且仅传递结果代码。 例如:
setResult(RESULT_COLOR_RED); finish();
在这种情况下,只有几个可能的结果,因此结果代码是一个本地定义的整数(大于 0)。 当您向自己应用中的Activity返回结果时,这将非常有效,因为接收结果的Activity可引用公共常数来确定结果代码的值。
注意:无需检查您的Activity是使用 startActivity()
还是 startActivityForResult()
开始的。如果开始您的Activity的意向可能需要结果,只需调用 setResult()
。 如果原始Activity已调用startActivityForResult()
,则系统将向其传递您提供给 setResult()
的结果;否则,会忽略结果。