概述
安卓多屏互动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创建所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复