昨天介紹了 Shortcut 的用法,今天就來串接 Shortcut 的功能,加入一個 Play song 的選項,點擊後開啟頁面並開始播歌。
設定相關字串,並設定開啟的 Package 名稱和目標的 Activity,並加入自訂的 categories 名稱,等下在 activity 內就可以接收對應的 intent 。
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
<shortcut
android:enabled="true"
android:icon="@drawable/ic_default_cover_icon"
android:shortcutDisabledMessage="@string/shortcut_play_error"
android:shortcutId="compose"
android:shortcutLongLabel="@string/shortcut_play_long_label"
android:shortcutShortLabel="@string/shortcut_play_short_label">
<intent
android:action="android.intent.action.VIEW"
android:targetClass="com.fantasyfang.fancy.MainActivity"
android:targetPackage="com.fantasyfang.fancy">
<categories android:name="android.shortcut.play.song" />
</intent>
</shortcut>
</shortcuts>
在 MainActivity 內收 intent 判斷是否為設定的名稱,確認後,找到對應的 fragment 頁面,並且呼叫播歌的功能
override fun onStart() {
super.onStart()
if (intent?.categories?.contains("android.shortcut.play.song") == true) {
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val songListFragment =
navHostFragment.childFragmentManager.fragments[0] as? SongListFragment
songListFragment?.playSongDirectly()
}
}
在 SongListFragment 內就可以執行播歌功能了,這邊簡化寫法,目標是等拿到歌的清單後,再開始播放,就先播清單內的第一首歌。
fun playSongDirectly() {
Handler().postDelayed({
clickSong(songListViewModel.songs.value?.getOrNull(0) ?: return@postDelayed)
}, 2000)
}
一般來說比較好的體驗會是,紀錄上次使用者最後播的歌,再從上次播的歌開始播,之後看有沒有機會來實作這塊 XD
成果圖:
程式碼在這,分支名稱(day24_shortcuts): Fancy/day24_shortcuts