分类:C#、Android、VS2015;

创建日期:2016-03-06

一、简介

共享操作提供程序类(ShareActionProvider)简化了你希望与其他人(或者其他应用程序)共享或分享出来的字符串、图片、图标、以及其他各种类型的二进制文件等操作。换句话说,就是帮你实现类似我们常见的“分享到微博”、“分享到QQ空间”、“通过短信分享”、“通过邮件分享”、……,以及分享到你自己的应用程序中的某个模块或区域(比如在操作栏ActionBar中呈现出来分享的信息)等功能。

总之,ShareActionProvider就是帮你实现将信息分享到任何你希望分享到的一个或多个目标,只要这些目标满足你在分享功能中指定的操作(Action),那么这些目标就能自动收到你分享出来的信息。

说到这,你应该也进一步理解了上一节刚刚介绍的SharedPreferenc类的另一层真正的含义或用途了吧,就是除了保存应用程序配置等信息外,还能保存你最喜欢的别人或别的程序分享出来的信息,因此叫“共享操作首选项”。

1、分享的信息类型

分享出来的“信息”不论是什么,都属于下面两种类型之一。

(1)字符串分享(或者叫文本信息分享)

字符串分享有什么用呢?比如别人希望你去实现这样一个功能:当几个人一块外出去旅游时,这几个人都希望随时知道其他人当前所在的位置。这个“其他人当前所在的位置”实际上就是一个分享出来的字符串,它可以是经纬度,也可以是某个能叫得上名字的地址。

如果将这个字符串和百度地图结合在一起,就能轻松实现刚才说“几个人外出旅游”中描述的功能了。好像有个软件叫“与你同行”,该软件应该就是根据这个原理实现的。别忘了,第3章你已经学习过百度地图API提供的“短串分享”以及“地图标注”功能,这个“短串”就是这里所说的字符串。如果这个字符串是经纬度,那么就可以在百度地图的这个经纬度位置处加上一个“标注”。如果把几个人所在的位置同时都标注出来,这几个人不是就可以直观地看出其他几个人都在哪了吗,呵呵。

再进一步扩展一下,你也同样可以实现类似“监控老年人外出时当前所在的位置”、“监控出租车当前所在的位置”、……等。

如果将字符串和你的应用程序模块结合在一起,那么每个满足过滤条件的模块都可以自动接收到这些信息。

(2)二进制流分享

我们知道,任何二进制文件,都可以通过“流”(Stream)来进行存取,既然这样,那还有什么不可以分享出来呢?换言之,只要你想分享出来,什么信息都可以分享。

2、分享的操作类型

“分享”的本质含义就是需要你把准备共享的信息发送出去,以便让满足过滤条件的目标去接收。

Android提供的分享操作选项常见有:

Android.Content.Intent.ActionSend

Android.Content.Intent.ActionSendMultiple

3、谁接收分享的信息(过滤条件)

满足过滤条件的目标是接收方自己根据需要指定的,比如在程序中通过IntentFilter特性来声明过滤条件,即:可接收哪些别人或别的程序分享出来的信息。

如果别人通过程序把信息分享出来,而你的程序不愿意接收这些分享的信息,那你照样收不到(短信、邮件除外,那是一种被动接收,除非你过滤掉这些短信或邮件,比如垃圾短信、垃圾邮件等)。

ShareActionProvider的3个关键点也就是这些了,下面通过例子演示基本用法。

二、例19-2--ShareActionProvider的基本用法

该例子演示了如何在操作栏的菜单中利用ShareActionProvider把图像分享出来,由于字符串分享比较简单,这里就不演示了。

当用户单击操作栏(Action Bar)上的【图像分享】菜单项时,ShareActionProvider就会自动加载与其关联的Indent,然后把这个图像分享出去。

此示例用到了前面讲过的消息传递应用程序,接受分享信息的目标就是利用它来接收分享的图像的。另外,该例子也演示了如何读取Assets文件夹下的图像文件(monkey.png)到共享存储区。

在ch1902MainActivity.cs文件中,将图像(ch1902monkey.png)先复制到可共享访问的位置,然后利用Intent将其分享出来。

在ch1902SharedShow.cs文件中,通过IntentFilter指定满足接收分享的过滤条件,就可以在界面中显示出来ch1902MainActivity.cs文件中分享出来的图像。

运行截图

下面左图是开始界面(ch1902Main.axml),右图是单击【…】弹出的菜单项界面(ch1902ActionBarMenu.axml)。

 

