本文已独家授权 郭霖 ( guolin_blog) 公众号发布!
申明,标题里的快捷方式不是指开发人员使用频率极高的Ctrl+C和Ctrl+V;也不是IDE里Ctrl+D、Ctrl+F等常用快捷键。这里的快捷键,是Android应用生成桌面快捷方式。
试想,有一Windows用户想进入D盘——my文件夹里面的子文件去找文件(因藏了些晦涩资源所以层级较深)。那么这位少侠更加便利省力的操作是:点击选中文件夹——右键:发送到——桌面快捷方式,即可帮他将快捷方式生成到桌面。该用户下次想使用这个文件夹,直接点击桌面上的快捷方式即可。好处在于,用户可以快速定位到某一应用具体的功能、干净利落。
当然,谷歌Android团队也考虑了这一点,给我们设计了原生API,方便我们开发人员更加便利的(Ctrl+C、V)生成桌面快捷方式。这样做的好处我想有以下几点,首先,提高了用户留存率,试想一个APP通过某种媒介生成了2个icon,这样是很容易吸引人的,因为生成桌面快捷方式的icon以及点击事件都是代码可控的,比如你的快捷方式的icon是一个萝莉或者御姐;正太或是直男?毕竟图片总有人会喜欢的嘛。其次,快捷方式的点击事件是控制的,跳转的界面控制在开发者(产品)手中等等。
言归正传,既然是生成桌面快捷方式,那么肯定需要权限,必要的权限如下:
接着,因为Android难以言表的碎片化和厂商定制,所以还需要加一些权限来增加健壮性,下面直接copy就行:
好了,权限已经添加完毕,下面就可以上代码了,首先是创建桌面快捷方式:
//创建桌面快捷方式
private void createShortCut(){
//创建Intent对象
Intent shortcutIntent = new Intent();
//设置点击快捷方式,进入指定的Activity
//注意:因为是从Lanucher中启动,所以这里用到了ComponentName
//其中new ComponentName这里的第二个参数,是Activity的全路径名,也就是包名类名要写全。
shortcutIntent.setComponent(new ComponentName(this.getPackageName(), "这里是包名.类名"));
//给Intent添加 对应的flag
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS|Intent.FLAG_ACTIVITY_NEW_TASK);
Intent resultIntent = new Intent();
// Intent.ShortcutIconResource.fromContext 这个就是设置快捷方式的图标
resultIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
Intent.ShortcutIconResource.fromContext(this,
R.drawable.yuanbao));
//启动的Intent
resultIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
//这里可以设置快捷方式的名称
resultIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "快捷名称");
//设置Action
resultIntent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
//发送广播、通知系统创建桌面快捷方式
sendBroadcast(resultIntent);
}
创建桌面快捷方式的代码,理论上就是上面这些,ComponentName这个类用的较少,简单理解ComponentName的作用是,可以启动其他应用的Activity、Service(前提是要知道包名),然后搭配Intent使用,完成跳转。关于ComponentName与Activity、Service的参考代码如下:
ComponentName componentName = new ComponentName(param1,param2);
param1:Activity、Service 所在应用的包名
//获取应用的包名可以通过 this.getPackageName(); this代表当前的Activity