Android官方开发文档Training系列课程中文版:与其它APP交互之允许其它APP启动你的Activity

简介: 原文地址:http://android.xsoftlab.net/training/basics/intents/filters.html在前两节课程中我们只关注了事情的一面:从你的APP启动其它APP。

原文地址:http://android.xsoftlab.net/training/basics/intents/filters.html

在前两节课程中我们只关注了事情的一面:从你的APP启动其它APP。但是如果你的APP可以执行一些功能,并且这些功能可以被其它APP所利用,那么你可以做一个功能来响应其它APP的请求。举个例子,如果你构建了一个社交APP并且可以给用户的朋友分享消息或者照片,那么这是支持ACTION_SEND意图的最佳兴趣点,所以用户可以从其它APP中启动一个”share”行为,然后启动你的APP来完成这个功能。

为了允许其它APP可以启动你的Activity,你需要添加一个< intent-filter>元素标签到清单文件中的对应的< activity>标签元素下。

当APP被安装到设备上之后,系统会识别你的意图过滤器,并且添加该信息到所有支持的内部意图目录中。当APP使用了隐式意图调用了startActivity()startActivityForResult(),那么系统会寻找那些activity可以响应这个意图。

添加意图过滤器

为了可以适当的定义Activity可以处理哪一种意图,你添加每一个意图过滤器应该尽可能的指明activity可以接受的行为类型和数据类型。

系统可能通过给定的Intent发送到activity,如果这个activity有一个意图过滤器正好可以完全匹配以下的Intent对象标准:

Action:
这个行为可以执行的名称。通常平台上定义的值比如是ACTION_SENDACTION_VIEW

在意图过滤器中使用< action>元素标签来指定该值。该值必须是这个行为的全称,而不是API常量(请看下面的例子)。

Data:
有关这个意图的数据描述。

在意图过滤器中使用< data>元素标签指定该值。使用该元素的更多属性,你可以仅仅指定MIME类型,URI前缀类型,URI计划类型,或者这些类型的组合,以及可以接收的其它数据类型。

Note:如果你不需要声明Uri数据的指定类型(比如你的activity处理其它种类的附加数据,而不是URI),你应该通过android:mimeType属性声明activity可以处理的数据类型,比如text/plain或者image/jpeg。

Category:
提供了一种附加方式来描述activity处理intent,通常与启动的用户手势或者位置有关。这里有几个系统支持的不同的分类,但是大多数是很少使用的。然而,所有的隐式意图会在默认情况下使用CATEGORY_DEFAULT定义。

可以在意图过滤器中使用< category>元素标签指定该值。

在意图过滤器中,你可以通过在意图过滤器中使用相应的XML元素来声明activity可以接收的意图标准。

举个例子,这里的activity可以处理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都只会指定一个行为和一个数据类型,但是在每一个过滤器中声明多个< action>,< category>,和< data>元素的话,这就没问题了。

如果任意的两对行为和数据会在他们的行为中相互排斥的话,你应该创建单独的意图过滤器来指明哪个行为可以接收,当也匹配到相应的数据类型时。

举个例子,假设activity在ACTION_SEND行为下或者ACTION_SENDTO行为下都可以处理文本和图像。在这种情况下,你必须定义两个单独的意图过滤器,因为ACTION_SENDTO意图必须使用数据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:为了可以接收隐式意图,你必须在过滤器中包含类别CATEGORY_DEFAULT。startActivity()和startActivityForResult()方法会对待所有的Intent,仿佛他们都声明了CATEGORY_DEFAULT类别。如果你没有在意图过滤器中声明它,那么将不会有隐式意图传送到该activity中。

有关更多关于发送和接收ACTION_SEND意图来执行社会分享行为的相关信息,请参见课程: Receiving Simple Data from Other Apps.

在Activity中处理意图

为了决定要在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的那个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会接收到”canceled”结果。

如果你简单的需要返回一个整型,这个整型指明了若干个结果选项,那么你可以设置结果码为比0大的任何值。如果你使用了结果码来传递一个整型值,那么你不再需要包含Intent对象,你可以调用setResult()方法,然后只传一个结果码进去:

setResult(RESULT_COLOR_RED);
finish();

在这个例子中,这可能对结果有损伤,所以结果码是一个本地变量。这种情况在你自己的APP中运行的话,效果会很好,因为原来的activity可以接收到结果码,然后引用一个公开的常量来判断结果码的值。

Note:这里不需要检查你的activity是否是通过startActivity()或者startActivityForResult()启动的。那个启动你activity的activity可能希望会有个结果返回。如果原来的activity调用了startActivityForResult(),那么系统会传递setResult()结果,否则,这个结果会被忽略。

目录
相关文章
|
4月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
41 0
|
2天前
|
JSON Android开发 数据格式
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
android与Web服务器交互时的cookie使用-兼谈大众点评数据获得(原创)
11 2
|
2天前
|
XML JSON API
转Android上基于JSON的数据交互应用
转Android上基于JSON的数据交互应用
|
2天前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
|
26天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
12 0
|
26天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
14 0
|
2月前
|
移动开发 JavaScript Android开发
Android与Html5交互
Android与Html5交互
|
7月前
|
SQL 人工智能 移动开发
Android应用启动流程:从启动到可交互的过程解析
Android应用启动流程:从启动到可交互的过程解析
|
3月前
|
Android开发
App Inventor 2 Activity启动器技巧:如何查看并启动其他App
Activity启动器(ActivityStarter)如何查看并启动其他App,可以通过解压源码查看,或使用“包名查看器”App查看,不同品牌手机可能略有不同。
78 0
|
3月前
|
XML Android开发 数据格式
安卓和webview交互
安卓和webview交互
26 0