Android 8.0 学习(21)---Oreo的画中画模式学习

本文详细介绍了Android 8.0 (API Level 26) 中新增的画中画(Picture-in-Picture,简称PIP)模式。PIP模式允许应用程序在小窗口中继续播放视频内容,即使用户切换到其他应用。文章讲解了如何在AndroidManifest.xml中声明支持PIP、如何通过代码触发进入PIP模式以及如何处理页面在不同模式间转换的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Android 8.0 Oreo的画中画模式学习


本文主要是对谷歌开发者官方微信公众号发布的Android 8.0 Oreo 画中画模式一文的学习记录。 
这里写图片描述

画中画模式Picture-in-picture(PIP)简介

在Android 8.0(API Level 26)中,Activity可以启动画中画 Picture-in-picture(PIP)模式。PIP 是一种特殊类型的多窗口模式,常见于视频播放场景。Activity处于画中画模式时,是处于暂停状态的(onPause),但仍然可以继续展示内容,所以app不能在onPause()中停止播放,而应该在onStop()中停止,在onStart()中启动播放。

声明Activity支持画中画

从 Android 8.0(API 级别 26)开始,声明Activity支持PIP非常简单。只需在Manifest.xml中将Activity的supportsPictureInPicture标志置为true,不需要设置android:resizeableActivity为true,只有在声明Activity支持多窗口模式时,才需要设置android:resizeableActivity为true。

<activity 
    android:name=".MainActivity"
    ...
    android:supportsPictureInPicture="true" />
  • 如何进入画中画模式
public boolean enterPictureInPictureMode(PictureInPictureParams params)
  • PictureInPictureParams 的创建方式:
private void enterPIP() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Icon icon = Icon.createWithResource(MainActivity.this, R.drawable.ic_pause_24dp);
                PendingIntent intent = PendingIntent.getBroadcast(MainActivity.this,
                                REQUEST_PAUSE,
                                new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PAUSE),
                                0);
                ArrayList<RemoteAction> actions = new ArrayList<>();
                actions.add(new RemoteAction(icon, "PIP", "PIP", intent));
                PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
                builder.setActions(actions);
                enterPictureInPictureMode(builder.build());
    }
}
  • 注意

如果只是配置了android:supportsPictureInPicture="true",然后就在代码中进入画中画模式,我们可能会遇到:页面被销毁后重新启动并进入pause状态。现象就是:窗口是缩小了,但是视频却可能是重新开始播放的,这显然不是我们想要的。其生命周期变化如下:

onResume()onResume()onPause()onPause()onStop()onStop()onDestroy()onDestroy()onCreate()onCreate()onStart()onStart()触发进入PIP模式

这是因为,进入画中画模式,页面的纵横比可能发生了变化(尤其是应用全屏时是竖屏的状态),系统会以为页面从竖屏进入横屏模式,导致页面被销毁重新创建。 
处理方法就是在Manifest的Activity节点下添加android:configChanges配置,告诉系统哪些配置变化由app自己处理而不用重启页面,并按需要在onConfigurationChanged回调中进行相应处理。

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

画中画模式和全屏的转换

页面在进入画中画模式或恢复全屏时,我们可能有一些页面的显示细节要对应处理,这些处理可能放到Activity的onPictureInPictureModeChanged ( )的回调方法中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值