Android13系统设置双栏显示改单栏显示
Android13系统在大屏显示时采用双栏显示功能,默认情况下通过isEmbeddingActivityEnabled方法决定是否启用嵌入式显示。该方法依赖于FeatureFlagUtils来判断是否支持嵌入式活动展示。通过修改FeatureFlagUtils.java中的相关代码(将SETTINGSSUPPORTLARGE_SCREEN标志设为false),实现了将双栏显示改为单栏展示的效果。具体效果可以通过重新启动相关设置应用并查看界面变化来验证(如下图所示)。
Android13系统,接大屏显示的时候,系统设置是双栏显示的。如下图:

这一项功能属于Android13系统的新特性。
当应用于大屏显示系统时,默认情况下将呈现为双栏布局。
此一功能属于嵌入式设计的一部分。
具体来说,在配置界面中可通过设置标志位变量来判断是否启用双栏布局。
在Android Settings包下的SettingsHomepageActivity类中定义的onCreate方法执行过程中,在布局构建之前会调用ActivityEmbeddingUtils.isEmbeddingActivityEnabled()方法来判断当前活动是否支持嵌入式显示功能。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mIsEmbeddingActivityEnabled = ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this);
if (mIsEmbeddingActivityEnabled) {
final UserManager um = getSystemService(UserManager.class);
final UserInfo userInfo = um.getUserInfo(getUser().getIdentifier());
if (userInfo.isManagedProfile()) {
final Intent intent = new Intent(getIntent())
.setClass(this, DeepLinkHomepageActivityInternal.class)
.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
.putExtra(EXTRA_USER_HANDLE, getUser());
intent.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityAsUser(intent, um.getPrimaryUser().getUserHandle());
finish();
return;
}
}
该方法用于判断是否已启用嵌入式活动。在ActivityEmbeddingUtils类中找到名为isEmbeddingActivityEnabled的功能实现部分。该方法负责判断当前系统中是否启用了嵌入式功能模块。具体来说,该逻辑会根据配置文件中的相关参数设置来决定是否开启这一功能模块。当字段设置为true时,则表示嵌入式活动已开启。
/** Whether to support embedding activity feature. */
public static boolean isEmbeddingActivityEnabled(Context context) {
final boolean isFlagEnabled = FeatureFlagUtils.isEnabled(context,
FeatureFlagUtils.SETTINGS_SUPPORT_LARGE_SCREEN);
final boolean isSplitSupported = SplitController.getInstance().isSplitSupported();
Log.d(TAG, "isFlagEnabled = " + isFlagEnabled);
Log.d(TAG, "isSplitSupported = " + isSplitSupported);
return isFlagEnabled && isSplitSupported;
}
此函数的返回值由两个条件共同决定:一个是isFlagEnabled是否为true?另一个是isSplitSupported是否为true?通过日志打印分析得知这两个条件均为true状态;为了使该函数输出结果变为false,则只需将其中一个条件设置为false即可。具体而言:isFlagEnabled的状态则由FeatureFlagUtils.isEnabled(context, SETTINGS_SUPPORT_LARGE_SCREEN)这一方法来确定;为了实现上述目标我们需要定位到frameworks/base/core/java/android/util/FeatureFlagUtils.java文件中查看isEnabled方法;然后检查该feature属性是否等于SETTINGS_SUPPORT_LARGE_SCREEN;如果满足条件则将其设置为false。
--- a/frameworks/base/core/java/android/util/FeatureFlagUtils.java
+++ b/frameworks/base/core/java/android/util/FeatureFlagUtils.java
@@ -131,6 +131,10 @@ public class FeatureFlagUtils {
public static boolean isEnabled(Context context, String feature) {
// Override precedence:
// Settings.Global -> sys.fflag.override.* -> static list
+
+ if(feature.equals(SETTINGS_SUPPORT_LARGE_SCREEN)){
+ return false;
+ }
在编译完成后,通过将系统设置app的相关文件推送给系统重启过程中的相关节点,则实现了为单栏显示效果的转变

