Android P图形架构之实现双屏异显

Android支持双屏异显。

一、第一种方式,通过adb命令将app启动在第二块屏幕上:

adb shell am start -n com.android.demo/com.android.demo.MainActivity --display 1

在am start命令后面增加–display 1
display 1,表示显示在第二块屏上;
display 0,表示第一块屏幕;

二、第二种方式,通过Presentation方式:

Presentation的作用就是将内容显示在辅助屏幕或者第二块屏幕上。详细见谷歌官网说明:
https://developer.android.com/reference/android/app/Presentation

代码实现:

1.实现一个Presentation

public class DifferentDisplay extends Presentation {
    private static final String TAG = "DifferentDisplay";
    private static Context mContext;

    public DifferentDisplay(Context outerContext, Display display) {
        super(outerContext, display);
        mContext = outerContext;
    }

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dispaly 1"
        android:layout_gravity="center"/>
</LinearLayout>

2.启动Presentation

public class MainActivity extends Activity {
    DisplayManager mDisplayManager;
    Presentation mPresentation;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDisplayManager = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
        Display[] displays = mDisplayManager.getDisplays();
        if( null == mPresentation ){
            mPresentation = new DifferentDisplay(this,displays[displays.length - 1]);
            mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
            mPresentation.show();
        }
    }
}

3.需要的权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>

这样DifferentDisplay 的UI就以一个窗口的形式显示在第二块屏幕上。

三、第三种方式,通过startActivity方式:

startActivity()指定activity运行在哪个屏幕上:

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(1);		//这里一直display0是第一块屏;display1是第二块屏
Intent secondIntent = new Intent();
ComponentName cn= new ComponentName("com.android.demo","com.android.demo.SecondActivity");
secondIntent .setComponent(cn);
secondIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(secondIntent, options.toBundle());
<activity
    android:name=".SecondActivity"
    android:label="@string/app_name"
    android:resizeableActivity="true"
    >

四、报错:

当Android系统不支持或者需要某个属性特征时才允许显示 secondary displays,可能会出现的报错:

1.报错1:App does not support launch on secondary displays Android

不支持显示在secondary displays上。

2.报错2:Device doesn’t support multi-display, can not reparent task= 4 to stackId=2

不支持multi-display显示。

3.原因:系统不支持多屏显示特性

类似于双屏异显的特性是通过/system/etc/permissions/下面的xml配置文件来进行控制的。

多屏显示的特性xml文件:
\frameworks\native\data\etc\android.software.activities_on_secondary_displays.xml

android.software.activities_on_secondary_displays.xml文件:

<permissions>
    <feature name="android.software.activities_on_secondary_displays" />
</permissions>

4.解决

1、需要将android.software.activities_on_secondary_displays.xml文件拷贝到/system/etc/permissions/下面,双屏异显才可生效。否则就会报错。adb push命令。

2、或者在编译时在mk文件中增加编译脚本:
PRODUCT_COPY_FILES += frameworks/native/data/etc/android.software.activities_on_secondary_displays.xml : system/etc/permissions/android.software.activities_on_secondary_displays.xml重新编译系统生效。

关于安卓hasSystemFeature及系统特性配置,请参考文章:
https://blog.csdn.net/lzpdz/article/details/51841213

五、调试:

在开发者模式中,打开Simulate secondary displays选项,打开辅助屏显示:
Android P图形架构之实现双屏异显_第1张图片

你可能感兴趣的:(android,p系统架构)