[英]App Action "open app" with feature parameter sometimes ignores parameter
我一直在通過代碼實驗室“使用應用操作將 Android 應用擴展到 Google 助理(第 2 級)” ,並且正在執行“添加打開應用功能 BII 功能”步驟我已將相關配置添加到快捷方式.xml文件(見下文)。 以下內容已使用真實設備(運行 Android 11 且內存為 3664M 的摩托羅拉 Moto G Power)和虛擬設備(運行 Android 12 (API 31) 的 Pixel 5,同時使用 1536MB 和 4096MB 內存進行測試)進行了測試
我已經確認這適用於 App Action 測試工具。
如果我隨后從助手調用它,它將啟動應用程序並根據該功能顯示正確的信息。
但是,如果我隨后返回 Android 主屏幕並再次從 Assistant 調用它,嘗試不同的功能,它將調出應用程序,但通常保持與以前相同的信息。 如果我確保關閉應用程序(通過在應用程序列表中將其滑動),它將始終有效,但如果我只是返回主屏幕,有時它可以正常工作,有時它不能正常工作。
憑直覺工作,並且對 Android 的掌握很薄弱,我懷疑對TasksActivity.onCreate()
的調用沒有被調用,因為應用程序沒有被銷毀。 添加此方法的日志記錄以及onStart()
、 onResume()
、 onPause()
和onStop()
似乎證實了這一點。 據我所知,它在onCreate()
中構建包含TasksFragment
的布局。
我可以確認只有在 TasksActivity.onCreate( TasksFragment.onCreateView()
被調用時才調用TasksActivity.onCreate()
。 似乎使用activity?.intent?.extras
來獲取功能參數。
在一些比我更好的 Android 開發者的朋友的建議下,他們建議我添加一個TasksFragment.onResume()
來捕捉視圖何時重新顯示並再次使用activity?.intent?.extras
來設置該功能范圍。 雖然我可以驗證當我從主屏幕重新調用它時它正在被調用(並且當onCreate()
/ onCreateView()
沒有被調用時),它似乎保留了“功能”的舊值(並且,我假設,整個舊意圖)。
因此問題是:
我們應該在生命周期的不同部分做某事嗎? 在onCreate()
以外的地方工作?
首次使用“使用 AppName 顯示我完成的任務”調用時的部分日志。 注意onCreateView
和onCreate
以及feature=completed_tasks
。 :
2022-07-12 20:07:55.912 18392-18392/com.addventure.appactions.common D/TasksFragment: >> onCreateView
2022-07-12 20:07:55.912 18392-18392/com.addventure.appactions.common D/TasksFragment: [feature=completed_tasks]
2022-07-12 20:07:55.912 18392-18392/com.addventure.appactions.common D/TasksFragment: [com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID=2132082905]
2022-07-12 20:07:55.912 18392-18392/com.addventure.appactions.common D/TasksFragment: [extra_accl_intent=true]
2022-07-12 20:07:55.987 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onCreate
2022-07-12 20:07:55.988 18392-18392/com.addventure.appactions.common D/TasksActivity: [feature=completed_tasks]
2022-07-12 20:07:55.988 18392-18392/com.addventure.appactions.common D/TasksActivity: [com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID=2132082905]
2022-07-12 20:07:55.988 18392-18392/com.addventure.appactions.common D/TasksActivity: [extra_accl_intent=true]
2022-07-12 20:07:56.012 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onStart
2022-07-12 20:07:56.018 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onResume
2022-07-12 20:07:56.020 18392-18392/com.addventure.appactions.common D/TasksFragment: >> onResume
2022-07-12 20:07:56.020 18392-18392/com.addventure.appactions.common D/TasksFragment: [feature=completed_tasks]
2022-07-12 20:07:56.020 18392-18392/com.addventure.appactions.common D/TasksFragment: [com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID=2132082905]
2022-07-12 20:07:56.020 18392-18392/com.addventure.appactions.common D/TasksFragment: [extra_accl_intent=true]
返回主屏幕時的部分日志:
2022-07-12 20:09:20.073 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onPause
2022-07-12 20:09:20.124 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onStop
然后使用“使用 AppName 顯示我的打開任務”重新調用應用程序時的日志部分。 請注意, onCreate
和onCreateView
沒有被記錄,並且即使這應該是基於調用功能參數的“active_tasks”, feature=completed_tasks
:
2022-07-12 20:09:22.130 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onStart
2022-07-12 20:09:22.132 18392-18392/com.addventure.appactions.common D/TasksActivity: >> onResume
2022-07-12 20:09:22.132 18392-18392/com.addventure.appactions.common D/TasksFragment: >> onResume
2022-07-12 20:09:22.133 18392-18392/com.addventure.appactions.common D/TasksFragment: [feature=completed_tasks]
2022-07-12 20:09:22.133 18392-18392/com.addventure.appactions.common D/TasksFragment: [com.google.android.apps.gsa.shared.util.starter.IntentStarter.ERROR_TOAST_ID=2132082905]
2022-07-12 20:09:22.133 18392-18392/com.addventure.appactions.common D/TasksFragment: [extra_accl_intent=true]
shortcuts.xml 文件的相關部分:
<!-- OPEN APP FEATURE with inline inventory
https://developers.google.com/assistant/app/reference/built-in-intents/common/open-app-feature
Be sure to replace all occurrences of PUT_YOUR_APPLICATION_ID_HERE with the
application ID you specified in app/build.gradle.
-->
<!-- Add Get Thing BII shortcuts -->
<shortcut
android:shortcutId="active_tasks"
android:shortcutShortLabel="@string/label_active"
android:enabled="false">
<capability-binding
android:key="actions.intent.OPEN_APP_FEATURE">
<parameter-binding
android:key="feature"
android:value="@array/active_tasks_synonyms" />
</capability-binding>
</shortcut>
<shortcut
android:shortcutId="completed_tasks"
android:shortcutShortLabel="@string/label_completed"
android:enabled="false">
<capability-binding
android:key="actions.intent.OPEN_APP_FEATURE">
<parameter-binding
android:key="feature"
android:value="@array/completed_tasks_synonyms" />
</capability-binding>
</shortcut>
<!-- Add Open App Feature BII capability -->
<capability android:name="actions.intent.OPEN_APP_FEATURE">
<intent
android:action="android.intent.action.VIEW"
android:targetPackage="com.addventure.appactions.common"
android:targetClass="com.example.android.architecture.blueprints.todoapp.tasks.TasksActivity">
<parameter
android:name="feature"
android:key="feature"/>
</intent>
</capability>
TasksActivity.kt 的相關部分:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.tasks_act)
setupNavigationDrawer()
setSupportActionBar(findViewById(R.id.toolbar))
// Logging for troubleshooting purposes
log(TAG, "onCreate", intent)
val navController: NavController = findNavController(R.id.nav_host_fragment)
appBarConfiguration =
AppBarConfiguration.Builder(R.id.tasks_fragment_dest, R.id.statistics_fragment_dest)
.setOpenableLayout(drawerLayout)
.build()
setupActionBarWithNavController(navController, appBarConfiguration)
findViewById<NavigationView>(R.id.nav_view)
.setupWithNavController(navController)
}
override fun onStart() {
super.onStart()
log(TAG, "onStart")
}
override fun onResume() {
super.onResume()
log( TAG, "onResume")
}
override fun onPause() {
super.onPause()
log( TAG, "onPause" )
}
override fun onStop() {
super.onStop()
log( TAG, "onStop" )
}
override fun onDestroy(){
super.onDestroy()
log( TAG, "onDestroy" )
}
companion object {
fun log( tag: String, f: String ){
log( tag, f, null )
}
fun log(tag: String, f: String, intent: Intent?) {
Log.d(tag, ">> $f")
val bundle: Bundle = intent?.extras ?: return
bundle.keySet().forEach { key ->
Log.d(tag, "[$key=${bundle.get(key)}]");
}
}
}
TasksFragment.kt 的相關部分:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewDataBinding = TasksFragBinding.inflate(inflater, container, false).apply {
viewmodel = viewModel
}
setHasOptionsMenu(true)
// Set a listener on task button
setupFab()
setFiltering( "onCreateView" )
return viewDataBinding.root
}
override fun onResume() {
super.onResume()
setFiltering( "onResume" )
}
private fun setFiltering(f: String){
TasksActivity.log( TAG, f, activity?.intent )
viewModel.setFiltering(TasksFilterType.find(activity?.intent?.extras?.getString(OPEN_APP_FEATURE)))
viewModel.setFiltering(activity?.intent?.extras?.getString(GET_THING))
}
所以要檢查的一件事是Android Manifest中的Tasks 和 Back Stack以及各種設置
android:launchMode
確保您收到最新的 Intent。
我還會檢查Activity.onNewIntent()的結果,以查看傳遞給應用程序的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.