我是靠谱客的博主 多情大象,最近开发中收集的这篇文章主要介绍安卓多屏互动Presentation设备系统版本开发者模式拟辅助屏幕功能Presentation显示方式Presentation创建,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

安卓多屏互动Presentation

  • 设备系统版本
  • 开发者模式
  • 拟辅助屏幕功能
  • Presentation显示方式
  • Presentation创建
    • 搭建Presentation显示环境
    • 绑定Presentation服务
    • 数据交互
    • 多屏显示性能分析
      • CPU占用
      • 内存占用
    • 副屏不随主屏幕退出
    • 补充

设备系统版本

Android 从4.2开始支持双屏显示,请确保minSdkVersion >= 17

开发者模式

进入设备—设置—关于手机—版本号—连续点击—退回到系统设置首页位置的时候,将会看开发者选项—打开usb调试模式。

拟辅助屏幕功能

进入设备—设置—开发者模式—模拟辅助显示设备—选择一款需要调试分辨率的屏幕。
在这里插入图片描述

Presentation显示方式

根据不同的显示需求,Presentation有两种显示方式,一种是随应用Activity显示隐藏同步的辅助屏显示,另一种是常驻辅助屏的保持显示模式。如果需要使用常驻显示模式,那么Presentation的显示需要放到Service中。

Presentation创建

Presentation构造函数中的Context参数可以是Activity,也可以是ApplicationContext或者是Service,但如果是ApplicationContext或是Service类型的Context,Presentation的Type类型必须为SYSTEM_ALERT。

public class SecondScreenPresentation extends Presentation implements MapFrameLayout.MapCallBackListener,
        SearchFrameLayout.SearchCallBack {

    /** TAG **/
    private static final String TAG = "Presentation";
    /** 根布局 **/
    private FrameLayout fmContent;
    /** 地图页 **/
    private MapFrameLayout mapFrameLayout;
    /** 搜索页 **/
    private SearchFrameLayout searchFrameLayout;

    /** Context 可以为Activity Application Service **/
    public SecondScreenPresentation(Context outerContext, Display display) {
        super(outerContext, display);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.presentation_search);
        init();
    }

    private void init(){
        initView();
        initEvent();
    }
    // ··· 省略页面初始化与页面事件代码
}

搭建Presentation显示环境

需要用到安卓系统的DisplayManager,通过getDisplays方法我获取到当前系统所挂载的所有屏幕,然后对指定的屏幕进行Presentation显示操作。以一块主屏和一块辅屏为例,在获取到displays数组后,displays[0]即为我们系统的主屏幕,displays[1]即为系统的辅助屏幕。因为设置了显示类型为SYSTEM_ALERT,所以这里需要给我们的应用添加相应的权限,6.0以上系统记得申请动态权限。

     /**  弹窗权限 **/
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    /**  屏幕管理器 **/
    private DisplayManager mDisplayManager;
    /**  屏幕数组 **/
    private Display[] displays;
    /** 初始化第二块屏幕 **/
    private void initPresentation(){
        if(null==presentation){
            mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
            displays = mDisplayManager.getDisplays();
            if(displays.length > 1){
                // displays[1]是副屏
                presentation = new SecondScreenPresentation(this, displays[1]);
                presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

            }
        }
    }

绑定Presentation服务

主屏通过绑定服务开启Presentation的显示,在服务的onServiceConnected方法中进行Presentation的show操作。

public class PresentationPresenter {

    private MultiScreenService multiScreenService;
    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            multiScreenService = ((MultiScreenService.MultiScreenBinder) service).getService();
            //显示第二块屏幕
            multiScreenService.showSearchPresentation();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //恢复置空
            multiScreenService = null;
        }
    };

    public void openSearchPresentation(Activity activity){
        Intent intent = new Intent(activity,MultiScreenService.class);
        activity.bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);

    }
}

数据交互

主屏与辅助屏事件支持同屏同显与同屏异显两种模式,主副屏幕可以通过事件总线EventBus或者RxBus实现。页面数据的刷新与变更可以使用总线机制实现,也可以使用 Jetpack的LiveData实现

多屏显示性能分析

CPU占用

在一个典型的显示系统中,一般包括CPU、GPU、Display三个部分。CPU 计算屏幕数据、GPU 进一步处理和缓存、最后 Display 再将缓存中(buffer)的屏幕数据显示出来。而CPU计算屏幕数据指的就是View树的绘制过程,也就是窗体对应的视图树从根布局 DecorView 开始层层遍历每个 View,分别执行测量、布局、绘制三个操作的过程,对于多屏显示来说,因为新增了一个辅助屏幕的页面展示,势必会增加CPU的占用。

通过Android Studio的Android Profiler来实际看一下CPU的使用情况

可以看到CPU的占用情况与辅助屏页的绘制相关,普通页面CPU占用约提升0.7,显示双屏UI后CPU占用均值16.1%。基于SurfaceView的地图页面CPU占用提升1.5,显示双屏UI后CPU占用均值37%。

内存占用

多屏显示增加CPU占用的同时也将引发更多的内存分配,内存的占用与页面的复杂度息息相关,页面使用的对象越丰富,特效越复杂,带来的内存消耗也就越多,通常来说有些功能本身就会很耗内存,例如视频直播,音乐播放,地图显示等。

通过Android Studio的Android Profiler分析一下多屏显示的内存占用情况

可以看到内存占用情况与页面负责度相关,当辅助屏为普通页面的情况下,内存占用只增加了4MB左右,内存平稳。当辅助屏为基于SurfaceView的地图页面的情况下,内存拉升20MB左右。

副屏不随主屏幕退出

通常创建Presentation传入的是Activity的上下文,副屏会随创建它的Activity显示或隐藏,这里讨论创建全局副屏。
用的技术也不复杂,只是给Presentation添加系统弹窗权限。
前面说了传入Presentation的上下文可以是Application或Service,前提是必须加入系统弹窗权限,否则会崩溃;这样就可以在任何地方新建显示Presentation。

补充

Presentation实际上是一个Dialog,所以里面无法弹出Dialog、PopupWindow等依赖于Activity的小窗口,同样也无法使用Fragment。

Presentation官方文档

最后

以上就是多情大象为你收集整理的安卓多屏互动Presentation设备系统版本开发者模式拟辅助屏幕功能Presentation显示方式Presentation创建的全部内容,希望文章能够帮你解决安卓多屏互动Presentation设备系统版本开发者模式拟辅助屏幕功能Presentation显示方式Presentation创建所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部