- 您的应用立即使用该嵌套 intent 启动应用组件,例如将 intent 传递给
startActivity()
、startService()
或bindService()
。
如何检测嵌套 intent 的不安全启动
如需检查您的应用中是否会以不安全的方式启动嵌套 intent,请在配置 VmPolicy
时调用 detectUnsafeIntentLaunch()
,如以下代码段所示:
protected void onCreate() {
StrictMode.setVmPolicy(new VmPolicy.Builder()
// Other StrictMode checks that you’ve previously added.
// …
.detectUnsafeIntentLaunch()
.penaltyLog()
// Consider also adding penaltyDeath()
.build());
}
如果您的应用检测到 StrictMode
违规行为,您可能需要停止应用的执行以保护潜在的敏感信息。
注意:如果您的应用以 Android 12 为目标平台,并在其 VmPolicy
定义中使用 detectAll()
方法,系统将自动调用 detectUnsafeIntentLaunch()
方法。
如何最大限度地降低出现 StrictMode 违规行为的可能性
如果您的应用不可避免的会启动嵌套 intent
,以便在应用的各个组件之间导航,或代表其他应用执行操作等。请执行以下操作:
-
嵌套 intent 的内部启动:确保这些组件不会被导出。
-
嵌套 intent 的跨应用启动:使用
PendingIntent
代替嵌套intent
。如此一来,当PendingIntent
从包含它的Intent
中解封时,应用组件可以使用调用进程的身份启动PendingIntent
。该配置允许提供程序应用向调用应用的任何组件(包括未导出的组件)发送回调。
以 Android 12 为目标平台的应用再也无法在后台运行时启动前台服务,但一些特殊情况除外。如果应用尝试在后台运行时启动前台服务,则会引发异常(少数特殊情况除外)。当您的应用在后台运行时,请考虑使用 WorkManager
来计划和启动工作。
当用户与通知互动时,某些应用会启动应用组件来响应通知点按操作,此应用组件最终会启动用户最终看到并与之互动的 activity。此应用组件被称为通知 trampoline。
为了改进应用性能和用户体验,以 Android 12 为目标平台的应用无法从用作通知 trampoline 的服务或广播接收器中启动 activity。换言之,当用户点按通知或通知中的操作按钮时,您的应用无法在服务或广播接收器内调用 startActivity()
。
当您的应用尝试从充当通知 trampoline 的服务或广播接收器启动 activity 时,系统会阻止启动该 activity