【Android学习笔记】双屏开发 Presentation副屏/客显的使用

      最近项目中有用到双屏的,副屏中一般会展示一些广告等界面。

      官方的使用Presentation文档:https://developer.android.com/reference/android/app/Presentation

      话不多说,直接上代码:

定义:

DisplayManager mDisplayManager;//屏幕管理类
Display mDisplay[];//屏幕数组
Presentation lastDisplayPresentation;//用于记录上次展示的副屏的界面

初始化:

        这里是在Activity的onCreate里马上调用展示副屏,但是此时可能Activity没有初始化完成,所以要延时。

public void initDisplayData() {
    mDisplayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
    mDisplay = mDisplayManager.getDisplays();
    //延时展示
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            showAdvDisplay();
        }
    }, 100);
}

显示副屏/客显:

       这里要判断一下display屏幕的数量是否大于1,不然跑在虚拟机或其他一块屏幕的设备会奔溃。

说明:lastDisplayPresentation的作用是记录上次展示的界面,当副屏加载新的界面后,要dismiss掉之前的Presentation,否则反复切换40次以上,就要奔溃了。

private void showAdvDisplay() {
    if (mDisplay.length < 2) {
        return;
    }
    AdPresentation mPresentation = new AdPresentation(MainActivity.this, mDisplay[1], getAssets());
    showPersentation(mPresentation);
}

private void showPersentation(final Presentation persentation) {
    persentation.show();
    //延时取消,否则会闪动
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            if (lastDisplayPresentation != null) {
                lastDisplayPresentation.dismiss();
                lastDisplayPresentation = null;
            }
            lastDisplayPresentation = persentation;
        }
    }, 100);
}

Presentation例子:

public class AdPresentation extends Presentation {
    private AssetManager mAssetManager = null;
    private ImageView mQrCode;
    private Bitmap mBitmap;

    public AdvPresentation(Context outerContext, Display display, AssetManager manager, Bitmap bitmap) {
        super(outerContext, display);
        this.mAssetManager = manager;
        this.mBitmap = bitmap;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_display_ad);
        if (mBitmap != null) {
            setImage(mBitmap);
        }
    }

    public void setImage(Bitmap bitmap) {
        ImageView imageView = (ImageView) findViewById(R.id.img);
        imageView.setImageBitmap(bitmap);
    }
}

另:Activity里onDestory方法要dismiss掉,不然退出软件也要奔溃。

@Override
protected void onDestroy() {
    super.onDestroy();
    if (lastDisplayPresentation != null) {
        lastDisplayPresentation.dismiss();
    }
}

       还有,当前Activity A跳转到新的Activity B后,之前显示的副屏会消失,随着新Activity B打开,副屏会自动投屏新Activity,如果希望副屏还是显示之前的,那么怎么解决呢?我研究了一下,暂时不清楚怎么不投屏,所以就想了个办法,在新Activity B的onCreate()后,用EvenBus发送广播到Activity A,重新显示一下上次投屏。

//接受到Evenbus消息
@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveDisplaycMsg(MsgDisplay msg) {
    if (msg.getAction() == MsgDisplay.MSG_DISPLAY_LAST_PRESENTATION) {
        showLastDisplay();
    }
}

private void showLastDisplay() {
    if (mDisplay.length < 2) {
        return;
    }
    if (lastDisplayPresentation != null) {
        lastDisplayPresentation.dismiss();
        lastDisplayPresentation.show();
    }
}

但是这里有一点瑕疵,一dismiss掉就马上show,副屏会闪动一下,想破头不知道解决,望告知。

你可能感兴趣的:(android)