zoukankan      html  css  js  c++  java
  • Android

    创建一个intent时,必须要指定intent将要触发的操作。Android定义了很多操作,包括ACTION_SEND,就象可以猜到的一样,表示intent是把数据从一个activity发送给另一个,就算是跨界。要发送数据给其他activity,值需要指定数据和它的类型,系统会识别可兼容的接收activity然后展示给用户(如果有多个选择)或者立刻启动activity(如果只有一个选择)。相似的,也可以通过在manifest中设置来注册你的activity可以接收其他程序的哪些数据类型。

    用intent在程序之间发送和接收数据是最常用的社会化分享。Intent让用户可以快速的分享信息并且容易的使用他们喜欢的程序。

    注意:最好的添加分享操作到Actionbar的方法是使用ShareActionProvider,在API等级14之后可用。ShareActionProvider会在后面讨论。

    发送字符串内容

    使用ACTION_SEND时最常用和简单的操作是发送字符串内容从一个activity到另一个。例如,内置的浏览器app可以以字符串的形式分享当前显示网页的URL给任何程序。这对于通过邮件和社交网络和朋友分享文章或网页时很有用。这里有一些代码实现了这种分享:

    1 Intent sendIntent = new Intent();
    2 sendIntent.setAction(Intent.ACTION_SEND);
    3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    4 sendIntent.setType("text/plain");
    5 startActivity(sendIntent);

    如果有一个程序匹配ACTION_SEND和MIME类型text/plain,Android系统会运行它。如果超过一个程序匹配,系统会显示一个对话框让用户选一个app。如果为intent调用Intent.createChooser(),Android会总是显示选择对话框。这有一些好处:

    • 就算用户选择了这个intent的默认操作,选择对话框仍然会显示。
    • 如果没有匹配的程序,Android会显示系统消息
    • 可以为选择对话框指定一个标题

    这里是更新后的代码:

    1 Intent sendIntent = new Intent();
    2 sendIntent.setAction(Intent.ACTION_SEND);
    3 sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    4 sendIntent.setType("text/plain");
    5 startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

    结果对话框如图1

     图1.手机上的ACTION_SEND intent截屏

    也可以为intent设置一些其他的信息:EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT。然而,如果接收的程序没有打算用他们,什么都不会发生。也可以自定义extras,但是没有任何影响除非接收程序能解析他们。最典型的是,使用接收程序自定义的extras。

    注意:一些email程序,比如Gmail,期望获得String[]类型的EXTRA_EMAIL,EXTRA_CC等,使用putExtra(string, string[])来把他们加入intent。

    发送二进制内容

    二进制数据是使用ACTION_SEND并且设置合适的MIME类型并且在附件数据中的EXTRA_STREAM中放一个指向数据的URI来分享的。这个通常用来分享图片,但是也可以用来分享任何类型的二进制内容:

    1 Intent shareIntent = new Intent();
    2 shareIntent.setAction(Intent.ACTION_SEND);
    3 shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
    4 shareIntent.setType("image/jpeg");
    5 startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

    注意下面的内容:

    • 可以设置MIME类型为"*/*",但是这样会匹配到很多可以处理数据流的app。
    • 接收的程序需要进入URI指向的数据的权限。有一些方法可以处理:
      • 把数据写到外部存储上(比如SD卡),那样的话所有app都可以读。使用Uri.fromFile()来创建传递给share intent 的URI。然后,注意并不是所有的程序都能处理file://形式的Uri。
      • 在自己程序文件夹下用MODE_WORKD_READABLE模式使用openFileOutput()把数据写入文件,之后再用getFileStreamPath()返回一个File。和前面的差不多,用Uri.fromFile()来为share intent创建一个file://样式的Uri。
      • 象图片,音频,视频这样的媒体文件可以用scanFile()扫描然后加到系统媒体库(MediaStore)中,onScanCompleted()回调方法会返回一个content://样式的Uri,也可以加到share intent中
      • 图片可以用insertImage()来加到媒体库(MediaStore)中,然后会返回一个content://样式的Uri,可以再share intent中使用。
      • 在自己的ContentProvider中保存数据,要确保其他的app有正确的权限来访问你的provider(或者使用per-URI permissions)。

    发送多条数据

    要发送多条数据,使用ACTION_SNED_MULTIPLE和一个指向数据的URI list。MIME类型根据分享的内容不同而不同。例如,如果分享3张JPEG图片,那么类型为"image/jpeg"。如果有不同的图片类型,那么就应该用"image/*"来匹配处理不同类型图片的activity。如果要处理各种不同的类型就应该用"*/*"了。正如前面提到的,分析和处理分享是数据是接收程序的事情了。这里是一个例子:

    1 ArrayList<Uri> imageUris = new ArrayList<Uri>();
    2 imageUris.add(imageUri1); // Add your image URIs here
    3 imageUris.add(imageUri2);
    4 
    5 Intent shareIntent = new Intent();
    6 shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
    7 shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
    8 shareIntent.setType("image/*");
    9 startActivity(Intent.createChooser(shareIntent, "Share images to.."));

    正如前面提到的,要确保URI指向的数据要可以被接收程序访问到。

     

    上一篇:Android - 分享内容

    下一篇:Android - 分享内容 - 接收其他APP的内容

     

  • 相关阅读:
    mysql批量导入删除
    sql查重去除id最小值
    Rest构建分布式 SpringCloud微服务架构项目
    Django模板语言及视图
    Django模板语言
    面向对象进阶
    初识面向对象
    os模块和sys模块
    random模
    时间模块
  • 原文地址:https://www.cnblogs.com/fengquanwang/p/3144651.html
Copyright © 2011-2022 走看看