1. 總覽
在先前的程式碼研究室中,您使用靜態快速鍵在範例應用程式中實作常用的內建意圖 (BII)。Android 開發人員會使用應用程式動作,將應用程式功能擴充至 Google 助理。
靜態捷徑會與應用程式一併發布,只能透過發布新版應用程式來更新。如要為應用程式中的動態元素 (例如使用者產生的內容) 啟用語音功能,請使用動態捷徑。使用者執行相關動作後,應用程式會推送動態捷徑,例如在工作追蹤應用程式中建立新記事。透過應用程式動作,您可以將這些捷徑繫結至 BII,透過語音啟用捷徑,讓使用者說出「Ok Google,在範例應用程式中開啟我的購物清單」等指令,即可透過 Google 助理存取內容。

圖 1. 三張漸進式畫面,顯示使用者建立的工作,以及 Google 助理啟動該工作項目的動態捷徑。
建構項目
在本程式碼研究室中,您將在待辦事項清單 Android 應用程式範例中啟用語音動態捷徑,讓使用者要求 Google 助理開啟應用程式中建立的任務清單項目。您會使用 Android 架構模式 (具體來說是 repository、service locator 和 ViewModel 模式) 完成這項作業。
必要條件
本程式碼研究室以先前的程式碼研究室中介紹的應用程式動作概念為基礎,特別是 BII 和靜態快速鍵。如果您是第一次使用應用程式動作,建議先完成該程式碼研究室,再繼續進行。
此外,請確保開發環境具有下列設定,再繼續操作:
- 已安裝 Git 的終端機,可執行 Shell 指令。
- 最新的 Android Studio 穩定版。
- 可連上網際網路的實體或虛擬 Android 裝置。
- 用 Google 帳戶登入 Android Studio、Google 應用程式和 Google 助理應用程式。
2. 瞭解運作方式
如要啟用語音存取的動態捷徑,請按照下列步驟操作:
- 將動態捷徑繫結至符合資格的 BII。
- 新增 Google 捷徑整合程式庫,讓 Google 助理擷取捷徑。
- 在使用者完成相關應用程式內工作時推送捷徑。
繫結快速鍵
如要透過 Google 助理存取動態捷徑,必須將捷徑繫結至相關 BII。觸發含有捷徑的 BII 時,Google 助理會將使用者要求中的參數與繫結捷徑中定義的關鍵字進行比對。例如:
- 與
GET_THINGBII 綁定的捷徑可讓使用者直接透過 Google 助理要求特定的應用程式內容。* 「Ok Google,在範例應用程式上開啟我的購物清單。」 - 如果捷徑繫結至
START_EXERCISEBII,使用者就能查看運動訓練。* 「Ok Google,請範例應用程式開始進行我的日常運動。」
如需 BII 的完整分類清單,請參閱內建意圖參考資料。
提供捷徑給 Google 助理
將捷徑繫結至 BII 後,下一步是在專案中加入 Google 捷徑整合程式庫,讓 Google 助理擷取這些捷徑。有了這個程式庫,Google 助理就能瞭解應用程式推送的每個快速鍵,使用者只要在 Google 助理中說出快速鍵的觸發字詞,即可啟動這些快速鍵。
3. 準備開發環境
本程式碼研究室會使用為 Android 建構的待辦事項清單範例應用程式。使用者可以透過這個應用程式將項目新增至清單、依類別搜尋工作清單項目,以及依完成狀態篩選工作。請完成本節內容,下載並準備範例應用程式。
下載基礎檔案
執行下列指令,複製範例應用程式的 GitHub 存放區:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git
複製存放區後,請按照下列步驟在 Android Studio 中開啟:
- 在「Welcome to Android Studio」對話方塊中,按一下「Import project」。
- 選取複製存放區的資料夾。
或者,您也可以複製範例應用程式的 GitHub 存放區 codelab-complete 分支,查看代表完成程式碼研究室的應用程式版本:
git clone https://github.com/actions-on-google/app-actions-dynamic-shortcuts.git --branch codelab-complete
更新 Android 應用程式 ID
更新應用程式的應用程式 ID,即可在測試裝置上清楚識別應用程式,並避免在將應用程式上傳至 Play 管理中心時發生「套件名稱重複」錯誤。如要更新應用程式 ID,請開啟 app/build.gradle:
android {
...
defaultConfig {
applicationId "com.MYUNIQUENAME.android.fitactions"
...
}
}
將 applicationId 欄位中的「MYUNIQUENAME」替換為專屬名稱。
新增 Shortcuts API 依附元件
將下列 Jetpack 程式庫新增至 app/build.gradle 資源檔案:
app/build.gradle
dependencies {
...
// Shortcuts library
implementation "androidx.core:core:1.6.0"
implementation 'androidx.core:core-google-shortcuts:1.0.1'
...
}
在裝置上測試應用程式
在對應用程式進行更多變更之前,建議您先瞭解範例應用程式的功能。如要在模擬器上執行應用程式,請按照下列步驟操作:
- 在 Android Studio 中,依序選取「Run」>「Run app」,或按一下工具列中的「Run」圖示
。 - 在「Select Deployment Target」對話方塊中,選取裝置並按一下「OK」。建議使用 Android 10 (API 級別 30) 以上的 OS 版本,不過應用程式動作最多可以支援到 Android 5 (API 級別 21) 的裝置。
- 長按主畫面按鈕設定 Google 助理,並確認是否可以正常運作。如果尚未登入,請先在裝置上登入 Google 助理。
如要進一步瞭解 Android 虛擬裝置,請參閱「建立及管理虛擬裝置」。
簡單瀏覽應用程式,瞭解其功能。輕觸加號圖示即可建立新工作項目,右上方的選單項目則可供您依完成狀態搜尋及篩選工作項目。
4. 建立捷徑存放區類別
範例應用程式中的多個類別會呼叫 ShortcutManagerCompat API,以便推送及管理動態捷徑。為減少程式碼冗餘,您將實作存放區,讓專案類別輕鬆管理動態捷徑。
存放區設計模式提供簡潔的 API,用於管理捷徑。存放區的優點是,基礎 API 的詳細資料會統一抽象化,隱藏在最小 API 後方。請按照下列步驟實作存放區:
- 建立
ShortcutsRepository類別,將ShortcutManagerCompatAPI 抽象化。 - 在應用程式的服務定位器中新增
ShortcutsRepository方法。 - 在主要應用程式中註冊
ShortcutRepository服務。
建立存放區
在 com.example.android.architecture.blueprints.todoapp.data.source 套件中,建立名為 ShortcutsRepository 的新 Kotlin 類別。您可以在 app/src/main/java 資料夾中找到這個套件。您將使用這個類別實作介面,提供涵蓋本程式碼研究室用途的一組最少方法。

