Presentation

Android异显开发概述


目前存在有些Android设备(比如收银机)存在多个屏幕,不同的屏幕显示不同的内容,这种场景就称做Android多屏异显。Android从4.2开始支持双屏异显,主要基于AndroidSDK提供的API,使用Presentation类,将一个APP的相关内容显示到指定的屏幕上。

Presentation

Presentation是一个特殊的dialog,它的目的是显示内容到第二屏幕。在Presentation创建的时候关联一个目标设备,确定Presentation要显示在那个设备上,根据这个设备的信息来配置Presentation的context和resources信息。

Presentation的context与包含它的Activity的context是不相同的,用presentation的上下文来填充一个presentation的layout和加载其它的资源是非常重要的,可以确保我们加载的目标设备正确的尺寸密度assets。

当Presentation附属的display被移除的话,Presentation就会自动被取消。当创建Presentation的Activity自己处于paused或者resumed,无论Presentation在显示什么内容,该Activity就要关心对Presentation 进行pausing and resuming

1
2
3
4
5
6
7
8
9
10
11
public class Presentation extends Dialog {
private static final String TAG = "Presentation";
...
}

public Presentation(Context outerContext, Display display) {
this(outerContext, display, 0);
}

public Presentation(Context outerContext, Display display, int theme) {
super(createPresentationContext(outerContext, display, theme), theme, false);

从源码上看,Presentation继承Dialog,Presentation是一个特殊的Dialog, 其有两个构造方法,必要的参数有两个,一个是Context, 一个是Display。Context是其依附于其初始化的Activity的上下文,Display为该Presentation需要显示的屏幕。Display如果获取呢?

获取设备上的屏幕

1
2
3
4
5
6
7
8
DisplayManager  mDisplayManager;//屏幕管理类
Display[] displays;//屏幕数组
mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);
/**
* 主屏:displays[0]
* 副屏:displays[1]
*/
displays = mDisplayManager.getDisplays();

displays 是一个数组,一般情况是数组第0个为主屏,第1个开始为副屏。所以初始化Presentation使用的Display参数就需要取displays[1]。

在副屏上展示内容

通过Presentation来实现,Presentation继承了Dialog。假设我们写了一个DifferentDislay的类,这个类是要继承

1
2
3
4
5
6
7
8
9
10
11
privateclass DifferentDislay extends Presentation{
public DifferentDislay(Context outerContext, Display display) {
super(outerContext,display);
//TODOAuto-generated constructor stub
}
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diffrentdisplay_basket);
}
}

开启副屏

1
2
3
4
5
6
7
8
  //context用getApplicationContext在点击home键时只要程序还在后台副屏就还显示,displays[1]是副屏
DifferentDislay mPresentation = new DifferentDislay (getApplicationContext,displays[1]);

//setType()中的参数可以使用TYPE_SYSTEM_ALERT,TYPE_TOAST,不过俩个都过时了;
//介意过时的话可以改成FLA_LAYOUT_IN_OVERSCAN;
mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

mPresentation.show();

存在的问题

  1. Presentation依赖Activity的生命周期

参考

Android双屏机双屏异显
CWAC Presentation