Android通过queryIntentActivities自定义发送功能
一、目标
自定义发送功能,使列表按指定顺序排列。
1. 实现效果
第二栏显示的为支持发送的第三方应用列表。
2. 下载地址
神马笔记最新版本:【神马笔记 版本1.2.0.apk】
二、功能设计
通过Context#startActivity()可以直接调用手机上的第三方应用。
但是无法控制第三方应用的显示顺序,比例“发送给朋友”、“发送到朋友圈”、“微博”是我比较经常使用的应用。通过直接调用startActivity()无法保证显示在前3个的位置。
因此,我们需要自定义发送的功能。
三、准备工作
1. 查询列表
PackageManager
提供了3个方法用于查询Intent相应的Activity。
public abstract List<ResolveInfo> queryIntentActivities(Intent intent,
@ResolveInfoFlags int flags);
public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
@ResolveInfoFlags int flags, @UserIdInt int userId);
public abstract List<ResolveInfo> queryIntentActivityOptions(@Nullable ComponentName caller,
@Nullable Intent[] specifics, Intent intent, @ResolveInfoFlags int flags);
调用第一个方法可以获取到ResolveInfo列表。
2. 处理排序
排序分成2个部分。
- 指定排序顺序
- 按名称排序
通过配置文件,指定优先显示的Activity及先后顺序。不在配置文件中的Activity则按名称进行排序。
以下是神马笔记使用的配置文件,按照个人使用频率进行了排序。
{
"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.QlinkShareJump