【Android Developers Training】 30. 允许其它

系统 1646 0

注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接: http://developer.android.com/training/basics/intents/filters.html


之前的两节课关注于故事的一面:从你的应用启动另一个应用的activity。但是如果你的应用可以执行一个对另一个应用来说有用的行为,那么你的应用就应该准备好响应由其他应用所发起的行为需求。例如,你构建了一个社交应用,它可以和用户的朋友分享信息和照片,那么此时你最感兴趣的就是支持 ACTION_SEND 的Intent,这样用户可以在其他应用初始化一个“ 分享 ”的行为,然后启动你的应用来执行这个行为。

为了允许其他应用启动你的Activity,你需要在清单文件中,在对应的 <activity> 标签内, 添加一个 <intent-filter> (姑且称之为Intent过滤器) 标签。

当你的应用安装在一个设备上时,系统会识别你的intent过滤器,并且将信息添加至一个内部的目录,这里面收录了所有安装的应用所支持的intents。当一个应用调用 startActivity() 或者 startActivityForResult() ,并且使用的是隐式的intent时,系统会找到哪一个(些)activity可以相应这个intent。

 

一). 添加一个Intent过滤器

为了恰当地定义你的activity可以处理什么intents,每个你添加的intent过滤器,就activity能接受的行为和数据类型而言,应该是越明确越好。

如果Activity的intent过滤器能够符合下面列举的 Intent 对象标准,那么系统会将该 Intent 交付给这个activity:

Action

一个字符串,表征了将要执行的行为的名称。通常是一个系统所定义的值,如: ACTION_SEND 或者 ACTION_VIEW

在你的intent过滤器中,用 <action> 标签来特指接收的行为。在这个标签中你所特指的值必须是这个行为的全名,而不是 API 常量(见下面的例子)。

Data

这是一个和intent所关联的数据的描述。

在你的intent过滤器中,用 <data> 标签来特指它。你可以在这个标签中使用一个或多个字段,你可以只定义MIME类型,只定义一个URI前缀,只定义一个URI方案,或者是这些和其他类型的结合,它们指出了能接收的数据类型。

Note:

如果你不需要申明关于数据 Uri 细节(比如当你的activity处理其他类型的“extra”数据,而不是一个URI),那么你应该只指明“ android:mimeType ”这一属性字段,以此来声明你的activity要处理的数据类型,比如:“ text/plain ”或者“ image/jpeg ”。

Category

提供一个额外的方法来特定处理该intent的Activity,通常与用户的手势或者它所启动的地点相关。系统支持一些不同类型的category,但大多数很少使用。然而,要记住的是所有隐式的intent,默认定义了 CATEGORY_DEFAULT

在你的Intent过滤器中,用 <category> 标签特指它。

 

在你的intent过滤器中,你可以通过在 <intent-filter> 标签中添加合适的XML标签,来申明你的 activity 接收什么样的 intent

下面的例子是一个具有intent过滤器的activity,它处理的intent是这样的,具有 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只特定一个行为和一个数据类型,但是在每个 <intent-filter> 标签中声明多个 <action> <data> 或者 <category> 标签的实例也是可以的。

如果有两对行为和数据,其行为是相互排斥的,你应该分别创建intent过滤器,将行为和数据类型合理搭配避免冲突。

例如,假设你的应用处理文本和图像的数据类型,也同时相应 ACTION_SEND ACTION_SENDTO 的行为。在这种情况下,你必须为两个行为分别定义两个intent过滤器,因为一个含有 ACTION_SENDTO 的intent必须使用数据 Uri ,并通过使用“ send ”或者“ 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
      
      
        >
      
    

Note:

为了接收隐式的intent,你必须在intent过滤器中包含 CATEGORY_DEFAULT 这一category。 startActivity() startActivityForResult() 这两个方法都将所有的intent处理为包含有 CATEGORY_DEFAULT 的category。如果你不声明它,你的应用不会收到任何隐式的intent。

更多关于发送和接收 ACTION_SEND 的intents的信息,可以阅读: Receiving Simple Data from Other Apps

 

二). 处理你的Activity中的Intent

为了决定在你的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返回一个结果,调用 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

Note:

默认结果码设置为 RESULT_CANCELED 。所以当用户在执行完行为,或在你将结果数据配置完毕之前,按下返回按钮,原始的activity会收到“取消”的结果。

如果你只需要返回一个整数,它代表了一些结果项中的一个,那么你可以将结果码设置为任何一个大于0的数。如果你使用结果码来返回一个整数,此时你不需要再传递一个 Intent 。你可以调用 setResult() ,并且只传递一个结果码,例如:

      
        setResult(RESULT_COLOR_RED);

finish();
      
    

在这个例子中,可能仅有少量的一些结果,所以结果码是一个本地定义的整形(大于0)。这样做在你给自己的应用的某个activity返回一个结果时,是没有问题的,因为接收这个结果的activity可以引用公有常量来明确结果码的值。

Note:

不需要检查你的activity是被 startActivity() 还是被 startActivityForResult() 所启动的。如果启动你的activity的intent需要返回一个值,仅需要调用 setResult() 。如果原始activity调用的是 startActivityForResult() ,那么系统将会发送给它你在 setResult() 中提供的数据,不然的话,这个结果会被忽略。

【Android Developers Training】 30. 允许其它应用启动你的Activity


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论