Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)

简介: Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)

需要源码请点赞关注收藏后评论区留言~~~

一、竖屏与横屏切换

除了系统广播之外,App所处的环境也会影响运行,比如手机有竖屏与横批两种模式,竖屏时水平方向较短且垂直方向较长,横屏时水平方向较长而垂直方向较短,两种屏幕方向不但造成App界面的展示差异,而且竖屏和横屏切换之时,甚至会打乱App的生命周期

由下图可见横屏与竖屏的日志时间不一样,说明App从竖屏变为横屏的时候,整个活动页面又重头创建了一遍,这样不停的重新加载是非常消耗系统资源的。所以Android设计了一种配置变更机制,无须重启活动页面只需执行特定的变更行为即可,分为两步

1:修改AndroidManifest.xml文件

2:修改活动页面的java代码

此处要连接真机比较好进行测试 模拟机没法旋转~~~

代码如下

java类代码

package com.example.chapter09;
import androidx.appcompat.app.AppCompatActivity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.widget.TextView;
import com.example.chapter09.util.DateUtil;
public class ChangeDirectionActivity extends AppCompatActivity {
    private TextView tv_monitor; // 声明一个文本视图对象
    private String mDesc = ""; // 屏幕变更的描述说明
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_change_direction);
        tv_monitor = findViewById(R.id.tv_monitor);
    }
    // 在配置项变更时触发。比如屏幕方向发生变更等等
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        switch (newConfig.orientation) { // 判断当前的屏幕方向
            case Configuration.ORIENTATION_PORTRAIT: // 切换到竖屏
                mDesc = String.format("%s%s %s\n", mDesc,
                        DateUtil.getNowTime(), "当前屏幕为竖屏方向");
                tv_monitor.setText(mDesc);
                break;
            case Configuration.ORIENTATION_LANDSCAPE: // 切换到横屏
                mDesc = String.format("%s%s %s\n", mDesc,
                        DateUtil.getNowTime(), "当前屏幕为横屏方向");
                tv_monitor.setText(mDesc);
                break;
            default:
                break;
        }
    }
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">
    <TextView
        android:id="@+id/tv_monitor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请旋转手机使屏幕在竖屏与横屏之间切换"
        android:textColor="@color/black"
        android:textSize="17sp" />
</LinearLayout>

二、回到桌面与切换到任务列表

App不但能检测手机屏幕的方向变更,还能获知回到桌面的事件,连打开任务列表的事件也能实时得知,回到桌面与打开任务列表都由按键触发。因此,若想知晓是否回到桌面,以及是否打开任务列表,都需要收听系统广播 效果如下

可是监听回到桌面的广播能用来干什么呢?一种用处是开启App的画中画模式,比如原先应用正在播放视频,回到桌面时势必要暂停播放,有了画中画模式之后,可将播放界面缩小为屏幕上的一个小方块,这样即使回到桌面也能继续观看视频。

代码如下

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.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Rational;
import android.widget.TextView;
import com.example.chapter09.util.DateUtil;
public class ReturnDesktopActivity extends AppCompatActivity {
    private final static String TAG = "ReturnDesktopActivity";
    private TextView tv_monitor;
    private String mDesc = "";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_return_desktop);
        tv_monitor = findViewById(R.id.tv_monitor);
        initDesktopRecevier(); // 初始化桌面广播
    }
    // 显示变更的状态
    private void showChangeStatus(String reason) {
        mDesc = String.format("%s%s 按下了%s键\n", mDesc, DateUtil.getNowTime(), reason);
        tv_monitor.setText(mDesc);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
                && !isInPictureInPictureMode()) { // 当前未开启画中画,则开启画中画模式
            // 创建画中画模式的参数构建器
            PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
            // 设置宽高比例值,第一个参数表示分子,第二个参数表示分母
            // 下面的10/5=2,表示画中画窗口的宽度是高度的两倍
            Rational aspectRatio = new Rational(10,5);
            builder.setAspectRatio(aspectRatio); // 设置画中画窗口的宽高比例
            // 进入画中画模式,注意enterPictureInPictureMode是Android8.0之后新增的方法
            enterPictureInPictureMode(builder.build());
        }
    }
    // 在进入画中画模式或退出画中画模式时触发
    @Override
    public void onPictureInPictureModeChanged(boolean isInPicInPicMode, Configuration newConfig) {
        Log.d(TAG, "onPictureInPictureModeChanged isInPicInPicMode="+isInPicInPicMode);
        super.onPictureInPictureModeChanged(isInPicInPicMode, newConfig);
        if (isInPicInPicMode) { // 进入画中画模式
        } else { // 退出画中画模式
        }
    }
    // 初始化桌面广播
    private void initDesktopRecevier() {
        desktopRecevier = new DesktopRecevier(); // 创建一个返回桌面的广播接收器
        // 创建一个意图过滤器,只接收关闭系统对话框(即返回桌面)的广播
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        registerReceiver(desktopRecevier, intentFilter); // 注册接收器,注册之后才能正常接收广播
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(desktopRecevier); // 注销接收器,注销之后就不再接收广播
    }
    private DesktopRecevier desktopRecevier; // 声明一个返回桌面的广播接收器对象
    // 定义一个返回到桌面的广播接收器
    private class DesktopRecevier extends BroadcastReceiver {
        // 在收到返回桌面广播时触发
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
                String reason = intent.getStringExtra("reason"); // 获取变更原因
                // 按下了主页键或者任务键
                if (!TextUtils.isEmpty(reason) && (reason.equals("homekey")
                        || reason.equals("recentapps"))) {
                    showChangeStatus(reason); // 显示变更的状态
                }
            }
        }
    }
}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">
    <TextView
        android:id="@+id/tv_monitor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请按下主页键或者任务键,然后回到该页面观察结果"
        android:textColor="@color/black"
        android:textSize="17sp" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
