从画中画窗口中打开的通知启动 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
创建一个带有 Intent
的 PendingIntent
(与 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的启动模式Activity
singleTask。但是,您需要将启动器任务移到不在 PIP 模式下的最前面,以禁用 PIP 状态。
通过在通知调用的目标Activity
的onCreate()
方法中调用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的主要内容,如果未能解决你的问题,请参考以下文章