在android10.0上做双屏异显快一年了,现在做一个总结;便于以后查看,也便于做异显的兄弟借鉴及共同探讨。
一.android 起来默认为异显模式,并且SystemUI 与键盘启动异显。
添加文件display_settings.xml,并且将文件copy到vendor/etc/display_settings.xml
--- a/build/make/target/product/base_system.mk
+++ b/build/make/target/product/base_system.mk
@@ -392,4 +392,8 @@ PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\
PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\
frameworks/base/config/dirty-image-objects:system/etc/dirty-image-objects)
+# display_settings.xml
+PRODUCT_COPY_FILES += $(call add-to-product-copy-files-if-exists,\
+ packages/apps/ActionApps/dualfile/display_settings.xml:vendor/etc/display_settings.xml)
+
--- /dev/null
+++ b/packages/apps/ActionApps/dualfile/display_settings.xml
@@ -0,0 +1,5 @@
+<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+<display-settings>
+<config identifier="0" />
+<display name="local:1" shouldShowSystemDecors="true" shouldShowIme="true" />
+</display-settings>
默认异显模式
--- a/frameworks/base/services/core/java/com/android/server/wm/DisplayWindowSettings.java
+++ b/frameworks/base/services/core/java/com/android/server/wm/DisplayWindowSettings.java
@@ -555,8 +556,10 @@ class DisplayWindowSettings {
REMOVE_CONTENT_MODE_UNDEFINED);
entry.mShouldShowWithInsecureKeyguard = getBooleanAttribute(parser,
"shouldShowWithInsecureKeyguard");
- entry.mShouldShowSystemDecors = getBooleanAttribute(parser, "shouldShowSystemDecors");
- entry.mShouldShowIme = getBooleanAttribute(parser, "shouldShowIme");
+ //entry.mShouldShowSystemDecors = getBooleanAttribute(parser, "shouldShowSystemDecors");
+ //entry.mShouldShowIme = getBooleanAttribute(parser, "shouldShowIme");
+ entry.mShouldShowSystemDecors = true; // defual ture modify by hdb
+ entry.mShouldShowIme = true;
entry.mFixedToUserRotation = getIntAttribute(parser, "fixedToUserRotation");
mEntries.put(name, entry);
}
--- a/frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -915,6 +915,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
/*|| (obscured && type == TYPE_KEYGUARD_DIALOG)*/)) {
// Allow full screen keyguard presentation dialogs to be seen.
displayHasContent = !(obscured && type == TYPE_KEYGUARD_DIALOG);
+ if(!displayContent.supportsSystemDecorations()){//rk patch for dualscreen
+ displayHasContent=false;
+ }
}
if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) {
mSustainedPerformanceModeCurrent = true;
--- a/frameworks/base/core/res/res/values/config.xml
+++ b/frameworks/base/core/res/res/values/config.xml
@@ -2225,7 +2226,7 @@
<!-- Whether the system enables per-display focus. If the system has the input method for each
display, this value should be true. -->
- <bool name="config_perDisplayFocusEnabled">false</bool>
+ <bool name="config_perDisplayFocusEnabled">true</bool>
<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
//异声时互不影响播放
--- a/frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.java
+++ b/frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.java
@@ -754,6 +754,7 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
+ " flags=0x" + Integer.toHexString(flags)
+ " sdk=" + sdk))
.printLog(TAG));
+ focusChangeHint = 3;
// we need a valid binder callback for clients
if (!cb.pingBinder()) {
2.此时在可以通过StartActivity的setLaunchDisplayId来决定app是显示在主屏还是副屏
//displayId = 0显示到主屏,1显示到副屏
ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(displayId);
startActivity(launchIntentForPackage,options.toBundle());
3.同显与异显切换
diff=true 为同显,false为异显
mWindowManager.setShouldShowSystemDecors(1,diff);
mWindowManager.setShouldShowIme(1, diff);