一、 摘要

以Android O为分界,介绍两种动态创建快捷方式的途径:广播和ShortcutManager。


二、 Android O以前

在Android O(8.0)以前,动态创建快捷方式是通过发送广播实现的:

// 由该action可知,我们的创建快捷方式广播会由launcher,也就是系统桌面来接收public static final String ACTION_INSTALL_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";public void createShortcutBelowO(Context ctx, String name, Bitmap icon) {    Intent shortcutIntent = new Intent(ACTION_INSTALL_SHORTCUT);    // 快捷方式的名字    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);    // 快捷方式的bitmap尽可能小,因为广播内容超过2MB会抛出异常    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON, icon);    // 设置是否允许重复创建快捷方式,该选项非必填,默认是允许    shortcutIntent.putExtra("duplicate", false);    // 快捷方式执行的intent,比如启动应用在AndroidManifest中配置的入口Activity    Intent launchIntent = new Intent();    launchIntent.setClass(ctx, "com.zengyu.shortcutdemo");    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launchIntent);    ctx.sendBroadcast(shortcutIntent);}

三、 Android O以后

Android O(8.0)新增了一个叫ShortcutManager的类:

/** * The ShortcutManager manages an app's shortcuts. Shortcuts provide users * with quick access to activities other than an app's main activity in the currently-active * launcher.  For example, * an email app may publish the "compose new email" action, which will directly open the * compose activity.  The {@link ShortcutInfo} class contains information about each of the * shortcuts themselves. */

ShortcutManager管理应用的快捷方式。快捷方式为用户提供了一个访问应用的快速渠道。ShortcutInfo类包含了每个快捷方式的信息。

在ShortcutManager的API文档中,其实已经有详细的静态创建和动态创建的介绍,以及创建的具体步骤,但在此我还是以一个简单的例子,直观地展示使用ShortcutManager动态创建:

public void createShortcutAboveO(Context ctx, String name, Bitmap icon) {    ShortcutManager shortcutManager = (ShortcutManager) ctx.getSystemService(Context.SHORTCUT_SERVICE);    /**     * 判断是否支持该方式动态创建     */    if (shortcutManager.isRequestPinShortcutSupported()) {        // 快捷方式执行的intent,比如启动应用在AndroidManifest中配置的入口Activity        Intent launchIntent = new Intent();        launchIntent.setClass(ctx, "com.zengyu.shortcutdemo");        ShortcutInfo.Builder builder = new ShortcutInfo.Builder(context, pkg)                    .setShortLabel(name)                    .setIcon(Icon.createWithBitmap(icon))                    .setIntent(launchIntent);        /**         * 第二个参数为弹出创建快捷方式确认框时的回调PendingIntent,此例不关注该回调,因此为null,         * 如果需要监听该回调,需要自定义一个BroadcastReceiver,可参考参考文献中的例子         */        shortcutManager.requestPinShortcut(builder.build(), null);    }}

其中isRequestPinShortcutSupported方法:

/** * Return {@code TRUE} if the app is running on a device whose default launcher supports * {@link #requestPinShortcut(ShortcutInfo, IntentSender)}. * * 

The return value may change in subsequent calls if the user changes the default launcher * app. * *

Note: See also the support library counterpart * {@link android.support.v4.content.pm.ShortcutManagerCompat#isRequestPinShortcutSupported( * Context)}, which supports Android versions lower than {@link VERSION_CODES#O} using the * legacy private intent {@code com.android.launcher.action.INSTALL_SHORTCUT}. * * @see #requestPinShortcut(ShortcutInfo, IntentSender) */public boolean isRequestPinShortcutSupported() { try { return mService.isRequestPinItemSupported(injectMyUserId(), LauncherApps.PinItemRequest.REQUEST_TYPE_SHORTCUT); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); }}

判断设备是否支持ShortcutManager的这种方式动态创建快捷方式,如果Android版本低于Android O,使用“com.android.launcher.action.INSTALL_SHORTCUT”这个intent,即我们在上一节中使用的action。因此,如果这个方法返回false,我们应该仍使用广播的方式来动态创建。


四、 参考文献

  • Android 8.0 快捷方式Shortcut

更多相关文章

  1. 更改android AVD模拟器创建路径位置
  2. 【Android】创建Popwindow弹出菜单
  3. Android仿微信发送语音消息动态提示,支持上滑取消发送
  4. android修改图片(修改图片大小,图片旋转,图片平移)
  5. Android(安卓)Apk自动更新service(直接拿来用)
  6. android 文件读写
  7. Android创建本地文件夹、创建本地文件以及访问本地文件
  8. Android开发者指南(3) —— Other Tools
  9. Android(安卓)学习笔记 BroadcastReceiver广播...

随机推荐

  1. Android中DownLoadManager的使用
  2. 学习笔记----Android的对话框
  3. tabactivty中加入地图
  4. Android 分割线
  5. BlackBerry SIP VOIP softPhone, open so
  6. 分享Android入门学习资料
  7. 【转】Android Intent Action 大全
  8. android之延时操作
  9. 一步步探索学习Android(安卓)Touch事件分
  10. Android开发笔记(一百二十三)下拉刷新布局S