Android应用如何实现共享按钮?


11

我想知道Android应用程序和Android如何实现共享按钮和共享机制。例如,当我点击YouTube上的共享按钮时,弹出要共享的应用列表。如何确定此列表?是否存在特定的“共享”意图,然后显示能够共享意图附加中提供的意图类型的所有位置?用于实现此目的的设计模式的技术名称是什么?谢谢。


1
您是真的意思是“大便”,还是“流行”的错字?至少在美国英语中,前者是婴儿对尿布的处理方式。
JDługosz

你是对的。我最近在Android上切换到了Swype键盘,这使我可以更快地键入内容,但偶尔输入的单词却不正确,我没有注意到。尚不确定该怎么办,我不是一个非常谨慎的人。有时在子菜单中甚至无法正确看到屏幕。
Jack Maddington

在潜艇(潜水艇?)中!做什么:提交前进行校对。而且不要用尴尬的话语污染您的预测列表。
JDługosz

巧合的是,我的预测列表中充满了旧电子邮件中的内容,Swype会自动读取这些内容。kes!
Jack Maddington

Answers:


10

这有两个部分:通信应用程序说它们可以共享事物的机制,以及内容共享的应用程序的机制。我将一次与他们打交道,但首先简要说明一下意图

意向

Android 的意图是启动应用程序。它可以像快捷方式一样工作,也可以像Windows文件关联一样工作。目的可以指定要启动的应用程序的名称,但不必指定。它还可以指定要执行的操作(例如“打开您的主要活动”,“查看此URL”,“创建日历项”)以及将要执行的对象的MIME类型(例如您要查看的内容)的图片类型为jpeg)。某些操作名称特定于特定应用程序,但许多名称已由Android标准化以允许应用程序进行交互。

意图过滤器和交流应用

每个应用程序都会指定意图过滤器,以说明其可以执行的操作。例如,图像查看器应用程序将为MIME类型为“ image / *”的“查看此URL”注册一个意图过滤器;Web浏览器将为“查看此URL”注册一个意图过滤器,其中URL方案为“ http”或“ https”。为了能够共享内容,应用程序为“发送”意图注册了一个意图过滤器,可以使用特定类型(例如,如果它只能共享照片)或任何类型。

内容应用

想要共享某些内容的应用程序使用“共享”操作和指向要共享的内容的URL创建一个意图。(这通常是一个“临时” URL,它使接收方的应用程序可以临时访问内容应用程序的私有存储中的文件或内容应用程序生成的流。)它没有指定处理名称的应用程序的名称意图。然后,它将意图提供给Android框架,并要求Android显示选择器对话框。Android将意图与所有已安装应用程序的意图过滤器进行比较,并创建列表并将其显示给用户。当用户选择一个特定的应用程序时,Android会启动该应用程序并传递其意图。该应用程序使用URL从原始应用程序获取内容。

棉花糖的新功能:直接共享

在棉花糖中,还有另一种机制称为Direct Share。这补充了意图机制,以便您可以直接从选择器对话框中选择要共享的人或组,而跳过了“您希望将其发送给谁”的额外步骤。它的工作原理略有不同:通信应用程序必须提供服务。当包含内容的应用要求选择者时,Android会为每个相关应用启动服务。服务会返回相关共享目标的列表,Android 会将所有这些单独的列表组装到对话框中显示的列表中。


但是,我已经看到应用显示了很多不同的选择器对话框。它们是由操作系统真正显示的,还是应用程序本身可以获得目标列表?
user1686'6

@grawity内置对话框具有一些自定义选项(例如,设置标题),但是应用程序还可以向Android请求共享目标列表,并将其放入自己的对话框中。我的浏览器选择器bURLy就是一个示例,但是使用“打开URL”意图而不是“发送”意图。
Dan Hulme'6

11

我不是开发人员,所以我只能给出一个原始的解释:应用程序在其声明的ManifestMimetype中声明他们了解并愿意对共享操作做出响应。为此,它们定义了所谓的“意图过滤器”,例如:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="message/*" />
    <data android:mimeType="multipart/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

因此,每当您单击“共享”按钮时,都会评估要共享的内容,并与声明愿意接收格式的应用程序进行匹配。

资料来源:


1
直接就差不多了。本身的应用程序(进行共享)可以过滤一些意图回复者,但大多数不会。
coteyr

2
@HiltonShumway这就是为什么我支持他的答案。除了我以外,Dan擅长发展,并且更加了解事情的发展。因此,当我发布答案时,我希望他也能发布答案-他没有辜负我的希望:)
Izzy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.