app shortcut官方文檔
shortcut是android7.1推出的新特性,仿ios的3d touch功能碍扔,在android平臺(tái)上表現(xiàn)為長(zhǎng)按彈出快捷方式,7.1上谷歌自家app均實(shí)現(xiàn)了該功能凛澎,youtube也實(shí)現(xiàn)了竞漾。
簡(jiǎn)介
app shortcut分為static shortcut和Dynamic short,可以類比廣播分動(dòng)態(tài)注冊(cè)靜態(tài)注冊(cè)去理解侮繁,具體看文檔即可结窘,項(xiàng)目中用靜態(tài)注冊(cè)即可實(shí)現(xiàn),只談?wù)勳o態(tài)注冊(cè)
文檔沒提的坑
- 模擬器上會(huì)出現(xiàn)莫名其妙的問題底哗,建議這功能直接真機(jī)測(cè)試
- intent中有個(gè)targetPackage配置項(xiàng)贷屎,初一看以為是packname,實(shí)際是application配置艘虎。因此uat release包該參數(shù)需要?jiǎng)討B(tài)配置
1.類似${PCK}參數(shù)那樣動(dòng)態(tài)配置方案唉侄,結(jié)果 行不通
2.google的方案https://github.com/Zellius/android-shortcut-gradle-plugin/blob/master/README.md 測(cè)試可行
3.隱試intent方案,繞過targetpackage配置野建, 結(jié)果行不通
- 還有個(gè)小case属划,快捷方式指向購物車頁面,如果在該頁面back候生,按照文檔上寫是直接推出app同眯,其實(shí)可以實(shí)現(xiàn)從back到指定頁面,類似我們app中back回的頁唯鸭,這是比較合乎常理的须蜗,實(shí)現(xiàn)只需在對(duì)應(yīng)intent上加上back會(huì)頁面的intent。
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:shortcutId="compose"
android:enabled="true"
android:icon="@drawable/compose_icon"
android:shortcutShortLabel="@string/compose_shortcut_short_label1"
android:shortcutLongLabel="@string/compose_shortcut_long_label1"
android:shortcutDisabledMessage="@string/compose_disabled_message1">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.mainactivity" />
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.example.myapplication"
android:targetClass="com.example.myapplication.ComposeActivity" />
<categories android:name="android.shortcut.conversation" />
</shortcut>
<!-- Specify more shortcuts here. -->
</shortcuts>
小結(jié)
當(dāng)然把a(bǔ)pp shortcut處理好還有很多小細(xì)節(jié)可以需要處理的更加完美目溉,例如app運(yùn)行時(shí)跟非運(yùn)行時(shí)back頁面的區(qū)別處理明肮。 快捷方式的更新處理,等等缭付。柿估。總之陷猫,接觸的功能實(shí)現(xiàn)容易秫舌,做得更好還是需要下翻功夫
2017年3月23更新
關(guān)于targetPackage自動(dòng)配置提供一個(gè)新方案,直接gradle寫個(gè)腳本替換shortcuts.xml文件中targetPackage的值
def replaceInShortcuts(variant, fromString, toString) {
def flavor = variant.productFlavors.get(0)
def buildType = variant.buildType
def shortcutsFile = "$buildDir/intermediates/res/merged/${flavor.name}/${buildType.name}/xml/shortcuts.xml"
def file = new File(shortcutsFile);
def updatedContent = file.getText('UTF-8').replaceAll(fromString, toString)
file.write(updatedContent, 'UTF-8')
}
output.processResources.doFirst {
replaceInShortcuts(variant, '\\{PCK\\}', variant.applicationId)
}