一、关联广播
1、按下主页键会回到桌面,按下任务键会打开任务列表,这两个操作并未提供相应的按键处理方法,而是通过广播发出事件信息
2、若想知晓是否回到桌面,以及是否打开任务列表,均需收听系统广播Intent.ACTION_CLOSE_SYSTEM_DIALOGS
3、从收到的广播意图中获取原因reason字段,该字段值为homekey时表示回到桌面,值为recentapps时表示打开任务列表
二、应用的画中画模式
1、监听回到桌面与打开任务列表的广播
2、收到广播之后,调用enterPictureInPictureMode方法进入画中画模式
3、重写活动页面的onPictureInPictureModeChanged方法,补充进入画中画模式或退出画中画模式时的处理逻辑
4、例子
ReturnDesktopActivity.java
java
package com.example.chapter09;
import androidx.appcompat.app.AppCompatActivity;
import android.app.PictureInPictureParams;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Rational;
public class ReturnDesktopActivity extends AppCompatActivity {
private DesktopReceiver desktopReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_return_desktop);
desktopReceiver = new DesktopReceiver();
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
registerReceiver(desktopReceiver, filter, Context.RECEIVER_NOT_EXPORTED);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(desktopReceiver);
}
// 定义一个返回到桌面的广播接收器
public class DesktopReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra("reason");
if (!TextUtils.isEmpty(reason) && (reason.equals("homekey") || reason.equals("recentapps"))) {
// android8.0开始才提供画中画模式
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !isInPictureInPictureMode()) {
// 创建画中画模式的参数构建器
PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
Rational ratio = new Rational(10, 5);
builder.setAspectRatio(ratio);
// 进入画中画模式
enterPictureInPictureMode(builder.build());
}
}
}
}
}
// 画中画模式,回调
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (isInPictureInPictureMode) {
Log.d("sam", "进入画中画模式");
} else {
Log.d("sam", "退出了画中画模式");
}
}
}
接收器是定义在类内部的
5、清单文件修改
android:configChanges="orientation|screenLayout|screenSize"
android:supportsPictureInPicture="true"
(1)声明Activity支持画中画模式,必须设置android:supportsPictureInPicture="true"
(2)添加configChanges属性避免Activity在进入画中画时被销毁重建
6、老师寄语
学习最大的困难不是学习本身,而是急于求成的心态