【Android】判断快捷方式是否存在的原理——优化网上通用的(速度提升10倍)

1原理:

这个是在2.3的时候无意发现的,当我照着网上的例子查询快捷方式是否创建的时候突然应用程序挂了,说是缺少权限。

com.android.launcher.permission.READ_SETTINGS或者com.android.launcher.permission.WRITE_SETTINGS

然后我就添加了权限,虽然是可以判断了,但是小米,HTC等手机都不能正常使用,这时候突然发现了网上了一段代码,才明白了网友们的想法,现在就来简单分析下,并做出优化。

String url = "content://" + authority + "/favorites?notify=true";

其实判断快捷方式也就是根据这个ContentProvider来判断。但是我们并不知道这个authority,那么怎么知道呢?查询,根据PackageManager得到ProviderInfo,然后判断ProviderInfo的读写权限是否包含com.android.launcher.permission.READ_SETTINGS或者com.android.launcher.permission.WRITE_SETTINGS。

至此原理我们已经明白了。

2解决方案:

1这是网上通用的写法:

	public static boolean hasShortcut(Context context, String appName) {
		String readSettingsPermission = "com.android.launcher.permission.READ_SETTINGS";
		String authority = getAuthorityFromPermission2(context, readSettingsPermission);
		String url = "content://" + authority + "/favorites?notify=true";
		final Uri CONTENT_URI = Uri.parse(url);
		Cursor c = context.getContentResolver().query(CONTENT_URI, null, " title= ? ", new String[] { appName }, null);
		if (c != null && c.moveToNext()) {
			return true;
		}
		return false;
	}

	@SuppressLint("NewApi")
	private static String getAuthorityFromPermission2(Context context, String permission) {
		List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);
		if (packs != null) {
			for (PackageInfo pack : packs) {
				ProviderInfo[] providers = pack.providers;
				if (providers != null) {
					for (ProviderInfo provider : providers) {
						if (permission.equals(provider.readPermission))
							return provider.authority;
						if (permission.equals(provider.writePermission))
							return provider.authority;
					}
				}
			}
		}
		return null;
	}

2这是我自己想的方法,虽然思路走到一起了,但是多少有点出入:

	public static boolean hasShortcut(Context context, String appName) {
		String readSettingsPermission = "com.android.launcher.permission.READ_SETTINGS";
		String authority = getAuthorityFromPermission1(context, readSettingsPermission);
		String url = "content://" + authority + "/favorites?notify=true";
		final Uri CONTENT_URI = Uri.parse(url);
		Cursor c = context.getContentResolver().query(CONTENT_URI, null, " title= ? ", new String[] { appName }, null);
		if (c != null && c.moveToNext()) {
			return true;
		}
		return false;
	}

	private static String getAuthorityFromPermission1(Context context, String permission) {
		ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		List<RunningAppProcessInfo> appProcessInfos = am.getRunningAppProcesses();
		for (int i = 0; i < appProcessInfos.size(); i++) {
			RunningAppProcessInfo appInfo = appProcessInfos.get(i);
			List<ProviderInfo> info = context.getPackageManager().queryContentProviders(appInfo.processName, appInfo.uid, PackageManager.GET_PROVIDERS);
			if (info != null) {
				for (int j = 0; j < info.size(); j++) {
					ProviderInfo provider = info.get(j);
					if (permission.equals(provider.readPermission)) {
						return provider.authority;
					}
					if (permission.equals(provider.writePermission)) {
						return provider.authority;
					}
				}
			}
		}
		return null;
	}
时间: 2024-12-31 03:48:07

【Android】判断快捷方式是否存在的原理——优化网上通用的(速度提升10倍)的相关文章

云 MongoDB 优化让 LBS 服务性能提升十倍

欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.MongoDB对LBS查询的支持较为友好,也是各大LBS服务商的首选数据库.腾讯云MongoDB团队在运营中发现,原生MongoDB在LBS服务场景下有较大的性能瓶颈,经腾讯云团队专业的定位分析与优化后,云MongoDB在LBS服务的综合性能上,有10倍以上的提升.腾讯云MongoDB提供的优异综合性

Elasticsearch聚合优化 | 聚合速度提升5倍

https://blog.csdn.net/laoyang360/article/details/79253294 1.聚合为什么慢?大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 es 大量内存,从而导致 OOM 的情况发生. 实践应用发现,以下情况都会比较慢: 1)待聚合文档数比较多(千万.亿.十亿甚至更多): 2)聚合条件比较复杂(多重条件聚合): 3)全量聚合(翻页的场景用). 2.聚合优化方案探讨优化方案一:默认深度

如何让你的ASO优化效果提升10倍?

现在APP推广成本在不断上升,如何利用有限的预算达到最大的推广效果是我们必须要考虑的事情.ASO优化作为APP推广中常用的方法之一,可以使得App Store榜单排名和关键词搜索排名得到显著提高,迅速获取大量自然新增的用户.由于其推广效果较好,是众多开发商最热衷的一种推广方式.但是,我们如何从ASO优化服务中获得最大化的收益呢? 了解一些基本概念 我们在做ASO优化之前,需要对ASO优化有清晰的认识,对于ASO优化的基本概念,不清楚的朋友可以看看什么是ASO优化和如何做ASO优化两篇文章,对AS

android判断和创建快捷方式(4.03测试通过)

整理了网上的创建方式的代码,对于快捷方式的判断使用系统api获取当前启动器来处理,这样系统定制过或者启动器不一样也没关系 . 一加权限和声明目标activity <!-- 创建快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.l

Android桌面快捷方式那些事与那些坑

原文来自http://blog.zanlabs.com/2015/03/14/android-shortcut-summary/ 将近二个多月没写博客了. 之前一段时间一直在搞红包助手,就没抽时间写博客,但写这个真的是很好玩.没想到居然在Android上实现模拟点击,从而实现自动抢红包,有兴趣的同学可以参考https://github.com/waylife/RedEnvelopeAssistant ,代码已经开源. 红包助手还有一些问题,但是现在基本的抢红包基本没问题了.目前正在对它进行优化以

Android添加快捷方式(Shortcut)到手机桌面

Android添加快捷方式(Short)到手机桌面 权限 要在手机桌面上添加快捷方式,首先需要在manifest中添加权限. <!-- 添加快捷方式 --> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <!-- 移除快捷方式 --> <uses-permission android:name="com.andro

Android高手进阶——Adapter深入理解与优化

Android高手进阶--Adapter深入理解与优化 通常是针对包括多个元素的View,如ListView,GridView.ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是提供每一个Item的视图桥梁.   以ListView为例.其工作原理为: ● ListView针对List中每一个item, adapter都会调用一个getView的方法获得布局视图 ●我们通常会Inflate一个新的View,填充数据并返

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

【金阳光测试】Android自动化 -- 学习历程:MonkeyRunner原理初步

章节:自动化基础篇——MonkeyRunner原理初步 网易云课堂: http://study.163.com/course/courseLearn.htm?courseId=712011#/learn/video?lessonId=877115&courseId=712011 主要讲解内容及笔记: 一.理论知识和脚本演示 最佳方式是上官网文档去查看monkeyrunner的介绍,官网上不去,就找了一个本地的android 4.2 的查看,基本内容没啥变化 First,什么是MonkeyRunn