• Android


    前面的两篇文章主要讲了一个方面:从app中启动其他app。但是如果你的app可以处理对其他app有用的操作,你的app也应该响应其他app的操作请求。例如,如果你创建了一个社交app可以分享信息和图片给用户的朋友,支持ACTION_SENDintent,让用户在其他app初始化分享操作然后启动你的app来执行,是一件很有趣的事情。

    为了其他app可以启动activity,应该在manifest文件中添加<intent-filter>元素和响应的<activity>元素。

    当app安装到设备上后,系统会识别intent filter然后把信息加到一个所有安装的app都支持的全局目录中。当app用模糊的intent调用startActivity()或者startActivityForResult()时,系统就会查询哪个activity(或哪些)可以响应这个intent。

    添加一个Intent Filter

    为了要正确的定义哪些intent你的activity可以处理,每个添加的intent filter在接收的操作类型和数据类型上应该尽量的明确。

    系统可能会把Intent传给activity如果activity有一个intent filter完全满足这个intent的标准:

    Action

    要指定的动作的名字。通常是平台预定义的值比如ACTION_SEND或者ACTION_VIEW。

    在intent filter中用<action>元素来指定。在这个元素中指定的值必须是动作的全名,而不是API常量。(看后面的例子)。

    Data

    和intent相关的数据描述

    在intent filter中的用<data>元素来指定。在这个元素中使用一个或多个属性,可以只指定MIME类型,URI前缀,或者这些和其他可接受数据类型的组合。

    注意:如果不不声明数据Uri的细节(比如用户处理其他类型的数据,而不是URI),应该只指明android:mimeType属性来声明activity处理的数据类型,比如text/plain或image/jpeg。

    Category

    提供了一个附加的方式来表示activity处理的intent的特性,通常和用户手势或开始的位置相关。系统支持好几个不同的category,但是很少用到。但是,所有明确的intent都默认定义为CATEGORY_DEFAULT

    在intent filter中用<category>元素来指定。

    在intent filter中,可以通过在<intent-filter>中用每个相应的XML元素来定义你的activity可以接收什么样的标准。

    例如,这里有一个activity,它通过intent filter定义了能处理ACTION_SEND的intent,并且数据类型为字符串或图片:

    1 <activity android:name="ShareActivity">
    2     <intent-filter>
    3         <action android:name="android.intent.action.SEND"/>
    4         <category android:name="android.intent.category.DEFAULT"/>
    5         <data android:mimeType="text/plain"/>
    6         <data android:mimeType="image/*"/>
    7     </intent-filter>
    8 </activity>

    每个引入的intent都指定了一个动作类型和数据类型,但是可以定义多个<action>,<category>,和<data>元素在每个<intent-filter>中。

    如果两组动作和数据在他们的行为中相互冲突,应该创建另外一个intent-filter来指明接收哪个操作时对应哪些数据类型。

    例如,假如activity可以处理ACTION_SEND和ACTION_SENDTO intent以及字符串和图片。这种情况下,应该为这两个操作定义两个不同的intent filter,因为ACTION_SENDTO intent在用必须使用URI数据来指定收件人地址,例如:

     1 <activity android:name="ShareActivity">
     2     <!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
     3     <intent-filter>
     4         <action android:name="android.intent.action.SENDTO"/>
     5         <category android:name="android.intent.category.DEFAULT"/>
     6         <data android:scheme="sms" />
     7         <data android:scheme="smsto" />
     8     </intent-filter>
     9     <!-- filter for sending text or images; accepts SEND action and text or image data -->
    10     <intent-filter>
    11         <action android:name="android.intent.action.SEND"/>
    12         <category android:name="android.intent.category.DEFAULT"/>
    13         <data android:mimeType="image/*"/>
    14         <data android:mimeType="text/plain"/>
    15     </intent-filter>
    16 </activity>

    注意:为了可以接收模糊的intent,必须在intent filter中包括CATEGORY_DEFAULT。方法startActivity()和startActivityForResult()只处理带有CATEGORY_DEFAULT的intent。如果没有声明它,那么没有模糊的intent会传给你的activity。

    更多关于使用发送和接收ACTION_SEND intent来执行社会化分享行为,查看Receiving Content from Other Apps。

    在Activity中处理Intent

    为了决定在activity中执行什么动作,可以查看启动它的Intent。

    当activity启动时,调用getIntent()来获取启动activity的Intent。在activity的声明周期的任何时候都可以查看,但是通常是在早期的回调方法(onCreate()或onStart())中查看。

    例如:

     1 @Override
     2 protected void onCreate(Bundle savedInstanceState) {
     3     super.onCreate(savedInstanceState);
     4 
     5     setContentView(R.layout.main);
     6 
     7     // 获取启动这个activity的Intent
     8     Intent intent = getIntent();
     9     Uri data = intent.getData();
    10 
    11     // 根据intent的类型决定做什么
    12     if (intent.getType().indexOf("image/") != -1) {
    13         // 处理带有图片数据的Intent。。。
    14     } else if (intent.getType().equals("text/plain")) {
    15         // 处理带有字符串的Intent。。。
    16     }
    17 }

    返回结果

    如果要返回到调用你的activity,简单的调用setResult()来指定结果代码和结果Intent。当操作完成了然后用户需要返回到以前的activity,调用finish()来关闭(然后销毁)这个activity。例如:

    1 // 创建intent来传递结果数据
    2 Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri");
    3 setResult(Activity.RESULT_OK, result);
    4 finish();

    必须要指定结果代码和结果,总体上,是RESULT_OK或RESULT_CANCELED。然后如果需要的话可以用Intent添加附加数据。

    注意:结果默认设置为RESULT_CANCELED。所以,如果用户在完成操作和设置结果前点了返回按钮,原来的activity会收到"canceled"结果。

    如果只是需要返回一个代表结果选项的数字,可以把结果码设置为任何大于0的值。如果使用结果码传递一个数字的话就不需要包含Intent了,可以调用setResult()然后只传递一个结果码。例如:

    1 setResult(RESULT_COLOR_RED);
    2 finish();

    这种情况下,只有很少的可能的结果,所以结果码是本定定义好的数字(大于0)。这个在返回给自己app中的activity是很好用,因为activity接收到结果后可以根据公有的常量来决定返回码的值。

    注意:不需要查看activity是由startActivity()还是startActivityForResult()启动的。直接调用setResult()因为启动activity的intent可能需要返回值。如果原始的activity调用了startActivityForResult(),那么系统会把setResult()提供的结果传递给它,否则,会忽视返回值。

     

     

  • 相关阅读:
    AGC034F
    loj6074
    杂题
    ICPC2020南京
    CF1326F2
    Codeforces Round #692 Div1
    CF1463F
    SRM582 SemiPerfectPower
    10月30日考试 题解(质数+最小生成树+模拟+DP优化)
    10月28日考试 题解(贪心+二分+树形DP+期望+线段树)
  • 原文地址:https://www.cnblogs.com/fengquanwang/p/3144465.html
Copyright © 2020-2023  润新知