在Android中发送电子邮件时,在StartActivity()中使用Intent.createChooser()的目的是什么?

And*_*era 26 android android-intent

当我们需要在Android中发送电子邮件时,我们将使用如下的Intent.ACTION_SEND调用已注册的电子邮件应用程序

Intent i = new Intent(Intent.ACTION_SEND);
startActivity(Intent.createChooser(i, "Send mail..."));
Run Code Online (Sandbox Code Playgroud)

我怀疑为什么我们需要在startActivity中使用Intent.createChooser而不是使用 startActivty(i).使用有什么具体原因Intent.createChooser()吗?

Eup*_*rie 28

AFAIK,如果使用Intent.createChooser,有三个不同之处:

  1. 您可以指定选择器对话框的标题以使其更清晰.

  2. 即使用户选择了默认选项,系统也将始终显示选择器对话框.

  3. 如果您创建的意图Intent.createChooser与任何活动都不匹配,系统仍将显示包含指定标题和错误消息的对话框No application can perform this action.或者对于正常意图,您可能会遇到Android运行时错误:Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent

  • 这是关于第三点。仅当您使用普通意图而不是Intent.createChooser时,ActivityNotFoundException才会获得。这也是使用Intent.createChooser的另一个优点。您可以据此更改第三点。 (2认同)

War*_*ith 10

选择器使用户能够选择除默认值之外的其他邮件应用程序.如果您使用普通的gmail(privat)和电子邮件(与工作相关)并且您想要选择要采用的那个,它非常有用.

应该总是用...

  • @Android_programmer_camera:请允许用户以他们希望的方式发送任何内容.为什么你觉得你需要限制用户的选择? (2认同)

Mic*_*ael 8

路老消息,但对于其他人谁遇到它,你可以设置在意向到MIME类型的电子邮件,这将至少其限制到可以发送相应类型的消息应用程序的类型:

Intent i = new Intent(Intent.ACTION_SEND); 
i.setType( "message/rfc822");
startActivity(Intent.createChooser(i, "Send mail..."));
Run Code Online (Sandbox Code Playgroud)

使选择器对话框更清晰.


Gáb*_*bor 5

如果您不使用createChooser(),系统仍将显示选择器对话框,除非用户已经表明他们决定使用哪个已安装的程序用于给定任务(或者他们已经撤回了他们之前的决定).

如果使用createChooser(),系统将始终显示对话框,即使已经有明确的偏好.

所以,两者都是绝对正确的,你必须决定在任何给定的情况下使用哪一个.您的里程可能会有所不同,但基本上,如果您提供文本,图像,视频或类似内容的格式进行显示或编辑,您可能希望省略,createChooser()以便用户已经喜欢的内容可以立即开始.另一方面,如果你想分享一些你期望用户使用不同的已安装程序(例如,发送电子邮件,Facebook,聊天等)来处理的东西,你可能想要用createChooser()它来简化供您的用户即时选择.