圖 2. Android Studio 的「Project Files」視窗,顯示 ShortcutsRepository 類別的位置。
將下列程式碼貼入新類別:
package com.example.android.architecture.blueprints.todoapp.data.source
import android.content.Context
import android.content.Intent
import androidx.annotation.WorkerThread
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import com.example.android.architecture.blueprints.todoapp.data.Task
import com.example.android.architecture.blueprints.todoapp.tasks.TasksActivity
private const val GET_THING_KEY = "q"
/**
* ShortcutsRepository provides an interface for managing dynamic shortcuts.
*/
class ShortcutsRepository(val context: Context) {
private val appContext = context.applicationContext
/**
* Pushes a dynamic shortcut. The task ID is used as the shortcut ID.
* The task's title and description are used as shortcut's short and long labels.
* The resulting shortcut corresponds to the GET_THING capability with task's
* title used as BII's "name" argument.
*
* @param task Task object for which to create a shortcut.
*/
@WorkerThread
fun pushShortcut(task: Task) {
// TODO
}
private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
//...
}
/**
* Updates a dynamic shortcut for the provided task. If the shortcut
* associated with this task doesn't exist, this method throws an error.
* This operation may take a few seconds to complete.
*
* @param tasks list of tasks to update.
*/
@WorkerThread
fun updateShortcuts(tasks: List<Task>) {
//...
}
/**
* Removes shortcuts if IDs are known.
*
* @param ids list of shortcut IDs
*/
@WorkerThread
fun removeShortcutsById(ids: List<String>) {
//...
}
/**
* Removes shortcuts associated with the tasks.
*
* @param tasks list of tasks to remove.
*/
@WorkerThread
fun removeShortcuts(tasks: List<Task>) {
//...
}
}
接著,更新 pushShortcut 方法來呼叫 ShortcutManagerCompat API。使用下列程式碼更新 ShortcutsRepository 類別:
ShortcutsRepository.kt
/**
* Pushes a dynamic shortcut for the task. The task's ID is used as a shortcut
* ID. The task's title and description are used as shortcut's short and long
* labels. The created shortcut corresponds to GET_THING capability with task's
* title used as BII's "name" argument.
*
* @param task Task object for which to create a shortcut.
*/
@WorkerThread
fun pushShortcut(task: Task) {
ShortcutManagerCompat.pushDynamicShortcut(appContext, createShortcutCompat(task))
}
在上述程式碼範例中,我們將 appContext 傳遞至 API。這是保存 Application Context 的類別屬性。請務必使用應用程式內容 (而非活動內容),以免發生記憶體洩漏問題,因為內容的保留時間可能比主機活動生命週期更長。
此外,API 也要求我們傳遞 Task 物件的 ShortcutInfoCompat 物件。在上述程式碼範例中,我們呼叫 createShortcutCompat 私有方法來達成此目的,稍後會更新這個方法,以建立及傳回 ShortcutInfoCompat 物件。如要達成這個目標,請使用下列程式碼更新 createShortcutCompat 存根:
ShortcutsRepository.kt
private fun createShortcutCompat(task: Task): ShortcutInfoCompat {
val intent = Intent(appContext, TasksActivity::class.java)
intent.action = Intent.ACTION_VIEW
// Filtering is set based on currentTitle.
intent.putExtra(GET_THING_KEY, task.title)
// A unique ID is required to avoid overwriting an existing shortcut.
return ShortcutInfoCompat.Builder(appContext, task.id)
.setShortLabel(task.title)
.setLongLabel(task.title)
// Call addCapabilityBinding() to link this shortcut to a BII. Enables user to invoke a shortcut using its title in Assistant.
.addCapabilityBinding(
"actions.intent.GET_THING", "thing.name", listOf(task.title))
.setIntent(intent)
.setLongLived(false)
.build()
}
這個類別中的其餘函式存根會處理動態快速鍵的更新和刪除作業。使用下列程式碼更新函式,即可啟用這些函式:
ShortcutsRepository.kt
/**
* Updates a Dynamic Shortcut for the task. If the shortcut associated with this task
* doesn't exist, throws an error. This operation may take a few seconds to complete.
*
* @param tasks list of tasks to update.
*/
@WorkerThread
fun updateShortcuts(tasks: List<Task>) {
val scs = tasks.map { createShortcutCompat(it) }
ShortcutManagerCompat.updateShortcuts(appContext, scs)
}
/**
* Removes shortcuts if IDs are known.
* @param ids list of shortcut IDs
*/
@WorkerThread
fun removeShortcutsById(ids: List<String>) {
ShortcutManagerCompat.removeDynamicShortcuts(appContext, ids)
}
/**
* Removes shortcuts associated with the tasks.
*
* @param tasks list of tasks to remove.
*/
@WorkerThread
fun removeShortcuts(tasks: List<Task>) {
ShortcutManagerCompat.removeDynamicShortcuts (appContext,
tasks.map { it.id })
}
在服務定位器中新增類別
建立 ShortcutsRepository 類別後,下一步是讓應用程式的其餘部分使用這個類別的例項化物件。這個應用程式會實作服務定位器模式,管理類別依附元件。在 Android Studio 中,依序前往「Navigate」>「Class」,然後輸入「ServiceLocator」,即可使用類別瀏覽器開啟服務定位器類別。按一下產生的 Kotlin 檔案,在 IDE 中開啟。
在 ServiceLocator.kt 頂端貼上下列程式碼,匯入 ShortcutsRepository 和 SuppressLint 套件:
ServiceLocator.kt
package com.example.android.architecture.blueprints.todoapp
// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
import android.annotation.SuppressLint
將下列程式碼貼到 ServiceLocator.kt 的主體中,新增 ShortcutRepository 服務成員和方法:
ServiceLocator.kt
object ServiceLocator {
// ...
// Only the code immediately below this comment needs to be copied and pasted
// into the body of ServiceLocator.kt:
@SuppressLint("StaticFieldLeak")
@Volatile
var shortcutsRepository: ShortcutsRepository? = null
private fun createShortcutsRepository(context: Context): ShortcutsRepository {
val newRepo = ShortcutsRepository(context.applicationContext)
shortcutsRepository = newRepo
return newRepo
}
fun provideShortcutsRepository(context: Context): ShortcutsRepository {
synchronized(this) {
return shortcutsRepository ?: shortcutsRepository ?: createShortcutsRepository(context)
}
}
}
註冊快速鍵服務
最後一步是向應用程式註冊新的 ShortcutsRepository 服務。在 Android Studio 中開啟 TodoApplication.kt,然後在檔案頂端附近複製下列程式碼:
TodoApplication.kt
package com.example.android.architecture.blueprints.todoapp
/// ... Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
接著,在類別主體中加入下列程式碼,註冊服務:
TodoApplication.kt
//...
class TodoApplication : Application() {
//...
val shortcutsRepository: ShortcutsRepository
get() = ServiceLocator.provideShortcutsRepository(this)
//...
}
建構應用程式,並確認應用程式仍可執行。
5. 推送新捷徑
建立捷徑服務後,即可開始推送捷徑。由於使用者會在應用程式中產生內容 (工作項目),並希望日後能返回查看,因此每當使用者建立新工作時,我們會推送繫結至 GET_THING BII 的動態捷徑,讓使用者透過語音存取這些內容。這樣一來,使用者只要說出「Ok Google,在 SampleApp 開啟我的購物清單」等指令來觸發 BII,Google 助理就能直接啟動使用者要求的待辦事項。
如要在範例應用程式中啟用這項功能,請完成下列步驟:
- 將
ShortcutsRepository服務匯入AddEditTaskViewModel類別,負責管理工作清單物件。 - 在使用者建立新工作時推送動態捷徑。
匯入 ShortcutsRepository
我們首先需要讓 ShortcutsRepository 服務可供 AddEditTaskViewModel 使用。如要完成這項操作,請將服務匯入 ViewModelFactory,也就是應用程式用於例項化 ViewModel 物件 (包括 AddEditTaskViewModel) 的工廠類別。
在 Android Studio 中依序前往「Navigate」>「Class」,然後輸入「ViewModelFactory」,即可開啟類別瀏覽器。按一下產生的 Kotlin 檔案,在 IDE 中開啟。
在 ViewModelFactory.kt 頂端貼上下列程式碼,匯入 ShortcutsRepository 和 SuppressLint 套件:
ViewModelFactory.kt
package com.example.android.architecture.blueprints.todoapp
// ...Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
接著,將 ViewModelFactory 的主體替換為下列程式碼:
ViewModelFactory.kt
/**
* Factory for all ViewModels.
*/
@Suppress("UNCHECKED_CAST")
class ViewModelFactory constructor(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = with(modelClass) {
when {
isAssignableFrom(StatisticsViewModel::class.java) ->
StatisticsViewModel(tasksRepository)
isAssignableFrom(TaskDetailViewModel::class.java) ->
TaskDetailViewModel(tasksRepository)
isAssignableFrom(AddEditTaskViewModel::class.java) ->
AddEditTaskViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(TasksViewModel::class.java) ->
TasksViewModel(tasksRepository, handle)
else ->
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
}
} as T
}
向上移動一層,完成 ViewModelFactory 變更,然後將 ShortcutsRepository 傳遞至工廠的建構函式。依序前往「Navigate」>「File」,然後輸入「FragmentExt.kt」,即可開啟 Android Studio 的檔案瀏覽器。按一下 util 套件中的 Kotlin 檔案,在 IDE 中開啟。
將 FragmentExt.kt 的主體替換為下列程式碼:
fun Fragment.getViewModelFactory(): ViewModelFactory {
val taskRepository = (requireContext().applicationContext as TodoApplication).taskRepository
val shortcutsRepository = (requireContext().applicationContext as TodoApplication).shortcutsRepository
return ViewModelFactory(taskRepository, shortcutsRepository, this)
}
推送捷徑
範例應用程式的 ViewModel 類別提供 ShortcutsRepository 抽象化類別,因此您可以更新 AddEditTaskViewModel (負責建立記事的 ViewModel 類別),在使用者每次建立新記事時推送動態捷徑。
在 Android Studio 中開啟類別瀏覽器,然後輸入「AddEditTaskViewModel」。按一下產生的 Kotlin 檔案,在 IDE 中開啟。
首先,使用下列匯入陳述式,將 ShortcutsRepository 套件新增至這個類別:
package com.example.android.architecture.blueprints.todoapp.addedittask
//Other import statements
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
接著,使用下列程式碼更新類別建構函式,新增 shortcutsRepository 類別屬性:
AddEditTaskViewModel.kt
//...
/**
* ViewModel for the Add/Edit screen.
*/
class AddEditTaskViewModel(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository
) : ViewModel() {
//...
新增 ShortcutsRepository 類別後,請建立新的函式 pushShortcut() 來呼叫這個類別。將下列私有函式貼到 AddEditTaskViewModel 的主體中:
AddEditTaskViewModel.kt
//...
private fun pushShortcut(newTask: Task) = viewModelScope.launch {
shortcutsRepository.pushShortcut(newTask)
}
最後,每當建立工作時,請推送新的動態捷徑。將 saveTask() 函式的內容替換為下列程式碼:
AddEditTaskViewModel.kt
fun saveTask() {
val currentTitle = title.value
val currentDescription = description.value
if (currentTitle == null || currentDescription == null) {
_snackbarText.value = Event(R.string.empty_task_message)
return
}
if (Task(currentTitle, currentDescription).isEmpty) {
_snackbarText.value = Event(R.string.empty_task_message)
return
}
val currentTaskId = taskId
if (isNewTask || currentTaskId == null) {
val task = Task(currentTitle, currentDescription)
createTask(task)
pushShortcut(task)
} else {
val task = Task(currentTitle, currentDescription, taskCompleted, currentTaskId)
updateTask(task)
}
}
測試程式碼
我們終於可以測試程式碼了!在這個步驟中,您將推送支援語音的動態捷徑,並使用 Google 助理應用程式檢查。
製作試聽內容
使用 Google 助理外掛程式建立預覽後,動態捷徑就會顯示在測試裝置的 Google 助理中。
安裝測試外掛程式
如果沒有 Google 助理外掛程式,請在 Android Studio 中按照下列步驟安裝:
- 依序前往「File」>「Settings」(在 macOS 上則為「Android Studio」>「Preferences」)。
- 在「Plugins」部分,前往「Marketplace」並搜尋「Google 助理」。
- 安裝工具,然後重新啟動 Android Studio。
建立預覽畫面
如要在 Android Studio 中建立預覽,請按照下列步驟操作:
- 依序點選「Tools」>「Google Assistant」>「App Actions Test Tool」。
- 在「應用程式名稱」方塊中,定義名稱,例如「待辦事項清單」。
- 按一下「Create Preview」。如果系統要求,請詳閱並接受應用程式動作政策和服務條款。

圖 3. 應用程式動作測試工具的預覽建立窗格。
測試期間,您推送至 Google 助理的動態捷徑會依您為預覽提供的「應用程式名稱」顯示在 Google 助理中。
推送及檢查捷徑
在測試裝置上重新啟動範例應用程式,然後執行下列步驟:
- 建立新工作,標題為「Start codelab」
- 開啟 Google 助理應用程式,然後說出或輸入「我的快速鍵」。
- 輕觸「探索」分頁標籤。您應該會看到範例捷徑。
- 輕觸捷徑即可叫用。應用程式啟動後,篩選方塊中會預先填入快速鍵名稱,方便您尋找所需的工作項目。
6. (選用) 更新及刪除捷徑
除了在執行階段推送新的動態快速指令,應用程式也可以更新這些指令,反映使用者內容和偏好的目前狀態。每當使用者修改目的地項目時,最好更新現有捷徑,例如在範例應用程式中重新命名工作。此外,如果目的地資源遭到移除,您也應刪除對應的捷徑,避免向使用者顯示無效的捷徑。
更新快速鍵
修改 AddEditTaskViewModel,在使用者變更工作項目的詳細資料時更新動態捷徑。首先,使用下列程式碼更新類別主體,新增使用存放區類別的更新函式:
AddEditTaskViewModel.kt
private fun updateShortcut(newTask: Task) = viewModelScope.launch {
shortcutsRepository.updateShortcuts(listOf(newTask))
}
接著,修改 saveTask() 函式,在更新現有工作時呼叫新方法。
AddEditTaskViewModel.kt
// Called when clicking on fab.
fun saveTask() {
// ...
// Note: the shortcuts are created/updated in a worker thread.
if (isNewTask || currentTaskId == null) {
//...
} else {
//...
updateShortcut(task)
}
}
如要測試程式碼,請重新啟動應用程式,然後按照下列步驟操作:
- 將現有工作項目的標題重新命名為「完成程式碼研究室」。
- 說出「Ok Google,我的快速鍵」開啟 Google 助理。
- 輕觸「探索」分頁標籤。您應該會看到測試捷徑的更新簡短標籤。
移除快速鍵
只要使用者刪除工作,就應移除我們的範例應用程式捷徑。在範例應用程式中,工作刪除邏輯位於 TaskDetailViewModel 類別。更新這個類別之前,我們需要再次更新 ViewModelFactory,將 shortcutsRepository 傳遞至 TaskDetailViewModel。
開啟 ViewModelFactory,並將建構函式方法的內容替換為下列程式碼:
//...
class ViewModelFactory constructor(
private val tasksRepository: TasksRepository,
private val shortcutsRepository: ShortcutsRepository,
owner: SavedStateRegistryOwner,
defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(
key: String,
modelClass: Class<T>,
handle: SavedStateHandle
) = with(modelClass) {
when {
isAssignableFrom(StatisticsViewModel::class.java) ->
StatisticsViewModel(tasksRepository)
isAssignableFrom(TaskDetailViewModel::class.java) ->
TaskDetailViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(AddEditTaskViewModel::class.java) ->
AddEditTaskViewModel(tasksRepository, shortcutsRepository)
isAssignableFrom(TasksViewModel::class.java) ->
TasksViewModel(tasksRepository, handle)
else ->
throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}")
}
} as T
}
接著開啟 TaskDetailViewModel。匯入 ShortcutsRepository 模組,並使用下列程式碼為該模組宣告例項變數:
TaskDetailViewModel.kt
package com.example.android.architecture.blueprints.todoapp.taskdetail
...
import com.example.android.architecture.blueprints.todoapp.data.source.ShortcutsRepository
/**
* ViewModel for the Details screen.
*/
class TaskDetailViewModel(
//...
private val shortcutsRepository: ShortcutsRepository
) : ViewModel() {
...
}
最後,修改 deleteTask() 函式,在刪除具有對應 taskId 的工作時,呼叫 shortcutsRepository 移除捷徑 (根據 ID):
TaskDetailViewModel.kt
fun deleteTask() = viewModelScope.launch {
_taskId.value?.let {
//...
shortcutsRepository.removeShortcutsById(listOf(it))
}
}
如要測試程式碼,請重新啟動應用程式,然後按照下列步驟操作:
- 刪除測試工作。
- 將現有工作項目的標題重新命名為「完成程式碼研究室」。
- 說出「Ok Google,我的快速鍵」開啟 Google 助理。
- 輕觸「探索」分頁標籤。確認測試捷徑不再顯示。
7. 後續步驟
恭喜!有了您,範例應用程式的使用者就能輕鬆返回自己建立的記事,只要向 Google 助理下達「Ok Google,在範例應用程式中開啟我的購物清單」等指令即可。捷徑可讓使用者輕鬆重播應用程式中常用的動作,進而提高參與度。
涵蓋內容
在本程式碼研究室中,您已瞭解如何:
- 找出在應用程式中推送動態捷徑的應用實例。
- 使用存放區、依附元件插入和服務定位器設計模式,降低程式碼複雜度。
- 將支援語音的動態捷徑推送至使用者原創應用程式內容。
- 更新及移除現有捷徑。
後續步驟
現在,您可以嘗試進一步調整工作清單應用程式。如要參閱完成的專案,請前往 GitHub 上的存放區 –codelab-complete 分支版本。
以下提供一些建議,協助您進一步瞭解如何使用應用程式動作擴充這個應用程式:
- 請參閱待辦事項範例 (搭配 Google Analytics for Firebase),瞭解如何追蹤應用程式動作的成效。
- 如要進一步瞭解如何將應用程式擴充至 Google 助理,請參閱應用程式動作內建意圖參考資料。
如要繼續使用 Google 助理動作,請參閱下列資源:
- actions.google.com:Actions on Google 的官方說明文件網站。
- 應用程式動作範例索引:範例應用程式和程式碼,可探索應用程式動作功能。
- Actions on Google GitHub 存放區:範例程式碼和程式庫。
- r/GoogleAssistantDev:專為使用 Google 助理開設的官方 Reddit 社群。
歡迎在 Twitter 追蹤 @ActionsOnGoogle,隨時掌握最新公告,並使用 #appActions 分享您建構的內容!
意見調查
最後,請填寫這份問卷,提供您對本程式碼研究室的意見。