昨天介紹了 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