簡體   English   中英

帶有功能參數的應用程序操作“打開應用程序”有時會忽略參數

[英]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()沒有被調用時),它似乎保留了“功能”的值(並且,我假設,整個舊意圖)。

因此問題是:

  • 如何在所有情況下正確捕獲正確的 Intent 和參數 - 無論是在應用程序的“冷啟動”還是返回到已經運行的應用程序時?

我們應該在生命周期的不同部分做某事嗎? onCreate()以外的地方工作?

首次使用“使用 AppName 顯示我完成的任務”調用時的部分日志。 注意onCreateViewonCreate以及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 顯示我的打開任務”重新調用應用程序時的日志部分。 請注意, onCreateonCreateView沒有被記錄,並且即使這應該是基於調用功能參數的“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM