Программно открытое приложение на разделенном экране
Как открыть другое приложение на разделенном экране в Android N (SDK 24)?
В документации я нашел это:
Запустите новые действия в многооконном режиме
Когда вы запускаете новое действие, вы можете подсказать системе, что новое действие должно отображаться рядом с текущим, если это возможно. Для этого используйте флаг Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT. Передача этого флага требует следующего поведения:
Если устройство находится в режиме разделенного экрана, система пытается создать новое действие рядом с действием, которое его запустило, поэтому эти два действия совместно используют экран. Системе не гарантируется возможность сделать это, но она делает действия смежными, если это возможно. Если устройство не находится в режиме разделенного экрана, этот флаг не действует. Если устройство находится в режиме произвольной формы и вы запускаете новое действие, вы можете указать размеры и расположение нового действия, вызвав ActivityOptions.setLaunchBounds(). Этот метод не действует, если устройство не находится в многооконном режиме.
SE, когда я попробовал это, Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT
флаг не существует. Я установил
- Android 6.x (N) SDK 24 редакция 1
- Android N Preview SDK N редакция 3
- Android 6.0 (Зефир) SDK 23 редакция 3
это мой грейдл
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
defaultConfig {
applicationId "PACKAGENAME"
minSdkVersion 16
targetSdkVersion 24
versionCode 2
versionName "2.4.1"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:design:24.0.0'
compile 'org.jsoup:jsoup:1.8.3'
compile 'com.android.support:support-v4:24.0.0'
compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
}
2 ответа
Привет Начиная с Android 7.0 вы можете перейти в многооконный режим Freeform. Включите параметры разработчика на своем устройстве и используйте следующие команды adb:
adb shell settings put global enable_freeform_support 1
adb shell settings put global force_resizable_activities 1
После вы можете использовать следующую функцию для программного запуска различных действий на разделенном экране:
private void goToSplitMode() {
Intent i = new Intent(this, SplitMainActivity.class);
PackageManager manager = getPackageManager();
i = manager.getLaunchIntentForPackage("com.google.android.apps.maps");
i.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |
Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
DisplayMetrics displayMetrics = new DisplayMetrics();
Rect mBounds = new Rect(300, 0, getScreenWidth(this), getScreenHeight(this));
mOptions = getActivityOptions(MainActivity.this);
mOptions = mOptions.setLaunchBounds(mBounds);
startActivity(i, mOptions.toBundle());
i = new Intent(this, SplitMainActivity.class);
mBounds = new Rect(0, 0, 300, getScreenHeight(this));
mOptions = getActivityOptions(MainActivity.this);
mOptions = mOptions.setLaunchBounds(mBounds);
i.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT |
Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(i, mOptions.toBundle());
}
public static ActivityOptions getActivityOptions(Context context) {
ActivityOptions options = ActivityOptions.makeBasic();
int freeform_stackId = 5;
try {
Method method = ActivityOptions.class.getMethod("setLaunchWindowingMode", int.class);
method.invoke(options, freeform_stackId);
} catch (Exception e) { /* Gracefully fail */
}
return options;
}
public static int getScreenWidth(@NonNull Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Insets insets = windowMetrics.getWindowInsets()
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
return windowMetrics.getBounds().width() - insets.left - insets.right;
} else {
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.widthPixels;
}
}
public static int getScreenHeight(@NonNull Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Insets insets = windowMetrics.getWindowInsets()
.getInsetsIgnoringVisibility(WindowInsets.Type.systemBars());
return windowMetrics.getBounds().height() - insets.top - insets.bottom;
} else {
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
return displayMetrics.heightPixels;
}
}
Прежде всего, приложение должно быть ориентировано на версию SDK 24+. Если задано значение ниже 24 SDK, режим разделенного экрана не будет работать. Тогда внимательно читайте здесь и здесь
Если устройство находится в режиме разделенного экрана, система пытается создать новое действие рядом с действием, которое его запустило, поэтому эти два действия совместно используют экран. Системе не гарантируется возможность сделать это, но она делает действия смежными, если это возможно.
Этот флаг используется только в многооконном режиме с разделенным экраном. Новая активность будет отображаться рядом с той, которая ее запускает. Это можно использовать только в сочетании с FLAG_ACTIVITY_NEW_TASK. Кроме того, настройка FLAG_ACTIVITY_MULTIPLE_TASK необходима, если вы хотите создать новый экземпляр существующего действия.
Это означает, что вы не можете запустить режим разделенного экрана программно. Вы можете просто попробовать запустить действие в другой части экрана, если вы уже находитесь в режиме разделенного экрана.