前言:最近做一个在桌面添加快捷方式的功能,用普通常规的添加快捷方式大多数手机都创建不出来, 尤其是像小米这种只有一层的桌面,因此采取了apk式快捷方式,顾名思义就是在桌面安装一个apk来做为快捷方式, 当点击快捷方式(apk)的时候直接打开主应用的相应界面。
1、方式一,用Intent来启动主应用对应界面,设置包名以及要打开的界面的全路径,还要在配置文件中设置此界面exported=true:
Intent intent = new Intent();
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
startActivity(intent);
通过这种方式打开应用经测试在大多数手机上没问题,但是在三星手机上点击快捷方式启动应用后,再点返回键退出应用,这时候应用会自动重启,结束不掉。
2、方式二, 用scheme打开
可以在你想要打开的应用的Activity中加scheme和host,scheme和host都可以自己取值,当然host不是必须要的,但scheme是必须要的,指定好了以后,就有了这么一个路径:scheme://host?key1=参数1&key2=参数2 ,我们就可以通过这个路径来启动应用了,一般只启动LauncherActivity, 然后通过LauncherActivity往其他页面中转。
那么我们的快捷方式的MainActivity就可以这么写了:
if (!PackageUtils.isInstall(context, "packageName")) { // 判断是否安装主应用, 如果没安装快捷方式会进入主页,提示用户下载 return; } Intent it = new Intent(Intent.ACTION_VIEW, Uri.parse("warehouse://?where_shotcut=" + BuildConfig.ShortCutName)); context.startActivity(it); ((Activity) context).finish(); // 跳转过去后立刻自杀, 让网仓3号起来
上面代码的含义是:首先判断是否安装了主应用, 如果没安装则进入快捷方式的主页,快捷方式的主页是一个下载链接,提示用户下载主应用, 如果安装了则会走到下面三句代码打开主应用的目标界面, 注意我在代码中没有使用host,通过:"scheme://?key=参数" 这种形式来打开主应用。
3、用webview打开应用
在上面第二点中讲到,设置scheme和host后会产生一个链接:scheme://host?key1=参数1&key2=参数2
这时候我们在快捷方式主页可以放一个webview, 直接用webview来打开应用:
webview.loadUrl("scheme://host?key1=参数1&key2=参数2");
经测试第二点和第三点完美打开应用,都不会有问题,我还反编译了支付宝“一步支付宝付款”的apk式快捷方式,它使用的就是第三种方式。
4、打开主应用以后,那么主应用如何解析scheme并且如何拿到参数中的数据呢:
Intent intent = getIntent();
String scheme = intent.getScheme();
Uri uri = intent.getData();
System.out.println("scheme:"+scheme);
if (uri != null) {
String host = uri.getHost();
String dataString = intent.getDataString();
//获得参数值
String key1 = uri.getQueryParameter("key1");
String key2 = uri.getQueryParameter("key2");
}