PendingIntent.FLAG_UPDATE_CURRENT 重新创建活动
Posted
技术标签:
【中文标题】PendingIntent.FLAG_UPDATE_CURRENT 重新创建活动【英文标题】:PendingIntent.FLAG_UPDATE_CURRENT recreates Activity 【发布时间】:2019-09-21 02:40:43 【问题描述】:我有一个通知,当我点击它时,如果它仍未运行,我想启动应用程序,但如果应用程序已经运行,我不想重新启动它。
所以,我在创建PendingIntent
时使用了PendingIntent.FLAG_UPDATE_CURRENT
标志。
我的代码:
private val notificationManager by lazy NotificationManagerCompat.from(this)
fun testPush()
val notificationBuilder = NotificationCompat.Builder(this, BuildConfig.APPLICATION_ID)
.setSmallIcon(R.drawable.ill_launcher)
notificationBuilder
.setContentTitle("Title")
.setContentText("Test text")
.setContentIntent(buildPendingIntent())
notificationBuilder
.setAutoCancel(true)
.priority = NotificationCompat.PRIORITY_DEFAULT
notificationManager.notify(1, notificationBuilder.build())
private fun buildPendingIntent(): PendingIntent
val intent = Intent(this, RootActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
intent.putExtra("action", RootActivity.DEFAULT_INTENT)
return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
但是当我启动应用程序并单击通知时,会重新创建活动。
【问题讨论】:
FLAG_UPDATE_CURRENT
没有这种效果。这表示您想要更新Intent
的附加功能,如果已经有一个PendingIntent
对应的Intent
。它没有说明您是否要重用现有的活动实例。
@CommonsWare 所以,我需要为Intent
设置一些标志来获得描述的效果,对吧?在这里:intent.flags = Intent.<SOME_FLAG>
。文档说,Intent.FLAG_ACTIVITY_SINGLE_TOP
将以所描述的方式工作:“如果活动已经在历史堆栈的顶部运行,则不会启动它”。但是我的应用程序不是这样工作的。
默认情况下,您将完成一个新任务,因为PendingIntent
是从您的任务现有活动之一以外的其他活动中调用的。 IIRC,您需要在清单中的 <activity>
元素中调整一些与任务相关的属性。
@CommonsWare 你能提供例子吗?你是说android:launchMode
属性之类的东西吗?
我没有这个方便的样品,抱歉。
【参考方案1】:
您需要为您的应用程序创建一个“启动Intent
”,而不是像您那样为RootActivity
构建Intent
。最简单的方法是调用PackageManager.getLaunchIntentForPackage()
并传递您自己的包名。在对PendingIntent.getActivity()
的调用中使用返回的Intent
。
如果您的应用没有运行,这将启动它,否则,如果它已经在运行,它只会将包含您的应用的现有任务带到前台。
【讨论】:
它仍然会重新创建活动 难以置信。请编辑您的问题并发布您的清单以及您用于创建PendingIntent
的代码。另外你怎么知道Activity
被重新创建了?
试试安卓6、7以上是关于PendingIntent.FLAG_UPDATE_CURRENT 重新创建活动的主要内容,如果未能解决你的问题,请参考以下文章