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

Android通过queryIntentActivities自定义发送功能

Android通过queryIntentActivities自定义发送功能一、目标1.实现效果2.下载地址二、功能设计三、准备工作1.查询列表2.处理排序3.启动指定的Activi

Android通过queryIntentActivities自定义发送功能

    • 一、目标
      • 1. 实现效果
      • 2. 下载地址
    • 二、功能设计
    • 三、准备工作
      • 1. 查询列表
      • 2. 处理排序
      • 3. 启动指定的Activity
    • 四、组合起来
      • 1. ResolveProvider
      • 2. ResolveViewHolder
      • 3. ResolveEntity
      • 4. ResolveComparator
    • 五、Final


一、目标

自定义发送功能,使列表按指定顺序排列。

1. 实现效果

在这里插入图片描述

第二栏显示的为支持发送的第三方应用列表。

2. 下载地址

神马笔记最新版本:【神马笔记 版本1.2.0.apk】

二、功能设计

通过Context#startActivity()可以直接调用手机上的第三方应用。

但是无法控制第三方应用的显示顺序,比例“发送给朋友”、“发送到朋友圈”、“微博”是我比较经常使用的应用。通过直接调用startActivity()无法保证显示在前3个的位置。

因此,我们需要自定义发送的功能。

三、准备工作


1. 查询列表

PackageManager提供了3个方法用于查询Intent相应的Activity。

