【问题标题】:Launching Intent from notification opening in picture-in-picture window从画中画窗口中打开的通知启动 Intent
【发布时间】: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。这似乎无法解决问题。

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

【问题讨论】:

  • 首先猜猜,点击通知后,您是否会打开将运行另一个活动的无头(无布局)活动?

标签: android android-intent android-pendingintent android-picture-in-picture


【解决方案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" 添加到所有活动(我的画中画活动除外),但问题仍然存在。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多