从画中画窗口中打开的通知启动 Intent

Posted

技术标签:

【中文标题】从画中画窗口中打开的通知启动 Intent【英文标题】:Launching Intent from notification opening in picture-in-picture window 【发布时间】:2019-05-30 09:52:16 【问题描述】:

我关注了android picture-in-picture documentation。也就是说,我的画中画活动在清单中被标记为android:launchMode="singleTask"android:resizeableActivity="true"android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

画中画似乎效果很好。但是,我注意到一个我遇到不良行为的案例。

当我的应用收到推送时,我会为 MyActivity 创建一个带有 IntentPendingIntent(与 PiP Activity 不同的 Activity)。但是,当我点击通知并使用 Intent 时,MyActivity 正在画中画窗口内启动!

我尝试在清单中将android:launchMode="singleTask" 添加到MyActivity。在与PendingIntent.getActivity() 一起使用之前,我还尝试以编程方式将该标志添加到Intent。这似乎无法解决问题。

谁能告诉我如何防止这种情况发生?

【问题讨论】:

首先猜猜,点击通知后,您是否会打开将运行另一个活动的无头(无布局)活动? 【参考方案1】:

我也遇到过这个问题,你可以尝试在你的 MyPipActivity manifest 中添加"android:excludeFromRecents="true"

【讨论】:

【参考方案2】:

为了解决这个问题,我们应该在 manifest 中为 PiP Activity 设置一个唯一的 taskAffinity。它表示该活动所属的任务。为其设置一个唯一值会将 PiP Activity 的任务与您的 MainActivity 分开。

<activity
    android:name=".VideoActivity"
    android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
    android:taskAffinity=".VideoActivity"
    android:supportsPictureInPicture="true" />


---------------------- 之前 -------------------- -------------------------- 之后 ---------------- --------

【讨论】:

行得通!但是,它确实提出了一个新问题。启动MyPipActivity时,动画完全不同,不受欢迎。 所有非根任务活动都会出现此问题。同样当活动设置singleInstance。但是,直到现在我还没有找到解决方案。也许最好使用something like this自己覆盖所有活动转换。 感谢您的回复。我之前已经探索过该解决方案。我的问题是我不能直接引用系统动画(即:android.R.anim.xyz)。我可以复制这些 Android 动画文件的内容并使用我自己的自定义动画,但是一旦某些设备 OEM 更改了 Activity 切换动画(很多人似乎都这样做),就会中断。 不客气,伙计。如果我知道您如何解决此问题,我将非常高兴。我在 singleInstance 模式下遇到了同样的问题。 如果我找到解决方案,我会告诉你的。感谢您的帮助!【参考方案3】:

首先,正如你在google sample codes中看到的,它不需要使PIP的启动模式ActivitysingleTask。但是,您需要将启动器任务移到不在 PIP 模式下的最前面,以禁用 PIP 状态。

通过在通知调用的目标ActivityonCreate()方法中调用bellow sn-p,可以实现。

public static void moveLauncherTaskToFront(Context context) 
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    assert activityManager != null;
    final List<ActivityManager.AppTask> appTasks = activityManager.getAppTasks();
    for (ActivityManager.AppTask task : appTasks) 
        final Intent baseIntent = task.getTaskInfo().baseIntent;
        final Set<String> categories = baseIntent.getCategories();
        if (categories != null && categories.contains(Intent.CATEGORY_LAUNCHER)) 
            task.moveToFront();
            return;
        
    

---------- 之前 ----------------- ----------------------------- 之后 ------------- ------------

【讨论】:

如果我理解正确,这就是 PiP 活动并“最大化”它。我的情况涉及启动一个不是 PiP 活动的活动。所以,如果MyPipActivity 在画中画窗口中运行,并且我有一个PendingIntent 用于通知启动MainActivity,我希望MainActivity 启动全屏(理想情况下,画中画窗口运行MyPipActivity 仍然处于活动状态) 在自己的任务中。现在,点击通知会在画中画窗口中启动MainActivity【参考方案4】:

android:supportsPictureInPicture="false" 添加到清单中的 MyActivity。它应该可以解决您的问题

【讨论】:

感谢您的回复。我已将android:supportsPictureInPicture="false" 添加到所有活动(我的画中画活动除外),但问题仍然存在。

以上是关于从画中画窗口中打开的通知启动 Intent的主要内容,如果未能解决你的问题,请参考以下文章

如果应用程序终止后从通知正文启动应用程序,则打开弹出窗口

当前正在使用相同的活动时,从通知栏启动新活动

无法从服务启动前台通知?

从通知启动 Activity - Android Studio

如何通过 Intent 从 SD 卡打开 PDF

Android不同发行版本区别