Android7.1新特性shortcut文件之外的東西

ezbuy_Metal團隊發表於2019-01-28

app shortcut官方文件shortcut是android7.1推出的新特性,仿ios的3d touch功能,在android平臺上表現為長按彈出快捷方式,7.1系統上谷歌自家app均支援了該功能,例如系統app YouTube等。

簡介

app shortcut分為static shortcut和Dynamic short,可以類比android廣播分動態註冊靜態註冊來理解,具體看文件即可理解,因專案使用的功能靜態註冊方式可實現,這裡只談談靜態註冊

文件中沒提的坑

  • 模擬器上會出現莫名其妙的問題,建議這功能直接真機測試

  • 文件intent中有個targetPackage配置項,初一看以為是packname,實際是applicationID配置。插個知識點在eclipse專案結構時packname和applicationID是同一概念或者說二者值一致,但android studio專案結構時,二者是不同的applicationID應用程式的唯一標識而packname僅僅指專案的包名並沒有唯一性。 因此debug release包該引數需要動態配置1.在build.gradle檔案中定義一個常量,分debug和release賦不同值,再shortcuts.xml中呼叫,結果 行不通2.google到的方案https://github.com/Zellius/android-shortcut-gradle-plugin/blob/master/README.md 大概用了一個第三方庫,不在shortcuts.xml中對targetPackage直接賦值,在程式碼中實現 測試可行3.用隱試intent方案,繞過targetpackage配置, 結果行不通4.當然講debug release包分開編譯呼叫不同程式碼方式肯定是能解決這個問題的。但有點拿大炮打蚊子感覺 故放棄該方案

  • 還有個小case,快捷方式指向購物車頁面,如果在該頁面back,按照文件上寫是直接推出app,其實可以實現從back到指定頁面,類似我們app中back回的首頁,這是比較合乎常理的,實現只需在對應intent上加上back會頁面的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>
複製程式碼

小結

當然把app shortcut使用的更加人性化,還有很多小細節可以處理的更加完美,例如app執行時跟非執行時back頁面的區別處理。 快捷方式的更新處理,等等。。總之,基礎的功能實現容易,做得更好還是需要下翻功夫的

2017年3月23更新

關於targetPackage自動配置提供一個新方案,直接gradle寫個指令碼替換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)
}複製程式碼

注:本文作者在私人賬號發表過,此次是在公司賬號釋出。

來源:https://juejin.im/post/5c4e6a776fb9a049df247418

相關文章