下面左图是单击【图片分享】后出现的菜单项,这些菜单项是系统自动找出来的。其中,【图片分享查看器】是ch1902SharedShow.cs文件中指定的满足分享过滤的条件后,系统自动查找出来的菜单项;右图是单击【图片分享查看器】菜单项后,在ch1902SharedShow.axml文件中自动显示出来的分享结果。

  

设计步骤

1、在Assets下放置一个图片

将ch1902monkey.png拖放到Assets文件夹下。这一步主要是为了演示如何读取Assets文件夹下的图像资源。

2、添加菜单(ch1902ActionBarMenu.xml)

在Resources/menu子文件夹下创建该文件。

这个菜单中只有一个菜单项,在该菜单项中,将android:actionProviderClass设置为“android.widget.ShareActionProvider”,它就会自动创建该类的实例,这样就可以在ch1902MainActivity.cs文件中引用这个实例了。

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/ch1902_overflowMenuItem"
  4. android:showAsAction="never"
  5. android:title="图片分享"
  6. android:actionProviderClass="android.widget.ShareActionProvider" />
  7. </menu>

3、添加ch1902Main.axml

在Resources/layout下添加该文件。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <TextView
  7. android:text="提示:请单击右上角的【...】菜单。"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center"
  11. android:gravity="center"
  12. android:layout_marginTop="30dp"
  13. android:id="@+id/ch1902_textView1" />
  14. </LinearLayout>

4、添加ch1902MainActivity.cs

在SrcDemos文件夹下添加该文件。

要显示menu子文件夹下的菜单(ch1902ActionBarMenu.xml),需要在ch1902MainActivity类中重写OnCreateOptionsMenu()方法,一旦有了对该菜单的引用,就可以从菜单项的ActionProvider属性中获取ShareActionProvider对象,然后调用该对象的SetShareIntent()方法设置可分享的Intent即可。

