我可以从通知中启动对话活动,使其显示在我的应用程序窗口上而不是空白背景上吗?

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 推送通知单击启动时,意图数据未在活动中更新

为啥挂起的意图在从服务的通知中调用时不会启动活动

意图恢复先前暂停的活动(从通知中调用)

Android - 如何覆盖“后退”按钮,使其不会完成()我的活动?

如何在通知到达时在任何屏幕上显示自定义对话框?