允许其他应用启动你的Activity
负责人:zjw681691
http://developer.android.com/intl/zh-CN/training/basics/intents/filters.html
http://training.eoeandroid.com/#Allowing_Other_Apps_to_Start_Your_Activity
目录 |
Allowing Other Apps to Start Your Activity-允许其他程序运行
前两节主要侧重一件事: 从你的应用程序中打开另一个程序,但是如果你的程序能够运行对一个程序有用的动作,那么你的程序应准备好运行其他程序的指令。例如:如果你建立了一个能和用户朋友共享信息或图片的社会应用程序,实现Action-Send意图会成为你的最大利益,那样用户就可以从另一个程序中发起一个“分享”的行动,并且启动你的程序执行行动。
允许其他程序启动你的活动,你需要在你清单文件的相应<活动>元素中添加一个<.intent-filter>元素。
当你的应用程序安装到设备上,系统会识别你的意图过滤器并且将信息添加到一个意图内部目录上,而这个目录是被所有安装程序所支持的。当一个程序带着一个隐含的意图调用StartActivity或者StartActivity ForResult,系统就会发现此活动可以响应那个意图。
添加一个意图过滤器
为了准确确定你的意图活动可以操作,每个意图意图过滤器的添加应尽可能具体行动类型的条款和活动所接受的数据。
如果活动有一个能满足以下意向对象标准的过滤器,那么系统就能发送特定意图到活动。
行为:
- 一个字符串命名要执行的动作,通常是Platform-defined 值中的一个,比如Action-Send或Action-View。
- 指定意图过滤器的<行动>元素,指定在这个元素里的值必须是指导行动的完整字符串,而不是API常数(见下面的例子)。
数据:
- 数据描述和意图
- 在<数据>元素里指定你的意图过滤器,在此元素里使用一个或多个属性,你能指定MIME类型的只是一个开放的前缀,一个开放的方案,或者是这些或那些能够表明数据类型的结合。
注:如果你需要申报Uri具体数据(例如当你的活动手柄直接连接到“额外”数据,而不是一个开放的),你应该只指定安卓系统执行能够对数据类型有用的文件类型,比如纯文本或图像标题。
类型:
- 提供了一个额外的方式来描述处理意图的活动,通常和从它开始的用户的手势或位置有关。有几种被系统支持的不同类别,但是大多数很少被用到。然而,所有隐含意图是被Category-Default默认指定的。
在你的<类别>元素中指定意图过滤器
在意图过滤器中,你可以通过声明每一个嵌套在<intent-filter>元素中的相应元素来声明你的活动标准。
比如:这里有一个活动的意图过滤器,在数据类型是文本或图像时,它能处理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>
每个传入的意图被指定一个操作和一个数据类型,但在每个意图过滤器中它可以声明多个<行动>,<类>和<数据>的实例。
如果遇到任何一种行为和数据在执行中被排斥现象,你应该创建与数据配对的单独的意图过滤器来指定哪些行为是被接受的,例如:假设Action-Send和Action-Send To意图在处理文本和图像,在这种情况下,你必须为两种行为定义单独的意图过滤器,因为一个Action-Send To意图必须用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类别。如果它们包括Category_Default类别,StartActivity()和StartActivity 这两种方法能处理所有意图,如果你没有声明,就没有可以处理你活动的隐含意图。
更多关于发送和接收Action-Send意图的信息,看有关从其他程序中接收内容的课程。
Handle the Intent in Your Activity-处理活动中的意图
在决定你的活动要采取什么行为时,你可以先研究下被用来开启它的意图。作为你的行为开始,我们称getIntent()为检索意图,它是被用来发起行动的。
你可以在活动周期的任何时间做这样的事情,但一般应该在早期回调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 ... } }
Return a Result-返回结果
如果你想返回到活动的结果,你只需用setResult帮你找到指定结果代码和结果意图。当你操作完成时,用户就能回到起始的活动,就可以关闭活动,例如:
// 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。如果你用结果代码传输一个整数,你不需要包括意图,只要让SetResult()和结果代码执行这一命令即可。例如:
setResult(RESULT_COLOR_RED);
finish();
在这种情况下,有可能是只有少数可能的结果,所以结果代码是局部定义的整数(大于0)。当你在程序中返回一个活动的结果中,这是非常有效的,因为那个能收到结果的活动能够参考公共常数来确定结果代码的值。
注:没有必要去检查你的活动是否被startActivity()或startActivityForResult()开始的。如果意图能够开始你的活动并且可能预测一个结果,那么称它为setResult()。如果起始的活动已经是startActivityForResult(),那么系统将提供你向SetResult()提供的结果,否则,结果被忽略。