139 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
1月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
259 76
|
27天前
|
安全 API Swift
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
105 15
如何在苹果内购开发中获取App Store Connect API密钥-共享密钥理解内购安全-优雅草卓伊凡
|
22天前
|
Web App开发 编解码 算法
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
在当今移动社交领域,一对一视频和语音通话功能已成为用户期待的基础配置。从熟人社交到陌生人交友,从专业咨询到情感陪伴,实时音视频互动能力直接决定了社交App的用户留存和市场竞争力。山东布谷科技将深入探讨一对一直播源码开发高质量一对一视频和语音通话功能的关键要素和技术实现方案。
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
|
15天前
|
人工智能 小程序 API
【一步步开发AI运动APP】四、使用相机组件抽帧
本文介绍了如何使用`ai-camera`组件开发AI运动APP,助力开发者深耕AI运动领域。`ai-camera`是专为AI运动场景设计的相机组件,支持多平台,提供更强的抽帧处理能力和API。文章详细讲解了获取相机上下文、执行抽帧操作以及将帧保存到相册的功能实现,并附有代码示例。无论是AI运动APP还是其他场景,该组件都能满足预览、拍照、抽帧等需求。下篇将聚焦人体识别检测,敬请期待!
|
8天前
|
人工智能 开发框架 小程序
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
|
11天前
|
人工智能 小程序 开发者
【一步步开发AI运动APP】六、运动计时计数能调用
本文章介绍了如何通过【一步步开发AI运动APP】系列博文,利用uniAPP插件开发高性能的AI运动应用。文中详细说明了创建运动分析器、进行运动分析、监听计数变化以及停止/重置分析等功能实现步骤。插件内置多种常见运动(如跳绳、俯卧撑等),支持自定义扩展,满足健身、体测等场景需求。示例代码展示了人体检测、运动计时计数及UI更新的完整流程,帮助开发者快速上手并深耕AI运动领域。
|
6天前
|
缓存 开发工具 开发者
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
14天前
|
人工智能 小程序 API
【一步步开发AI运动APP】五、人体检测能力调用
本文介绍如何开发性能更强、体验更优的AI运动APP,涵盖人体检测、实例创建、检测识别、骨骼图绘制及完整代码实现。通过API `createHumanDetector`,可灵活配置高性能、高精度或多人检测模式,省去模型部署麻烦。检测结果可通过`yz-pose-grapher`组件高效渲染骨骼图。最后提醒使用完毕需调用`destroy()`释放资源,下篇将聚焦运动检测分析,敬请期待!
|
16天前
|
人工智能 开发框架 小程序
【一步步开发AI运动APP】二、跨平台APP AI运动识别方案介绍
本系列博文旨在帮助开发者从【AI运动小程序】迈向性能更优的【AI运动APP】开发。通过「云智AI运动识别」uni-app版插件,提供本地原生极速识别、精准姿态检测及运动计时计数功能,支持健身系统、线上赛事、学生体测、康复锻炼等多场景应用。插件无需云端依赖,一次付费永久使用,成本低且扩展性强。同时兼容uni-app与uni-app x框架,适合不同技术背景的开发者快速上手,助力抢占AI辅助运动市场。下篇将介绍插件引入,敬请期待!

热门文章

最新文章