我可以从通知中启动对话活动,使其显示在我的应用程序窗口上而不是空白背景上吗?
Posted
技术标签:
【中文标题】我可以从通知中启动对话活动,使其显示在我的应用程序窗口上而不是空白背景上吗?【英文标题】:Can I launch a dialog activity from a notification so it appears over my app's window instead of on a blank background? 【发布时间】:2020-02-22 16:06:51 【问题描述】:我正在编写一个包含两个主要活动的应用程序:
主要活动 对话活动MainActivity 是一个典型的应用程序窗口,而 DialogActivity 是我通过设置android:theme="@style/Theme.AppCompat.Light.Dialog"
设置为看起来像一个对话框的活动
我可以从 MainActivity 内部使用以下代码启动 DialogActivity。
val intent = Intent(this, DialogActivity::class.java)
startActivity(intent)
然后对话窗口出现在主窗口上,如下所示:
除此之外,我还希望能够通过点击通知来启动对话框。如果我打开了不同的应用程序并点击通知,对话框将出现在顶部其他应用,如我所愿:
但是,如果我当前打开 MainActivity 然后点击通知,则对话框会出现在空白背景的顶部:
尽管对话框出现在概览屏幕中主活动窗口的“顶部”,但还是会发生这种情况:
所以这是我的问题:如果我在前台有 MainActivity,然后通过点击适当的通知启动 DialogActivity,我可以让 DialogActivity 出现在打开的 MainActivity 窗口的顶部?
换句话说,当我点击通知时,如果 MainActivity 已经在前台打开,我希望它看起来像第一张图片,如果另一个应用程序在前台,则像第二张图片,并且只有在存在时才像第三张图片目前没有打开的应用程序。
我正在使用以下 PendingIntent 从通知中启动活动。也许有一组特殊的意图标志可以做我想要的?或者也许我需要做一些更激烈的事情,比如将两个单独的活动合并为一个活动?
val intent = Intent(this, DialogActivity::class.java)
intent.flags = 0
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
屏幕截图来自运行 Android 9(Api Level 28)的模拟器
【问题讨论】:
尝试从通知中启动MainActivity
,而不是DialogActivity
,并将一些数据传递给MainActivity
,以表明您正在从通知中启动它,以及该数据是否可用然后启动DialogActivity
@hiddeneyes02 如果我在打开另一个应用程序时点击通知,我仍然希望它看起来像第二张图片。如果我使用单个活动,有没有办法做到这一点?
你试过了吗:***.com/a/39691342/3016293
谢谢,这正是我想要的!
【参考方案1】:
通过传递参数和意图而不是移动 DialogActivity 启动应用程序,然后处理参数值。基于此决定是否启动对话活动
【讨论】:
我不想显示 MainActivity 窗口,除非它已经在前台打开。如果另一个应用程序当前在前台,我仍然希望它看起来像第二张图片。有没有办法通过一个活动来做到这一点?【参考方案2】:实现我想要的结果的关键是在应用清单中设置android:taskAffinity=""
。完整的步骤在in this section of the documentation 中进行了解释。 this related question 也可能值得一读。
-
在应用清单中,将
taskAffinity
设置为空字符串,这样对话框就不会覆盖概览屏幕中的旧应用窗口
如果需要,设置excludefromRecents="true"
,这样对话框就不会作为单独的条目出现在概览中。如果用户离开它,它实际上会被关闭。
<activity
android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Light.Dialog"
android:excludeFromRecents="true"
android:taskAffinity="">
</activity>
在启动对话活动时传递 NEW_TASK 和 CLEAR_TASK 标志:
val intent = Intent(this, DialogActivity::class.java)
intent.flags =
Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
【讨论】:
以上是关于我可以从通知中启动对话活动,使其显示在我的应用程序窗口上而不是空白背景上吗?的主要内容,如果未能解决你的问题,请参考以下文章
从 android 推送通知单击启动时,意图数据未在活动中更新