在ShareActionProvider对象的SetShareIntent()方法的参数中,指定分享出来的Intent。

  1. using System.IO;
  2. using Android.App;
  3. using Android.Content;
  4. using Android.OS;
  5. using Android.Views;
  6. using Android.Widget;
  7.  
  8. namespace MyDemos.SrcDemos
  9. {
  10. [IntentFilter( new[]{ Intent.ActionMain }, Categories = new[] { ch.MyDemosCategory })]
  11. [Activity(Label = "例19-2-分享基本用法")]
  12. public class ch1902MainActivity : Activity
  13. {
  14. private string fileName= "ch1902monkey.png";//分享的图片文件名
  15.  
  16. protected override void OnCreate(Bundle savedInstanceState)
  17. {
  18. base.OnCreate(savedInstanceState);
  19. CopyToPublic(fileName); //将Assets下的图像资源读取到共享存储区
  20. SetContentView(Resource.Layout.ch1902Main);
  21. }
  22.  
  23. public override bool OnCreateOptionsMenu(IMenu menu)
  24. {
  25. //填充菜单
  26. MenuInflater.Inflate(Resource.Menu.ch1902ActionBarMenu, menu);
  27.  
  28. var item = menu.FindItem(Resource.Id.ch1902_overflowMenuItem);
  29. var provider = (ShareActionProvider)item.ActionProvider;
  30.  
  31. var pictureIntent = new Intent(Intent.ActionSend);
  32. pictureIntent.SetType("image/*");
  33. var uri = Android.Net.Uri.FromFile(GetFileStreamPath(fileName));
  34. pictureIntent.PutExtra(Intent.ExtraStream, uri);
  35.  
  36. //设置分享出来的Intent
  37. provider.SetShareIntent(pictureIntent);
  38. return true;
  39. }
  40.  
  41. private void CopyToPublic(string fileName)
  42. {
  43. using (Stream fromStream = Assets.Open(fileName))
  44. {
  45. string filePath = Path.Combine(new string[] { "data", "data", PackageName, "files", fileName });
  46. int size = 32 * 1024;
  47. using (FileStream toStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
  48. {
  49. int n = -1;
  50. byte[] buffer = new byte[size];
  51. while ((n = fromStream.Read(buffer, 0, size)) > 0)
  52. {
  53. toStream.Write(buffer, 0, n);
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }

5、添加ch1902SharedShow.axml

在Resources/layout下添加该文件。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <TextView
  7. android:text="下面的图来自图片分享"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_gravity="center"
  11. android:gravity="center"
  12. android:layout_marginTop="30dp"
  13. android:id="@+id/ch1902_textViewShow" />
  14. <ImageView
  15. android:layout_width="match_parent"
  16. android:layout_height="wrap_content"
  17. android:id="@+id/ch1902_imageViewShow"
  18. android:layout_marginTop="30dp" />
  19. </LinearLayout>

6、添加ch1902SharedShow.cs

在SrcDemos文件夹下添加该文件。

这个文件主要是为了演示如何设置接收图片分享的过滤条件。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using Android.App;
  7. using Android.Content;
  8. using Android.OS;
  9. using Android.Widget;
  10.  
  11. namespace MyDemos.SrcDemos
  12. {
  13. [IntentFilter( new[]{ Intent.ActionSend },
  14. Categories = new[] { Intent.CategoryDefault },
  15. DataMimeType = "image/*" )]
  16. [Activity(Label = "图片分享查看器")]
  17. public class ch1902SharedShow : Activity
  18. {
  19. protected override void OnCreate(Bundle savedInstanceState)
  20. {
  21. base.OnCreate(savedInstanceState);
  22. SetContentView(Resource.Layout.ch1902SharedShow);
  23. var imageUri = (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);
  24. if (imageUri != null)
  25. {
  26. var imageView1 = FindViewById<ImageView>(Resource.Id.ch1902_imageViewShow);
  27. imageView1.SetImageURI(imageUri);
  28. }
  29. }
  30. }
  31. }

【Android】19.2 ShareActionProvider类—帮你把信息分享出去的更多相关文章

  1. 【Android】19.1 SharedPreferences类

    分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 SharedPreferences:简单共享存储首选项.实际上就是用加密的内部文件保存所有页面都能访问的一系列“n ...

  2. 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(四)——Android端Http访问类(转)

    本章目的 在上一章中,我们利用Hibernate Tools完成了Android Model层的建立,依赖Hibernate Tools的强大功能,自动生成了Model层.在本章,我们将继续我们的项目 ...

  3. 29个android开发常用的类、方法及接口

    在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...

  4. (转载)实例详解Android快速开发工具类总结

    实例详解Android快速开发工具类总结 作者:LiJinlun 字体:[增加 减小] 类型:转载 时间:2016-01-24我要评论 这篇文章主要介绍了实例详解Android快速开发工具类总结的相关 ...

  5. 分享个 之前写好的 android 文件流缓存类,专门处理 ArrayList、bean。

    转载麻烦声明出处:http://www.cnblogs.com/linguanh/ 目录: 1,前序 2,作用 3,特点 4,代码 1,前序  在开发过程中,client 和 server 数据交流一 ...

  6. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  7. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...

  8. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  9. Android 通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

随机推荐

  1. ZH奶酪:【数据结构与算法】并查集基础

    1.介绍 并查集是一种树型数据结构,用于处理一些不相交集合的合并问题. 并查集主要操作有: (1)合并两个不相交集合: (2)判断两个元素是否属于同一个集合: (3)路径压缩: 2.常用操作 用fat ...

  2. ubuntu Server 设置主机静态 ip地址

    ubuntu Server 设置主机静态 ip地址 1:先输入 ifconfig 查看当前网络配置 2:然后关闭 eth0 网卡 sudo ifdown eth0 3:配置静态ip sudo vim ...

  3. 常用工具软件之串口终端工具——SecureCRT和xshell

    SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单的说是Windows下登录UNIX或Linux服务器主机的软件.SecureCRT支持SSH,同时支持Telnet和rlog ...

  4. 虚拟机Linux下一直获取不到ip怎么办

    虚拟机Linux下一直获取不到ip怎么办 Ifconfig -a 只显示了本地的ip127.0.0.1 和另一个eth1 但是找不到ip地址. 需要做的是: 申请ipdhclient eth1 另外释 ...

  5. PHPCMS详细文件目录结构

    PHPCMS详细文件目录结构 根目录 |  –  api  接口文件目录 |  –  caches 缓存文件目录 |  – configs 系统配置文件目录 |  – caches_* 系统缓存目录 ...

  6. java经典小程序

    1,编写程序,判断给定的某个年份是否是闰年. 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年. (2)若某个年份能被400整除,则也是闰年. import java.ut ...

  7. MySQL 数据库几种类型

    关系数据库(MySQL.Oracle.SQL Server.DB2.Postgres)键-值存储数据库(Riak和Redis)面向列的数据库(HBase) 面向文档的数据库(MongoDB 和Couc ...

  8. cordova 强制竖屏

    orentation的默认值是default 可使用的值有:default, landscape (横屏), portait (竖屏) orentation可以将设备锁定方向,不受设备旋转影响. 方案 ...

  9. grid++ 开发教程

      grid++ 开发教程 CreateTime--2018年4月24日18:43:23 Author:Marydon 1.插入报表头.明细网格.报表尾 右键-->插入-->报表节--&g ...

  10. c语言转移符和三字母序列

    三字母序列