Intent过滤
前两节课主要讲了从一个app启动另外一个app。但如果我们的app的功能对别的app也有用,那么其应该做好响应的准备。例如,如果创建了一个social app,它可以分享messages 或者 photos 给好友,那么最好我们的app能够接收 的intent,这样当用户在其他app触发分享功能的时候,我们的app能够出现在待选对话框。
通过在manifest文件中的<activity>
标签下添加的属性,使其他的app能够启动我们的activity。
当app被安装到设备上时,系统可以识别intent filter并把这些信息记录下来。当其他app使用implicit intent执行 startActivity() 或者 startActivityForResult()时,系统会自动查找出那些可以响应该intent的activity。
为了尽可能确切的定义activity能够handle的intent,每一个intent filter都应该尽可能详尽的定义好action与data。
若activity中的intent filter满足以下intent对象的标准,系统就能够把特定的intent发送给activity:
在我们的intent filter中,可以在<intent-filter>
元素中定义对应的XML元素来声明我们的activity使用何种标准。
例如,这个有intent filter的activity,当数据类型为文本或图像时会处理ACTION_SEND
的intent。
每一个发送出来的intent只会包含一个action与data类型,但handle这个intent的activity的 <intent-filter>
可以声明多个<action>
, <category>
与<data>
。
如果任何的两对action与data是互相矛盾的,就应该创建不同的intent filter来指定特定的action与type。
例如,假设我们的activity可以handle 文本与图片,无论是还是ACTION_SENDTO
的intent。在这种情况下,就必须为两个action定义两个不同的intent filter。因为ACTION_SENDTO
intent 必须使用 Uri 类型来指定接收者使用 send 或 sendto 的地址。例如:
更多sending 与 receiving ACTION_SEND intents执行social sharing行为的,请查看上一课:接收Activity返回的结果(Getting a Result from an Activity)
为了决定采用哪个action,我们可以读取Intent的内容。
可以执行 来获取启动我们activity的那个intent。我们可以在activity生命周期的任何时候去执行这个方法,但最好是在onCreate()
或者onStart()
里面去执行。
如果想返回一个result给启动的那个activity,仅仅需要执行setResult(),通过指定一个result code与result intent。操作完成之后,用户需要返回到原来的activity,通过执行finish() 关闭被唤起的activity。
我们必须总是指定一个result code。通常不是RESULT_OK
就是RESULT_CANCELED
。我们可以通过Intent 来添加需要返回的数据。