安卓的Shortcut(快捷方式)功能是Android7.1的时候新增的一个快捷方式组件,其主要目的在于用户可以自定义一些常用的功能,以快捷方式的形式存在,帮忙用户快速启动常用的界面。
这里模仿微信的shortcuts功能
创建方式:
静态创建:此种创建方式是会直接打包到apk中,只要用户安装完应用便会存在快捷方式入口。可是这种创建方式会导致如果要更新快捷方式的时候都必须重新发布APP。
动态创建:在APP运行时,通过安卓提供的ShortcutManager API进行动态注册。此种创建方式可以通过用户的操作动态的新建,更新,删除对应的快捷方式。
静态注册:
属于定义于android sdk 中attrs,这些属性没有提示,需要自己手输。
<declare-styleable name="Shortcut">
<attr name="shortcutId" format="string" />
<attr name="enabled" />
<attr name="icon" />
<attr name="shortcutShortLabel" format="reference" />
<attr name="shortcutLongLabel" format="reference" />
<attr name="shortcutDisabledMessage" format="reference" />
<attr name="splashScreenTheme" format="reference"/>
</declare-styleable>
shortcutId:唯一标识,更新删除快捷方式都是需求这个标识;
shortcutShortLabel:快捷方式的短标题;
shortcutLongLabel:快捷方式的长标题;
shortcutDisableMessage:如果快捷方式被禁用,点击按键时会弹出此提示;
enabled:快捷方式是否被禁用;
icon:配置快捷方式的图标;
action:intent跳转的action,一般使用上图的配置;
targetPackage:跳转界面的包名(要是项目的包名路径);
targetClass:跳转界面的完整路径;
name:固定配置,android.shortcut.conversation;
1.在res/xml下创建shortcut.xml
<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:icon="@drawable/ic_qr_code"
android:shortcutId="menuOne"
android:shortcutShortLabel="@string/my_qr_code"
android:shortcutLongLabel="@string/my_qr_code"
android:shortcutDisabledMessage="@string/my_qr_code">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.localapps"
android:targetClass="com.example.localapps.EnterActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:enabled="true"
android:icon="@drawable/ic_qr_code"
android:shortcutId="menuTwo"
android:shortcutShortLabel="@string/pay"
android:shortcutLongLabel="@string/pay"
android:shortcutDisabledMessage="@string/pay">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.localapps"
android:targetClass="com.example.localapps.EnterActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
<shortcut
android:enabled="true"
android:icon="@drawable/ic_qr_code"
android:shortcutId="menuThree"
android:shortcutShortLabel="@string/scan"
android:shortcutLongLabel="@string/scan"
android:shortcutDisabledMessage="@string/scan">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.localapps"
android:targetClass="com.example.localapps.EnterActivity" />
<categories android:name="android.shortcut.conversation"/>
</shortcut>
</shortcuts>
2.在启动页下引用shortcut.xml:
<activity
android:name=".MainActivity"
android:exported="true">
<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/shortcut" />
</activity>
注:
这里shortcutId需要唯一;
lable需要使用引入string资源,否则会报错;
能配置shortcuts的activity必须要有action是android.intent.action.MAIN和category是android.intent.category.LAUNCHER!,需要配置固定的 <categories android:name="android.shortcut.conversation"/>,否则功能不会生效;
然后再配置点击跳转页面。
动态注册:
private fun addShortCuts() {
//判断sdk版本,高于7.1添加shortcut才生效
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
return
}
val intent = Intent(this, EnterActivity::class.java).apply {
action = "android.intent.action.VIEW"
}
val shortCutOne = ShortcutInfo.Builder(this, "menuOne")
.setShortLabel(getString(R.string.my_qr_code))
.setLongLabel(getString(R.string.my_qr_code))
.setIcon(Icon.createWithResource(this, R.drawable.ic_qr_code))
.setIntent(intent)
.build()
val shortCutTwo = ShortcutInfo.Builder(this, "menuTwo")
.setShortLabel(getString(R.string.pay))
.setLongLabel(getString(R.string.pay))
.setIcon(Icon.createWithResource(this, R.drawable.ic_qr_code))
.setIntent(intent)
.build()
val systemService = getSystemService(ShortcutManager::class.java)
systemService.dynamicShortcuts = listOf(shortCutOne, shortCutTwo)
}
同时实现功能,添加了2个快捷菜单:
这个功能看起来还是比较高大上,但实现起来挺简单的。好了,打完收工。
网友评论