ShortCut是Android7.1推出的一个新功能,一般点击app的图标会打开一个app,这个新功能是你长按app图标的时候,弹出一个快捷的操作的选择框,以快速使用app的功能(不是其他的app)。
1.Static Shortcut 像在xml里面注册广播一样,在manfiest中注册Shortcuts。
1.1在xml目录下新建一个Shortcuts文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?xml version="1.0" encoding="utf-8"?> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <shortcut android:enabled="true" android:shortcutDisabledMessage="@string/short_setting_label_disabled" android:shortcutId="com.main" android:shortcutLongLabel="@string/short_setting_label_long" android:shortcutShortLabel="@string/short_setting_label"> android:icon="@drawable/compose_icon" <intent android:action="android.intent.action.VIEW" android:targetClass="better.shortcut.SettingActivity" android:targetPackage="better.shortcut"> </intent> <categories android:name="android.shortcut.conversation"> </categories> </shortcut> <!--在label直接输入文字是编译不过的--> </shortcuts>
shortcutId
:唯一的idshortcutLongLabel
:长描述,优先显示shortcutShortLabel
:短描述shortcutDisabledMessage
:shortcut不可用时展示的文字icon
:图标enabled
:设置是否可用
1.2找启动页面 找到在被android.intent.action.MAIN和android.intent.category.LAUNCHER所标记Activity,也就是启动页面。
1.3添加Shortcut 1 2 3 4 5 6 7 8 9 10 11 12 13 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package ="com.example.myapplication" > <application> <activity android:name="Main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> </activity> </application> </manifest>
2.Dynamic Shortcut 在代码中动态注册Shortcuts。主要是通过ShortManager 来实现。
新增。setDynamicShortcuts 和addDynamicShortcuts()
更新。updateShortcuts()
删除。 removeDynamicShortcuts() 和removeAllDynamicShortcuts()。
1 2 3 4 5 6 7 8 9 10 11 12 Intent intent = new Intent(this, MainActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(EXTRA_01, "test01的数据"); ShortcutInfo info = new ShortcutInfo.Builder(this, "com.test.01") .setShortLabel("test01") .setLongLabel("test01点击") .setDisabledMessage("test01不能用") .setIntent(intent) .build(); list.add(info); manager.addDynamicShortcuts(list);
通常在添加之前要判断一下当前应用支持几个Shortcut。getMaxShortcutCountPerActivity() 然后在添加。 注意targetSdkVersion 不能小于25。
3.Pinned Shortcut 在API 26 之前加上权限com.android.launcher.permission.INSTALL_SHORTCUT
后可以这样创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 private void createShortcutBeforeO(String iconText, Object icon, boolean duplicate,Intent iExtraIntent) { Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, iconText); if (icon instanceof Integer) { shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(mContext, (int) icon)); } else if (icon instanceof Bitmap) { shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON, (Bitmap) icon); } shortcut.putExtra("duplicate", duplicate); if (iExtraIntent != null) { shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,iExtraIntent); } mContext.sendBroadcast(shortcut); }
INSTALL_SHORTCUT 和UNINSTALL_SHORTCUT 从26起就不支持了
In Android O (API level 26) and higher, the INSTALL_SHORTCUT broadcast no longer has any effect on your app because it’s a private, implicit broadcast.Instead, you should create an app shortcut by using the requestPinShortcut() method from the ShortcutManager class
需要使用ShortcutManager
来创建快捷键,官方最佳实践App Shortcuts 。创建桌面的Widget也是要用新的方式来创建Build an App Widget
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @TargetApi(Build.VERSION_CODES.O) private void createShortcutAfterO(String iconText, Object icon, Intent iExtraIntent) { if (null == iExtraIntent) { return; } ShortcutManager manager = (ShortcutManager) LudashiApplication.getInstance().getSystemService(Context.SHORTCUT_SERVICE); if (!manager.isRequestPinShortcutSupported()) { return; } if (TextUtils.isEmpty(iExtraIntent.getAction())) { iExtraIntent.setAction(Intent.ACTION_VIEW); } ShortcutInfo.Builder builder = new ShortcutInfo.Builder(LudashiApplication.getInstance(), iconText) .setShortLabel(iconText) .setIntent(iExtraIntent); if (icon instanceof Integer) { builder.setIcon(Icon.createWithResource(LudashiApplication.getInstance(), (int) icon)); } else if (icon instanceof Bitmap) { builder.setIcon(Icon.createWithBitmap((Bitmap) icon)); } ShortcutInfo info = builder.build(); PendingIntent shortcutCallbackIntent = PendingIntent.getBroadcast(LudashiApplication.getInstance(), 0, new Intent(LudashiApplication.getInstance(), ShortcutInOReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); manager.requestPinShortcut(info, shortcutCallbackIntent.getIntentSender()); }
注意:
官方例子android-AppShortcuts 动态添加网址快捷键,动态创建快捷键addDynamicShortcuts(List)
的不一定会成功,在我的华为AUM-AL20上手机上不行,后来发现别个是创建Dynamic快捷键的。
requestPinShortcut()
系统的授权界面会有延时,Oppo R15。
ShortcutManager.createShortcutResultIntent()
也是可以用来创建PendingIntent的intent参数,这个方法文档上说用来自定义UI的。
Thanks
code