跟Google学习Android开发-起始篇-与其它应用程序交互(3)

来源:互联网 发布:迈达斯软件官网 编辑:程序博客网 时间:2024/04/30 08:19

6.3允许其它应用程序启动你的活动


前两节课关注故事的一边:从你的应用程序启动另一个应用程序的活动。但是,如果你的应用程序可以执行一个对另一个应用程序可能是有用的操作,你的应用应该准备响应来自其他应用程序请求的操作。例如,如果你构建一个可以与用户的朋友共享信息或照片的社交应用程序,你最好能支持ACTION_SEND意图,这样用户就可以从另一个应用程序发起一个分享的操作来启动您的应用程序执行该操作。

要允许其他应用程序来启动你的活动,你需要在 manifest文件中为相应的<activity>元素添加一个<intent-filter>元素。

当您的应用程序安装到设备上,系统识别你的意图过滤器,并增加信息到内部的所有已安装的应用程序支持的意图目录。当一个应用程序通过一个隐式意图调用startActivity()startActivityForResult(),系统查找哪个活动(或那些活动)能响应这个意图。


添加一个意图过滤器


为了正确地定义你的活动可以处理哪些意图,你添加的每个意图过滤器,在活动接受的操作和数据的类型方面应该尽可能地具体。

该系统可以发送一个给定的意向到活动,如果该活动的意图过滤器的Intent对象符合以下条件:


Action

一个字符串命名要执行的动作通常是一个平台定义好的值ACTION_SENDACTION_VIEW

<action>元素在你的意图过滤器中指定它。此元素中指定的值必须是操作的完整字符串名称,而不是API常数(见下面的例子)。

Data

说明与意图相关的数据

<data>元素在你的意图过滤器中指定它。使用此元素中的一个或多个属性,你可以只指定MIME类型、一个URI前缀、一个URI方案,或指定这些和其它表明接受的数据类型的组合。

注:如果你不需要声明数据URI具体信息 (如您的活动时,处理其他种类的额外的数据,而不是一个URI),你应该指定只有AndroidMIMETYPE属性声明类型。您的活动的数据处理,如text / plainimage / jpeg文件

Category

提供了另一种方式描述处理意图的活动的特征通常涉及到启动它的用户的手势或位置系统支持几种不同的类但大多数都很少使用然而所有的隐式意图默认用CATEGORY_DEFAULT定义

<category>元素在你的意图过滤器中指定它。


在您的意图过滤器,你可以声明你的活动接受的条件,通过宣布每个嵌套在的<intent-filter> 元素中对应的XML元素。

例如,这里有一个活动的意图过滤器,处理数据类型是文本或图像的ACTION_SEND意图:


<activityandroid: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><category><data>元素的多个实例。

如果任何两个行动和数据对它们的行为是相互排斥的,您应该建立单独的意图过滤器来指定当与数据类型配对时哪些操作是可以接受的。

例如,假设你的活动同时处理ACTION_SENDACTION_SENDTO意图的文本和图像。在这种情况下,你必须为两个动作定义两个单独的意图过滤器,因为ACTION_SENDTO意图必须使用数据Uri通过sendsendto URI方案指定收件人的地址使用。例如:


<activityandroid:name="ShareActivity">
    <!-- filterfor 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>
    <!-- filterfor 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类别。如果你没有声明它,没有隐式意图会解决您的活动。

对于发送和接收执行社会分享行为的ACTION_SEND 意图的更多信息,请参阅课程从其他应用程序接收内容


在您的活动中处理意图


为了决定在你的活动中要进行什么样的操作,您可以读取启动活动所使用的意图

您的活动启动后,调用getIntent()检索启动活动的​​。你可以在活动的生命周期中任意时刻这样做,但通常你应该在早期回调中这样做,如onCreate()onStart() 

例如:


@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    // Get theintent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure outwhat 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 ...
    }
}


返回结果


如果你想返回结果给调用你活动的活动,只需调用setResult()指定结果代码和结果意图。当你操作完成而用户应返回到原来的活动时,调用finish()来关闭(和销毁)你的活动。例如:


// 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()结果给它,否则,结果将被忽略。