热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Android】19.2ShareActionProvider类—帮你把信息分享出去

分类:C#、Android、VS2015;创建日期:2016-03-06一、简介共享操作提供程序类(ShareActionProvider)简化了你希望与其他人(或者其他应用程序)

分类: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文件中引用这个实例了。

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

3、添加ch1902Main.axml

在Resources/layout下添加该文件。

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

4、添加ch1902MainActivity.cs

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

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

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

using System.IO;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Views;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [IntentFilter( new[]{ Intent.ActionMain }, Categories = new[] { ch.MyDemosCategory })]
    [Activity(Label = "例19-2-分享基本用法")]
    public class ch1902MainActivity : Activity
    {
        private string fileName= "ch1902monkey.png";//分享的图片文件名

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            CopyToPublic(fileName);  //将Assets下的图像资源读取到共享存储区
            SetContentView(Resource.Layout.ch1902Main);
        }

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            //填充菜单
            MenuInflater.Inflate(Resource.Menu.ch1902ActionBarMenu, menu);

            var item = menu.FindItem(Resource.Id.ch1902_overflowMenuItem);
            var provider = (ShareActionProvider)item.ActionProvider;

            var pictureIntent = new Intent(Intent.ActionSend);
            pictureIntent.SetType("image/*");
            var uri = Android.Net.Uri.FromFile(GetFileStreamPath(fileName));
            pictureIntent.PutExtra(Intent.ExtraStream, uri);

            //设置分享出来的Intent
            provider.SetShareIntent(pictureIntent);
            return true;
        }

        private void CopyToPublic(string fileName)
        {
            using (Stream fromStream = Assets.Open(fileName))
            {
                string filePath = Path.Combine(new string[] { "data", "data", PackageName, "files", fileName });
                int size = 32 * 1024;
                using (FileStream toStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
                {
                    int n = -1;
                    byte[] buffer = new byte[size];
                    while ((n = fromStream.Read(buffer, 0, size)) > 0)
                    {
                        toStream.Write(buffer, 0, n);
                    }
                }
            }
        }
    }
}

5、添加ch1902SharedShow.axml

在Resources/layout下添加该文件。

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:text="下面的图来自图片分享"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:layout_marginTop="30dp"
        android:id="@+id/ch1902_textViewShow" />
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ch1902_imageViewShow"
        android:layout_marginTop="30dp" />
LinearLayout>

6、添加ch1902SharedShow.cs

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Widget;

namespace MyDemos.SrcDemos
{
    [IntentFilter( new[]{ Intent.ActionSend },
        Categories = new[] { Intent.CategoryDefault },
        DataMimeType = "image/*" )]
    [Activity(Label = "图片分享查看器")]
    public class ch1902SharedShow : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.ch1902SharedShow);
            var imageUri = (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream);
            if (imageUri != null)
            {
                var imageView1 = FindViewById(Resource.Id.ch1902_imageViewShow);
                imageView1.SetImageURI(imageUri);
            }
        }
    }
}

【Android】19.2 ShareActionProvider类—帮你把信息分享出去


推荐阅读
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 解决Anaconda安装TensorFlow时遇到的TensorBoard版本问题
    本文介绍了在使用Anaconda安装TensorFlow时遇到的“Could not find a version that satisfies the requirement tensorboard”错误,并提供详细的解决方案,包括创建虚拟环境和配置PyCharm项目。 ... [详细]
  • 查找最小值的操作是很简单的,只需要从根节点递归的遍历到左子树节点即可。当遍历到节点的左孩子为NULL时,则这个节点就是树的最小值。上面的树中,从根节点20开始,递归遍历左子 ... [详细]
  • 本文详细介绍了如何在C#程序运行期间防止系统进入休眠模式以及显示器关闭,提供了具体的实现代码示例,并解释了其应用场景。这不仅有助于提高程序的稳定性,还能优化能源管理。适合需要处理长时间任务(如下载或批处理)的开发者参考。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
author-avatar
我的老公是个兵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有