public abstract List<ResolveInfo> queryIntentActivities(Intent intent,&#64;ResolveInfoFlags int flags);public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,&#64;ResolveInfoFlags int flags, &#64;UserIdInt int userId);public abstract List<ResolveInfo> queryIntentActivityOptions(&#64;Nullable ComponentName caller,&#64;Nullable Intent[] specifics, Intent intent, &#64;ResolveInfoFlags int flags);

调用第一个方法可以获取到ResolveInfo列表。

2. 处理排序

排序分成2个部分。

  1. 指定排序顺序
  2. 按名称排序

通过配置文件&#xff0c;指定优先显示的Activity及先后顺序。不在配置文件中的Activity则按名称进行排序。

以下是神马笔记使用的配置文件&#xff0c;按照个人使用频率进行了排序。

{"list":[{"id": "com.tencent.mm.ui.tools.ShareImgUI","name": "发送给朋友"},{"id": "com.tencent.mm.ui.tools.ShareToTimeLineUI","name": "发送到朋友圈"},{"id": "com.sina.weibo.composerinde.ComposerDispatchActivity","name": "微博"},{"id": "com.weico.international.activity.compose.SeaComposeActivity","name": "微博国际版"},{"id": "com.tencent.mobileqq.activity.JumpActivity","name": "发送给好友"},{"id": "com.alibaba.android.rimet.biz.BokuiActivity","name": "钉钉"},{"id": "com.tencent.mm.ui.tools.AddFavoriteUI","name": "添加到微信收藏"},{"id": "com.tencent.mobileqq.activity.qfileJumpActivity","name": "发送到我的电脑"},{"id": "cooperation.qlink.QlinkShareJumpActivity","name": "面对面快传&#xff08;免流量&#xff09;"},{"id": "com.sina.weibo.weiyou.share.WeiyouShareDispatcher","name": "私信"},{"id": "cooperation.qqfav.widget.QfavJumpActivity","name": "保存到QQ收藏"}]
}

3. 启动指定的Activity

通过设置Intent#setComponent()可以指定启动的Activity。

String pkg &#61; resolveInfo.activityInfo.packageName;
String cls &#61; resolveInfo.activityInfo.name;
ComponentName cn &#61; new ComponentName(pkg, cls);
intent.setComponent(cn);

四、组合起来


1. ResolveProvider

为RecyclerView提供数据。

private static class ResolveProvider implements ClazzAdapterProvider<ResolveEntity> {List<ResolveEntity> list;ResolveProvider(Activity context, Intent[] intents) {{this.list &#61; new ArrayList<>();}{PackageManager pm &#61; context.getPackageManager();for (int i &#61; 0; i < intents.length; i&#43;&#43;) {Intent intent &#61; intents[i];List<ResolveInfo> list &#61; pm.queryIntentActivities(intent, 0);for (ResolveInfo info : list) {this.add(context, info);}}}}void add(Activity context, ResolveInfo resolveInfo) {if (indexOf(resolveInfo.activityInfo.name) >&#61; 0) {return;}list.add(new ResolveEntity(context, resolveInfo));}int indexOf(String id) {ResolveEntity entity &#61; list.stream().filter(e -> e.getId().equals(id)).findAny().orElse(null);if (entity &#61;&#61; null) {return -1;}return list.indexOf(entity);}void sort(Comparator<ResolveEntity> comparator) {list.sort(comparator);}&#64;Overridepublic ResolveEntity get(int position) {return list.get(position);}&#64;Overridepublic int size() {return list.size();}
}

需要注意的是这里使用Intent[]数组&#xff0c;而不是单个Intent

Intent[] intents &#61; new Intent[] {new Intent().setAction(Intent.ACTION_SEND).setType("*/*"),new Intent().setAction(Intent.ACTION_SEND).setType("image/*")
};

原先使用的第一个Intent&#xff0c;setType("*/*")&#xff0c;这种方式无法获取到微信7.0.0发送到朋友圈功能&#xff0c;必须通过setType("image/*")方式才能实现。

因此&#xff0c;使用Intent[]数组方式最为保险。

2. ResolveViewHolder

RecyclerView的ViewHolder实现。

private class ResolveViewHolder extends BridgeViewHolder<ResolveEntity> {static final int LAYOUT_RES_ID &#61; R.layout.layout_action_list_item;ImageView iconView;TextView nameView;&#64;Keeppublic ResolveViewHolder(View itemView) {super(itemView);}&#64;Overridepublic int getLayoutResourceId() {return LAYOUT_RES_ID;}&#64;Overridepublic void onViewCreated(&#64;NonNull View view) {view.setOnClickListener(this::onItemClick);this.iconView &#61; view.findViewById(R.id.iv_icon);iconView.setClipToOutline(true);this.nameView &#61; view.findViewById(R.id.tv_name);}&#64;Overridepublic void onBind(ResolveEntity item, int position) {iconView.setImageDrawable(item.getIcon());nameView.setText(item.getTitle());}void onItemClick(View view) {dismiss();if (onResolveItemClickListener !&#61; null) {onResolveItemClickListener.onResolveItemClick(getItem().item);}}
}

3. ResolveEntity

包装了一下ResolveInfo&#xff0c;方便调用。

private static class ResolveEntity {ResolveInfo item;Activity context;ResolveEntity(Activity context, ResolveInfo item) {this.context &#61; context;this.item &#61; item;}String getId() {return item.activityInfo.name;}Drawable getIcon() {return item.loadIcon(context.getPackageManager());}CharSequence getTitle() {return item.loadLabel(context.getPackageManager());}}

4. ResolveComparator

ResolveEntity的比较器&#xff0c;实现排序。

通过传入的ID列表实现排序。

private static class ResolveComparator implements Comparator<ResolveEntity> {List<String> array;ResolveComparator(List<String> array) {this.array &#61; array;}int indexOf(String id) {int index &#61; -1;for (int i &#61; 0; i < array.size(); i&#43;&#43;) {if (array.get(i).equalsIgnoreCase(id)) {index &#61; i;break;}}return index;}int getPriority(String id) {int index &#61; indexOf(id);if (index < 0) {return index;}return array.size() - index;}&#64;Overridepublic int compare(ResolveEntity o1, ResolveEntity o2) {int p1 &#61; getPriority(o1.getId());int p2 &#61; getPriority(o2.getId());return (p2 - p1);}
}

五、Final

除了更新到微信7.0.0版本时&#xff0c;发现无法获取到发送到朋友圈外&#xff0c;一切工作如预期展开。

最后的最后&#xff0c;还是存在的一个问题。

同一篇笔记&#xff0c;生成了同样的图片&#xff0c;同样通过微信发送。

发送方式结果
发送给朋友清晰
发送到朋友圈模糊&#xff0c;图片被压缩
添加到微信收藏清晰

发送到朋友圈的图片变得模糊&#xff0c;被压缩过&#xff0c;另外2种方式是清晰的。

&#xff5e;奈何&#xff5e;奈何&#xff5e;


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
CK92_474
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有