安卓基础之《(26)—回到桌面与切到任务列表》

一、关联广播

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、老师寄语

学习最大的困难不是学习本身,而是急于求成的心态

相关推荐
恋猫de小郭1 天前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
三少爷的鞋1 天前
不要让调用方承担你本该承担的复杂度 —— Android Data 层设计原则
android
李李李勃谦1 天前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
fengci.1 天前
ctfshow其他(web396-web407)
android
JJay.1 天前
Android 17 大屏适配变化解
android
TE-茶叶蛋1 天前
结合登录页-PHP基础知识点解析
android·开发语言·php
alexhilton1 天前
Jetpack Compose元球边缘效果
android·kotlin·android jetpack
y小花1 天前
安卓音频子系统之USBAlsaManager
android·音视频
KevinCyao1 天前
安卓android视频短信接口怎么集成?AndroidStudio视频短信开发指南
android
Android出海1 天前
安卓侧载强制24小时冷却,第三方APK直投买量面临停摆
android·google play·app出海·android出海·android侧载·谷歌开发者·android开发者