android系统分享的自定义功能的示例代码

发布时间 - 2026-01-11 02:44:03    点击率:

分享功能是app中特别常见的功能,国内的app基本都支持分享到微信 QQ等主流的社交应用。至于分享功能的实现大多是使用第三方的share sdk一步到位,或者分享的app比较少比如就一个微信 那通常使用微信sdk的分享模块即可。但其实android系统就给我们提供过一种分享的实现方式,代码也比较简单如下

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.putExtra(Intent.EXTRA_TEXT, shareText);
    share.putExtra(Intent.EXTRA_SUBJECT, shareSubject);

    if (uri != null) {
      share.setType("image/*");
      share.putExtra(Intent.EXTRA_STREAM, uri);
    }
    context.startActivity(Intent.createChooser(share, title));

系统提供的短短不到十行代码,将分享列表 数据 展示 点击 跳转 跳转后分享内容的分享等一系列动作都集合完成了。这样确实给人干净利索的感觉,但随之问题也来了比如我分享列表中只有特定几个app,甚至把某个app放在第一个,还有点击Facebook的分享后分享方式我想用facebooksdk自带的,等等一些列自定义功能完成就比较麻烦。

对个别app的分享特别处理

从以上的代码可以看出,google官方定义出分享的key value一一对应规则。比如Intent.EXTRA_STREAM对应为分享图片的uri,Intent.EXTRA_TEXT对应为分享的text文本。从道理上讲如果分享到的app都遵循google定义的这规则我们就能通过官方这代码实现分享到所有app的功能。然而理想很丰满现实很骨感,比如我们项目中要求分享到的facebook就压根不遵守这规则,我们想实现分享到Facebook就必须用其sdk实现。于是我们就需要在分享列表中点击Facebook是单独走Facebook的分享逻辑。

  • 常规思维这是一个列表,我们监听列表item的点击事件即可,然而从实现该分享列表的代码 可以看出没有类似listview recyclerview控件,也没有adapter,扒了下源码和google找不到item的点击事件的监听,故该方案放弃了
  • 所以只能采用了自己实现分享列表,然后监听分享列表item点击事件单独处理的方式,也是符合常规思路

第一步:获取分享列表的数据

 

    private static List<List<ResolveInfo>> getShareActivities() {
    Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
    sharingIntent.setType("text/plain");
    PackageManager pm = App.getInstance().getPackageManager();
    List<List<ResolveInfo>> listArrayList = new ArrayList<>();
    List<ResolveInfo> activityList = pm.queryIntentActivities(sharingIntent, 0);
    List<ResolveInfo> newActivityList = new ArrayList<>();

    for (Iterator<ResolveInfo> it = activityList.iterator(); it.hasNext(); ) {
      ResolveInfo info = it.next();
      //过滤出facebook google+ whatapp twitter 分享app单独处理
      LogUtils.e("+++", info.activityInfo.packageName);
      if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc") || info.activityInfo.packageName.equals("com.facebook.katana") || info.activityInfo.packageName.equals("com.google.android.apps.plus") || info.activityInfo.packageName.equals("com.facebook.orca") || info.activityInfo.packageName.contains("whatsapp") || info.activityInfo.packageName.equals("com.twitter.android")) {
        if (info.activityInfo.packageName.equals("com.android.bluetooth") || info.activityInfo.packageName.equals("com.android.nfc")) {
          it.remove();
        } else {
          newActivityList.add(info);
          it.remove();
        }
      }
    }
    //增加一条other数据
    newActivityList.add(null);
    listArrayList.add(newActivityList);
    listArrayList.add(activityList);
    return listArrayList;
  }

第二步:构建分享的列表,且定义点击事件等

public static void systemShareDialog(List<ResolveInfo> packages, Context context, String title, String shareText) {
    List<Intent> targetIntents = new ArrayList<Intent>();
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    SPM spm = new SPM();

    for (ResolveInfo candidate : packages) {
      String packageName = candidate.activityInfo.packageName;
      Intent target = new Intent(android.content.Intent.ACTION_SEND);
      target.setType("text/plain");
      target.putExtra(Intent.EXTRA_TEXT, shareText);
      //target.setPackage(packageName);
      //t will be able to handle the case of multiple activities within the same app that can handle this intent. Otherwise, a weird item of "Android System" will be shown
      target.setComponent(new ComponentName(packageName, candidate.activityInfo.name));

      targetIntents.add(target);
    }
//    createchooser时使用targetIntents.remove(0)即传入targetIntents的第一个intent,并将其移除,
//
//    否则执行chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[] {}));添加后启动时会出现两个相同的应用
    Intent chooserIntent = Intent.createChooser(targetIntents.remove(0), title);
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
    context.startActivity(chooserIntent);

  }

总结

至此完成了基于android系统提供的分享方式上的扩展改造,自定义分享列表数据展示 自定义点击后的分享形式等等都可以实现。。其实此功能中Intent.createChooser所做工作还是蛮多的,有兴趣童鞋可以再去扒下起源码,看具体实现和到底做了哪些工作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android分享功能  # android系统分享功能  # android  # 自带分享功能  # Android调用系统自带的分享功能实例代码  # Android 复制文本内容到系统剪贴板的最简单实例(分享)  # Android编程实现调用系统分享功能示例  # Android应用中使用及实现系统“分享”接口实例  # 详解Android系统中跨应用数据分享功能的实现  # android教程之把自己的应用加入到系统分享中  # 自定义  # 第一个  # 可以看出  # 跳转  # 完成了  # 几个  # 来了  # 干净利索  # 放在  # 就能  # 列表中  # 找不到  # 这是一个  # 给人  # 采用了  # 有兴趣  # 可以实现  # 再去  # 所做  # 自带 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  原生JS获取元素集合的子元素宽度实例  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何在IIS7上新建站点并设置安全权限?  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  网站制作价目表怎么做,珍爱网婚介费用多少?  如何彻底删除建站之星生成的Banner?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在Ubuntu系统下快速搭建WordPress个人网站?  长沙企业网站制作哪家好,长沙水业集团官方网站?  JavaScript常见的五种数组去重的方式  Java垃圾回收器的方法和原理总结  EditPlus中的正则表达式 实战(2)  如何快速查询域名建站关键信息?  详解MySQL数据库的安装与密码配置  如何在搬瓦工VPS快速搭建网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何与Inertia.js和Vue/React构建现代单页应用  海南网站制作公司有哪些,海口网是哪家的?  如何实现javascript表单验证_正则表达式有哪些实用技巧  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel怎么实现验证码(Captcha)功能  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何在Tomcat中配置并部署网站项目?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何在腾讯云服务器快速搭建个人网站?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  Laravel怎么在Controller之外的地方验证数据  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  微信小程序 五星评分(包括半颗星评分)实例代码  如何用PHP快速搭建CMS系统?  Laravel观察者模式如何使用_Laravel Model Observer配置  如何用y主机助手快速搭建网站?  详解jQuery中基本的动画方法  Laravel API资源类怎么用_Laravel API Resource数据转换  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何获取免费开源的自助建站系统源码?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  如何实现建站之星域名转发设置?  如何快速完成中国万网建站详细流程?  香港服务器部署网站为何提示未备案?  利用 Google AI 进行 YouTube 视频 SEO 描述优化