我\xc2\xb4已经开始测试我的应用程序在Android 12上的问题,并且收到了一些关于为主屏幕小部件设置的待处理意图的可变性标志的警告。这些可变性标志现在从 SDK 31 开始是强制性的。在 31 之前,此代码可以工作,但会出现 lint 警告:
\nval myIntent = Intent(context, MainActivity::class.java)\nval myPendingIntent = PendingIntent.getActivity(context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT )\nmyRemoteViews.setOnClickPendingIntent(R.id.widget_button, myPendingIntent)\nRun Code Online (Sandbox Code Playgroud)\n在 Android 12 上,需要添加第二个标志,如下所示:
\nval myIntent = Intent(context, MainActivity::class.java)\nval myPendingIntent = PendingIntent.getActivity(context, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)\nmyRemoteViews.setOnClickPendingIntent(R.id.widget_button, myPendingIntent)\nRun Code Online (Sandbox Code Playgroud)\n到目前为止,一切都很好。但是,对于某些小部件操作,不仅需要导航到应用程序,还需要导航到特定片段并添加片段参数。对于这些情况,我\xc2\xb4一直在使用 NavDeepLinkBuilder 创建pendingIntent\n https://developer.android.google.cn/reference/kotlin/androidx/navigation/NavDeepLinkBuilder
\nval myPendingIntent = NavDeepLinkBuilder(context)\n .setGraph(R.navigation.nav_main)\n .setDestination(R.id.myFragment)\n .setArguments(\n myFragment.bundle(myArgs)\n )\n .createPendingIntent()\nmyRemoteViews.setOnClickPendingIntent(R.id.widget_button, myPendingIntent)\nRun Code Online (Sandbox Code Playgroud)\n在您将构建目标设置为 sdk 31 并在 Android 12(模拟器)上构建之前,此方法非常有效。在这种情况下,它会在使用以下堆栈跟踪创建小部件时崩溃:
\n 2021-11-03 17:41:27.792 20309-20309/com.package.debug E/AndroidRuntime: FATAL EXCEPTION: main\n Process: com.package.debug, PID: 20309\n java.lang.RuntimeException: …Run Code Online (Sandbox Code Playgroud) android android-pendingintent android-architecture-navigation android-deep-link android-12