相比ios系统,Android的可定制性还是蛮高的,例如通知栏,ios的通知栏也是最近的几个版本中才加了一些折叠的效果,一键清除等功能,但是通知栏的高度定制在Android系统中早已经司空见惯了,今天的主题不是通知栏,而是app的快捷方式,ios和android都可以创建快捷方式,但这里要向ios学习下了,在ios中默认为每一个app添加了一个 分享 的快捷方式,尤其是在3D Touch的加持下,快捷方式的可玩性更高
之所以叫快捷方式,是因为用户可以在不打开app的情况下,长按app启动图标,快速打开指定的页面,非常直接的一种方式,节省了一些不必要的操作,在Android中创建快捷方式有三种方式 静态快捷方式,动态快捷方式,固定快捷方式
不幸的是,这几种方式都需要在Android api 25 + ,只能呵呵了,不过还是值得操作一通的,毕竟功能还是很实用的,注意,虽然可以添加多个快捷方式,但是静态+动态快捷方式最多只能在app启动图标上面显示四个快捷方式
静态快捷方式,需要在清单文件中声明,注意,是在程序的入口Main里设置
<activity
android:name=".activity.MainActivity"
android:configChanges="orientation|screenSize"
android:launchMode="singleTop"
android:theme="@style/SplashTheme">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!--创建静态快捷方式-->
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
</activity>
另外需要创建一个新的资源文件:
res/xml-v25/shortcuts.xml
。这个是要显示的快捷方式布局
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:icon="@drawable/ic_vector_basic_info_24dp"
android:shortcutId="个人中心"
android:shortcutShortLabel="@string/basic_info">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.sxt.chat.activity.BasicInfoActivity"
android:targetPackage="com.sxt.chat" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
</shortcuts>
shortcuts节点下可以包含多个shortcut ,但是最多显示4个,shortcut中必要的字段有两个shortcutId 和 shortcutShortLabel
enabled:属性可以控制该快捷方式是否显示 。
icon:属性是该快捷方式的drawable资源
shortcutId:属性是该快捷方式的id,只能是字符串,不能是字符串的资源id。
shortcutShortLabel:属性是该快捷方式的描述信息,只能是字符串的资源id。
shortcutLongLabel:属性是描述快捷方式扩展信息,同样也只能是字符串的资源id。如果有足够的空间,启动器会显示此值而不是shortcutShortLabel
。如果可能,将快捷方式的“长描述”的长度限制为25个字符。
然后就是配置Intent信息,我们这里是要打开某一个activity,所以配置为具体的类名和包名
运行app看下效果
静态快捷方式是只会创建一次,由于是固定在xml文件中,所以无法动态更新,只能通过版本更新apk的方式实现shortcut的更新
动态快捷方式相对来说比较灵活,可以随时更新之前创建好的shortcut
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "动态创建的快捷方式")
.setShortLabel("动态创建的shortcut")
.setLongLabel("动态创建的shortcut-打开网页")
.setIcon(Icon.createWithResource(this, R.drawable.ic_ar_photo_main_blue_24dp))
.setIntent(new Intent(Intent.ACTION_VIEW,
Uri.parse("https://blog.csdn.net/sxt_zls")))
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(shortcut));
}
ShortcutInfo可以通过ShortcutInfo.Builder通过链式设置不同的属性值,与静态创建的方式属性一致,这里的Intent可以设置为任意你想要的意图,我这里设置的打开一个网页,最后shortcutManager.setDynamicShortcuts实现快捷方式的创建,后续可以调用updateShortcuts方法来修改快捷方式
可以看到,长按app启动图标,出现了我们刚刚设置的快捷方式,点击后打开了指定的网页
相比静态和动态创建的方式来说,固定快捷方式比较麻烦,因为通过固定的方式创建的shortcut会固定在手机主页上面,所以需要用户授权才能创建,当然,用户可以选择拒绝,拒绝后将无法创建该快捷方式,看下交互效果会更容易理解
下图是通过动态的方式打开activity,然后申请添加快捷方式,选择自动添加或者拖动图标到主页即可添加成功
最后看下代码的实现,与动态注册类似,只不过需要设置创建之后的回调
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
ShortcutManager shortcutManager = getSystemService(ShortcutManager.class);
if (shortcutManager.isRequestPinShortcutSupported()) {
Intent intent=new Intent(Intent.ACTION_VIEW,null, this, VR360Activity.class);
ShortcutInfo pinShortcutInfo =
new ShortcutInfo.Builder(this, "固定的快捷方式")
.setShortLabel("固定的快捷方式")
.setIcon(Icon.createWithResource(this, R.drawable.ic_ar_photo_main_blue_24dp))
.setIntent(intent)
.build();
Intent pinnedShortcutCallbackIntent =
shortcutManager.createShortcutResultIntent(pinShortcutInfo);
//配置意图,以便应用程序的广播接收器回调成功的广播。
PendingIntent successCallback = PendingIntent.getBroadcast(this, 0,
pinnedShortcutCallbackIntent, 0);
shortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
}
}
需要注意的是,并不是所有8.0以上的设备都支持固定模式的快捷方式,这里需要通过isRequestPinShortcutSupported()方法来进行判断目标设备是否支持该功能