Программно открытое приложение на разделенном экране

Как открыть другое приложение на разделенном экране в 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 необходима, если вы хотите создать новый экземпляр существующего действия.

Это означает, что вы не можете запустить режим разделенного экрана программно. Вы можете просто попробовать запустить действие в другой части экрана, если вы уже находитесь в режиме разделенного экрана.

Другие вопросы по тегам