Çoklu pencere modunu destekleme

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasına olanak tanır. Uygulamalar yan yana veya üst üste (bölünmüş ekran modu) olabilir, küçük bir pencerede diğer uygulamaların üzerine binen bir uygulama (pencere içinde pencere modu) veya ayrı, taşınabilir, yeniden boyutlandırılabilir pencerelerde tek tek uygulamalar (masaüstü pencere modu) olabilir.

Şekil 1. Bölünmüş ekran modunda iki uygulamayı yan yana gösterin.

Telefonlarda bölünmüş ekran moduna erişmeyle ilgili kullanıcı talimatları için Pixel telefonda aynı anda iki uygulamayı görme başlıklı makaleyi inceleyin.

Sürüme özgü çoklu pencere özellikleri

Çoklu pencere kullanıcı deneyimi, Android sürümüne ve cihaz türüne bağlıdır:

  • Android 7.0 (API düzeyi 24), küçük ekranlı cihazlarda bölünmüş ekran modunu ve belirli cihazlarda pencere içinde pencere modunu kullanıma sundu.

    • Bölünmüş ekran modu, ekranı iki uygulamayla doldurur ve bunları yan yana veya üst üste gösterir. Kullanıcılar, iki uygulamayı ayıran böleni sürükleyerek bir uygulamayı daha büyük, diğerini daha küçük hale getirebilir.

    • Pencere içinde pencere modu, kullanıcıların başka bir uygulamayla etkileşimde bulunurken video oynatmaya devam etmesine olanak tanır (Pencere içinde pencere desteği bölümüne bakın).

    • Kullanıcıların her etkinliği özgürce yeniden boyutlandırabileceği masaüstü pencere modu, büyük ekranlı cihazların üreticileri tarafından etkinleştirilebilir.

      Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çoklu pencere modunu nasıl işlediğini yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekranda göstermesini sağlamak için resizeableActivity="false" ayarını yaparak uygulamanız için çoklu pencere modunu devre dışı bırakabilirsiniz.

  • Android 8.0 (API düzeyi 26), küçük ekranlı cihazlarda resim içinde resim modunu destekler.

  • Android 12 (API düzeyi 31), çoklu pencere modunu standart davranış haline getirir.

    • Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), platform uygulama yapılandırmasından bağımsız olarak tüm uygulamaları çoklu pencere modunda destekler. resizeableActivity="false" ise uygulama, görüntü boyutlarına uyum sağlamak için gerektiğinde uyumluluk moduna geçirilir.

    • Küçük ekranlarda (kompakt pencere boyutu sınıfı), sistem etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin minWidth ve minHeight değerlerini kontrol eder. resizeableActivity="false" ise minimum genişlik ve yükseklikten bağımsız olarak uygulamanın çoklu pencere modunda çalışması engellenir.

Bölünmüş ekran modu

Kullanıcılar aşağıdakileri yaparak bölünmüş ekran modunu etkinleştirebilir:

  1. Son kullanılanlar ekranını açın.
  2. Uygulamaları kaydırarak görüntüleme
  3. Uygulama başlık çubuğundaki uygulama simgesine basın
  4. Bölünmüş ekran menüsü seçeneğini belirleyin
  5. Son kullanılanlar ekranından başka bir uygulama seçin veya Son kullanılanlar ekranını kapatıp başka bir uygulama çalıştırın

Kullanıcılar, pencere ayırıcıyı ekranın kenarına (yukarı, aşağı, sola veya sağa) sürükleyerek bölünmüş ekran modundan çıkar.

Bitişik başlatma

Uygulamanızın bir intent aracılığıyla içeriğe erişmesi gerekiyorsa içeriği bitişik bir bölünmüş ekran penceresinde açmak için FLAG_ACTIVITY_LAUNCH_ADJACENT kullanabilirsiniz.

FLAG_ACTIVITY_LAUNCH_ADJACENT, bölünmüş ekran modunda çalışan uygulamaların yan pencerede etkinlik başlatmasını sağlamak için Android 7.0'da (API düzeyi 24) kullanıma sunulmuştur.

Android 12L (API düzeyi 32) ve sonraki sürümlerde, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirip ardından bitişik pencerede etkinlikleri başlatmasını sağlamak için işaretin tanımı genişletildi.

Bitişik bir etkinliği başlatmak için FLAG_ACTIVITY_NEW_TASK ile birlikte FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Örneğin:

Kotlin

fun openUrlInAdjacentWindow(url:
String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url)
addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK)
 }.also { intent -> startActivity(intent) } }

Java

public void openUrlInAdjacentWindow(String url) {
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setData(Uri.parse(url));
  intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK);
  startActivity(intent);
}

Çoklu pencere modunda etkinlik yaşam döngüsü

Çoklu pencere modu, etkinlik yaşam döngüsünü değiştirmez. Ancak birden fazla pencerede devam eden uygulamaların durumu, Android'in farklı sürümlerinde farklılık gösterir.

Çoklu devam ettirme

Android 10 (API düzeyi 29) ve sonraki sürümler çoklu devamı destekler. Cihaz çoklu pencere modundayken tüm etkinlikler RESUMED durumunda kalır. Bir etkinliğin üstünde şeffaf bir etkinlik varsa veya etkinlik odaklanılabilir durumda değilse (ör. etkinlik pencere içinde pencere modundaysa) etkinlik duraklatılabilir. Belirli bir zamanda hiçbir etkinliğin odakta olmaması da mümkündür (ör. bildirim çekmecesi açıksa). onStop() yöntemi her zamanki gibi çalışır: Bir etkinlik ekrandan kaldırıldığında yöntem çağrılır.

Çoklu devam özelliği, Android 9 (API düzeyi 28) yüklü belirli cihazlarda da kullanılabilir. Android 9 cihazlarda çoklu devam etmeyi etkinleştirmek için aşağıdaki manifest meta verilerini ekleyin:

<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />

Belirli bir cihazın bu manifest meta verilerini destekleyip desteklemediğini doğrulamak için cihaz özelliklerine bakın.

Android 9

Android 9 (API düzeyi 28) ve önceki sürümlerde çoklu pencere modunda, belirli bir zamanda yalnızca kullanıcının en son etkileşimde bulunduğu etkinlik etkindir. Bu etkinlik en üstte kabul edilir ve RESUMED durumundaki tek etkinliktir. Görünen diğer tüm etkinlikler STARTED olarak görünür ancak RESUMED değildir. Ancak sistem, görünür ancak devam ettirilmemiş bu etkinliklere görünmeyen etkinliklerden daha yüksek öncelik verir. Kullanıcı görünür etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve daha önce en üstte olan etkinlik STARTED durumuna girer.

Tek bir etkin uygulama sürecinde birden fazla etkinlik olduğunda, z-sıralı en yüksek olan etkinlik devam ettirilir ve diğerleri duraklatılır.

Yapılandırma değişiklikleri

Kullanıcı bir uygulamayı çoklu pencere moduna aldığında sistem, Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi yapılandırma değişikliği etkinliğini bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna geçirdiğinde de gerçekleşir.

Bu değişiklik, temel olarak sistemin uygulamaya cihazın dikeyden yatay yöne geçtiğini bildirmesiyle aynı etkinlik yaşam döngüsü etkilerine sahiptir. Tek fark, uygulama boyutlarının yalnızca değiştirilmesi yerine değiştirilmesidir. Etkinliğiniz yapılandırma değişikliğini kendi başına halledebilir veya uygulamanız, sistemin etkinliği yok etmesine ve yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırıyorsa ve pencereyi herhangi bir boyutta büyütüyorsa sistem, etkinliği kullanıcı işlemine uyacak şekilde yeniden boyutlandırır ve gerektiğinde yapılandırma değişiklikleri yapar. Uygulama, yeni ışığa maruz kalan alanları çizmede gecikirse sistem bu alanları geçici olarak windowBackground özelliği veya varsayılan windowBackgroundFallback stil özelliği tarafından belirtilen renkle doldurur.

Özel kaynak erişimi

Çoklu devam özelliğini desteklemek için onTopResumedActivityChanged() yaşam döngüsü geri çağırma işlevini kullanın.

Geri çağırma işlevi, bir etkinlik devam ettirilen en üst etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bu, bir etkinlikte mikrofon veya kamera gibi paylaşılan tekil bir kaynak kullanıldığında önemlidir:

Kotlin

override fun
onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top
resumed activity. // Can be a signal to re-acquire exclusive resources. } else {
// No longer the top resumed activity. } }

Java

@Override
public void onTopResumedActivityChanged(boolean topResumed) {
  if (topResumed) {
      // Top resumed activity.
      // Can be a signal to re-acquire exclusive resources.
  } else {
      // No longer the top resumed activity.
  }
}

Bir uygulamanın, paylaşılan bir donanım parçasının kaldırılması gibi başka nedenlerle de kaynak kaybedebileceğini unutmayın.

Her durumda, uygulama mevcut kaynakları etkileyen etkinlikleri ve durum değişikliklerini sorunsuz bir şekilde ele almalıdır.

Kamera kullanan uygulamalar için CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), kameraya erişmeye çalışmanın iyi bir zaman olabileceğine dair bir ipucu sağlar. Bu yöntem Android 10 (API düzeyi 29) sürümünden itibaren kullanılabilir.

Kamerayı kullanan diğer uygulamalar diğer ekranlarda açılabileceğinden, resizeableActivity=false'ün özel kamera erişimi garantisi olmadığını unutmayın.

Şekil 2. Çoklu pencere modunda kamera.

Uygulamanızın, odağı kaybettiğinde kamerayı bırakması gerekmez. Örneğin, kullanıcı yeni odaklanan en üstte devam eden uygulamayla etkileşimde bulunurken kamera önizlemesini devam ettirmek isteyebilirsiniz. Uygulamanızın, en üstte devam eden uygulama olmadığında kamerayı çalıştırmaya devam etmesi sorun değildir ancak bağlantının kesilmesi durumunu düzgün şekilde ele alması gerekir. Devam eden en üst uygulama kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulamanız, odağı tekrar aldığında kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() geri çağırma aldıktan sonra kamera cihazında yapılan sonraki aramalar CameraAccessException hatası verir.

Çoklu ekran

Android 10 (API düzeyi 29), ikincil ekranlardaki etkinlikleri destekler. Birden fazla ekrana sahip bir cihazda çalışan bir etkinliği kullanıcılar bir ekrandan diğerine taşıyabilir. Çoklu devam ettirme, çoklu ekran senaryoları için de geçerlidir. Birden fazla etkinlik aynı anda kullanıcı girişi alabilir.

Uygulamalar, başlatıldıklarında veya başka bir etkinlik oluşturduklarında hangi ekranda çalıştırılacaklarını belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan öğe tarafından ayarlanan intent işaretlerine ve seçeneklere bağlıdır. Daha fazla bilgi için ActivityOptions sınıfına bakın.

Bir etkinlik ikincil bir ekrana taşındığında bağlam güncellemesi, pencere boyutlandırması, yapılandırma ve kaynak değişiklikleri yapılabilir. Etkinlik yapılandırma değişikliğini yönetirse onConfigurationChanged() içinde etkinlik bilgilendirilir. Aksi takdirde etkinlik yeniden başlatılır.

Bir etkinlik, yapılandırma değişikliğini ele alıyorsa onCreate() ve onConfigurationChanged()'deki mevcut ekranı kontrol etmelidir. Ekran değiştiğinde kaynakları ve düzenleri güncellediğinizden emin olun.

Bir etkinlik için seçilen başlatma modu birden fazla örneğine izin veriyorsa ikincil bir ekranda başlatma, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.

Şekil 3. Birden fazla ekranda bir etkinliğin birden fazla örneği.

Android 8.0'da kullanıma sunulan çoklu ekran API'leri hakkında da bilgi edinebilirsiniz.

Etkinlik ve uygulama bağlamı

Çoklu ekranlarda doğru bağlamı kullanmak çok önemlidir. Kaynaklara erişirken etkinlik bağlamı (gösterilir) uygulama bağlamından (gösterilmez) farklıdır.

Etkinlik bağlamı, ekranla ilgili bilgileri içerir ve her zaman etkinliğin göründüğü ekran alanına göre ayarlanır. Bu sayede, uygulamanızın ekran yoğunluğu veya pencere metrikleri hakkında doğru bilgileri alabilirsiniz. Mevcut pencere veya ekran hakkında bilgi edinmek için her zaman etkinlik bağlamını (veya kullanıcı arayüzüne dayalı başka bir bağlamı) kullanmanız gerekir. Bu durum, bağlamdaki bilgileri kullanan bazı sistem API'lerini de etkiler (örneğin, Toast'lara genel bakış bölümüne bakın).

Etkinlik penceresi yapılandırması ve üst ekran, kaynakları ve bağlamı tanımlar. Mevcut ekranı aşağıdaki gibi alın:

Kotlin

val activityDisplay = activity.getDisplay()

Java

Display activityDisplay = activity.getDisplay();

Geçerli etkinlik aralığı metriklerini alın:

Kotlin

val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()

Java

WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();

Mevcut sistem yapılandırması için maksimum pencere metriklerini alın:

Kotlin

val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()

Java

WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();

Maksimum pencere metrikleri, hesaplama yapmak, düzen seçimleri yapmak veya önceden getirilecek kaynakların boyutunu belirlemek için kullanılır. Bu özelliği onCreate()'te kullanabilmeniz, ilk düzen geçişinden önce bu kararları vermenizi sağlar. Bu metrikler, belirli görüntüleme öğelerini yerleştirmek için kullanılmamalıdır. Bunun yerine Configuration nesnesinden alınan bilgileri kullanın.

Ekran kesimleri

Katlanabilir cihazların, katlanmış ve açılmış hallerinde farklı kesit geometrileri olabilir. Kesinti sorunlarını önlemek için Ekran kesimlerini destekleme başlıklı makaleyi inceleyin.

İkincil ekranlar

Kullanılabilir ekranları DisplayManager sistem hizmetinden alabilirsiniz:

Kotlin

val displayManager =
getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays =
displayManager.getDisplays()

Java

DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = displayManager.getDisplays();

Belirli bir ekranla ilgili bilgi edinmek için Display sınıfını kullanın. Örneğin, ekran boyutu veya ekranın güvenli olup olmadığını belirten işaretler. Ancak ekran boyutunun, uygulamanıza ayrılan görüntüleme alanıyla aynı olacağını varsaymayın. Çoklu pencere modunda uygulamanızın ekranın bir bölümünü kapladığını unutmayın.

Bir etkinliğin ekranda başlatılıp başlatılamayacağını belirleme:

Kotlin

val activityManager =
getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val
activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context,
displayId, intent)

Java

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);

Ardından, etkinliği ekranda başlatın:

Kotlin

val options = ActivityOptions.makeBasic()
options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent,
options.toBundle())

Java

ActivityOptions options = ActivityOptions.makeBasic();
options.setLaunchDisplayId(targetDisplay.displayId);
startActivity(intent, options.toBundle());

Çoklu ekran desteği

Android, yazılım klavyeleri, duvar kağıtları ve başlatıcılar için çoklu ekran desteği sağlar.

Yazılım klavyesi

Ekran, sistem süslemelerini destekleyecek şekilde yapılandırılmışsa ikincil ekranda klavye gösterilebilir. Bir metin alanı o ekranda giriş isterse giriş yöntemi düzenleyici otomatik olarak görünür.

Şekil 4. İkincil ekranda klavye.

Duvar kağıdı

Android 10'da (API düzeyi 29) ikincil ekranlarda duvar kağıdı olabilir. Çerçeve, her ekran için ayrı bir WallpaperService.Engine örneği oluşturur. Her motorun yüzeyinin ayrı ayrı çizildiğinden emin olun. Geliştiriciler, WallpaperService.Engine#getDisplayContext()'teki görüntüleme bağlamını kullanarak öğeleri yükleyebilir. Ayrıca, WallpaperInfo.xml dosyanızı android:supportsMultipleDisplays="true" olarak ayarlayın.

Şekil 5. Telefon ve ikincil ekrandaki duvar kağıdı.

Launcher'lar

Yeni bir intent filtresi kategorisi olan SECONDARY_HOME, ikincil ekranlar için özel bir etkinlik sağlar. Etkinliğin örnekleri, sistem süslemelerini destekleyen tüm ekranlarda (her ekran için bir tane) kullanılır.

<activity>
    ...
    <intent-filter>
        <category android:name="android.intent.category.SECONDARY_HOME" />
        ...
    </intent-filter>
</activity>

Etkinliğin, birden fazla örneği engellemeyen ve farklı ekran boyutlarına uyum sağlayabilen bir başlatma modu olmalıdır. Başlatma modu singleInstance veya singleTask olamaz.

Örneğin, Launcher3 için AOSP uygulaması SECONDARY_HOME etkinliğini destekler.

Şekil 6. Telefonda Materyal Tasarım başlatıcısı.
Şekil 7. İkincil ekranda Materyal Tasarım başlatıcısı.

Aralık metrikleri

Android 11 (API düzeyi 30), çoklu pencere modunda çalışan uygulamaların sınırlarını sağlamak için aşağıdaki WindowManager yöntemlerini kullanıma sundu:

Jetpack WindowManager kitaplık yöntemleri computeCurrentWindowMetrics() ve computeMaximumWindowMetrics() sırasıyla benzer işlevler sunar ancak API düzeyi 14 ile geriye dönük uyumludur.

Mevcut ekran dışındaki ekranlarla ilgili metrikler elde etmek için aşağıdakileri yapın (kod snippet'inde gösterildiği gibi):

  • Görüntülü reklam bağlamı oluşturma
  • Görüntüleme için bir pencere bağlamı oluşturma
  • Pencere bağlamının WindowManager değerini alma
  • Uygulamanın kullanabileceği maksimum ekran alanının WindowMetrics değerini alın

Kotlin

val windowMetrics =
context.createDisplayContext(display)
.createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
.getSystemService(WindowManager::class.java) .maximumWindowMetrics

Java

WindowMetrics windowMetrics = context.createDisplayContext(display)
                            .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null)
                            .getSystemService(WindowManager.class)
                            .getMaximumWindowMetrics();

Kullanımdan kaldırılan yöntemler

Display yöntemleri getSize() ve getMetrics(), API 30 seviyesinde yeni WindowManager yöntemleri lehine kullanımdan kaldırıldı.

Android 12 (API düzeyi 31), Display yöntemleri getRealSize() ve getRealMetrics() için desteği sonlandırıyor ve bu yöntemlerin davranışını getMaximumWindowMetrics()'ın davranışına daha yakın olacak şekilde güncelliyor.

Çoklu pencere modu yapılandırması

Uygulamanız Android 7.0 (API düzeyi 24) veya sonraki sürümleri hedefliyorsa uygulamanızın etkinliklerinin çoklu pencere modunu nasıl ve ne ölçüde destekleyeceğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda özellikler ayarlayabilirsiniz. Kök etkinliğin özellik ayarları, görev yığınındaki tüm etkinlikler için geçerlidir. Örneğin, kök etkinlikte android:resizeableActivity="true" varsa görev yığınındaki tüm etkinlikler yeniden boyutlandırılabilir. Chromebook gibi daha büyük bazı cihazlarda, android:resizeableActivity="false" belirtseniz bile uygulamanız yeniden boyutlandırılabilir bir pencerede çalışabilir. Bu durum uygulamanızın çalışmamasına neden oluyorsa uygulamanızın bu tür cihazlarda kullanılabilirliğini kısıtlamak için Google Play'deki filtreleri kullanabilirsiniz.

Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere modunu kullanır. Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), tüm uygulamalar uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Küçük ekranlarda sistem, etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin minWidth, minHeight ve resizeableActivity ayarlarını kontrol eder.

resizeableActivity

API düzeyi 30 ve altı için çoklu pencere modunu etkinleştirmek veya devre dışı bırakmak üzere manifest'inizin <activity> veya <application> öğesinde bu özelliği ayarlayın:

<application
  android:name=".MyActivity"
  android:resizeableActivity=["true" | "false"] />;

Bu özellik true olarak ayarlanırsa etkinlik bölünmüş ekran ve masaüstü pencere modlarında başlatılabilir. Özellik false olarak ayarlanırsa etkinlik çoklu pencere modunu desteklemez. Değer false ise ve kullanıcı etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tam ekranı devralır.

Uygulamanız API düzeyi 24 veya üstünü hedefliyorsa ancak bu özellik için bir değer belirtmezseniz özelliğin değeri varsayılan olarak true olur.

Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa bu özellik küçük ve büyük ekranlarda farklı şekilde çalışır:

  • Büyük ekranlar (orta veya genişletilmiş pencere boyutu sınıfı): Tüm uygulamalar çoklu pencere modunu destekler. Bu özellik, bir etkinliğin yeniden boyutlandırılıp boyutlandırılamayacağını belirtir. resizeableActivity="false" ise uygulama, ekran boyutlarına uymak için gerektiğinde uyumluluk moduna geçirilir.
  • Küçük ekranlar (kompakt pencere boyutu sınıfı): resizeableActivity="true" ve etkinliğin minimum genişliği ve minimum yüksekliği çoklu pencere koşullarını karşılıyorsa etkinlik çoklu pencere modunu destekler. resizeableActivity="false" ise etkinlik minimum genişliği ve yüksekliğinden bağımsız olarak çoklu pencere modunu desteklemez.

supportsPictureInPicture

Etkinliğin pencere içinde pencere modunu destekleyip desteklemediğini belirtmek için bu özelliği manifest'inizin <activity> düğümünde ayarlayın.

<activity
  android:name=".MyActivity"
  android:supportsPictureInPicture=["true" | "false"] />

configChanges

Kullanıcı bir pencereyi yeniden boyutlandırdığında olduğu gibi çoklu pencere yapılandırma değişikliklerini kendiniz işlemek için uygulama manifest'inizin <activity> düğümüne en az aşağıdaki değerlerle android:configChanges özelliğini ekleyin:

<activity
  android:name=".MyActivity"
  android:configChanges="screenSize | smallestScreenSize
      | screenLayout | orientation" />

android:configChanges eklendikten sonra etkinliğiniz ve parçalarınız, silinip yeniden oluşturulmak yerine onConfigurationChanged() için geri çağırma alır. Ardından görünümlerinizi manuel olarak güncelleyebilir, kaynakları yeniden yükleyebilir ve gerektiğinde diğer işlemleri gerçekleştirebilirsiniz.

<layout>

Android 7.0 (API düzeyi 24) ve sonraki sürümlerde <layout> manifest öğesi, bir etkinliğin çok pencereli modda nasıl davrandığını etkileyen çeşitli özellikleri destekler:

  • android:defaultHeight, android:defaultWidth: Etkinlik, masaüstü pencere modunda başlatıldığında varsayılan yükseklik ve genişlik.

  • android:gravity: Etkinliğin masaüstü pencere modunda başlatılırken ilk yerleşimi. Uygun değerler için Gravity sınıfına bakın.

  • android:minHeight, android:minWidth: Hem bölünmüş ekran hem de masaüstü pencere modlarında etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bölünmüş ekran modunda ayırıcıyı hareket ettirerek bir etkinliği belirtilen minimum boyuttan daha küçük hale getirirse sistem, etkinliği kullanıcının istediği boyuta kırpar.

Aşağıdaki kodda, bir etkinliğin varsayılan boyutu ve konumu ile etkinliğin masaüstü pencere modunda gösterildiğindeki minimum boyutu nasıl belirtileceği gösterilmektedir:

<activity android:name=".MyActivity">
    <layout android:defaultHeight="500dp"
          android:defaultWidth="600dp"
          android:gravity="top|end|..."
          android:minHeight="450dp"
          android:minWidth="300dp" />
</activity>

Çalışma zamanında çoklu pencere modu

Android 7.0'dan itibaren sistem, çoklu pencere modunda çalışabilen uygulamaları destekleyen işlevler sunar.

Çoklu pencere modunda devre dışı bırakılan özellikler

Android, çoklu pencere modunda cihaz ekranını diğer etkinliklerle veya uygulamalarla paylaşan bir etkinliğe uygulanmayan özellikleri devre dışı bırakabilir ya da yoksayabilir.

Ayrıca, bazı sistem kullanıcı arayüzü özelleştirme seçenekleri devre dışı bırakılır. Örneğin, çoklu pencere modunda çalışan uygulamalar durum çubuğunu gizleyemez (Sistem kullanıcı arayüzü görünürlüğünü kontrol etme bölümüne bakın).

Sistem, android:screenOrientation özelliğindeki değişiklikleri yoksayar.

Çoklu pencere modu sorguları ve geri çağırma işlevleri

Activity sınıfı, çok pencereli modu desteklemek için aşağıdaki yöntemleri sunar:

  • isInMultiWindowMode(): Etkinliğin çok pencereli modda olup olmadığını belirtir.

  • isInPictureInPictureMode(): Etkinliğin pencere içinde pencere modunda olup olmadığını belirtir.

  • onMultiWindowModeChanged(): Sistem, etkinlik çoklu pencere moduna girdiğinde veya bu moddan çıktığında bu yöntemi çağırır. Sistem, etkinlik çoklu pencere moduna giriyorsa yönteme true değerini, etkinlik çoklu pencere modundan çıkıyorsa false değerini iletir.

  • onPictureInPictureModeChanged(): Sistem, etkinlik pencere içinde pencere moduna girdiğinde veya bu moddan çıktığında bu yöntemi çağırır. Sistem, etkinlik pencere içinde pencere moduna giriyorsa yönteme doğru değerini, etkinlik pencere içinde pencere modundan çıkıyorsa yanlış değerini iletir.

Fragment sınıfı, bu yöntemlerin çoğunun sürümlerini gösterir. Örneğin, Fragment.onMultiWindowModeChanged().

Pencere içinde pencere modu

Bir etkinliği pencere içinde pencere moduna almak için enterPictureInPictureMode() yöntemini çağırın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin hiçbir etkisi olmaz. Daha fazla bilgi için Bilinmeyen bir dilde yayınlanan videoları altyazılarla izleme başlıklı makaleyi inceleyin.

Çoklu pencere modunda yeni etkinlikler

Yeni bir etkinlik başlattığınızda, yeni etkinliğin mümkünse mevcut etkinliğin yanında gösterilmesi gerektiğini belirtebilirsiniz. Sisteme yeni etkinliği bitişik bir pencerede oluşturmaya çalışmasını söyleyen intent işaretçisini FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Böylece iki etkinlik ekranı paylaşır. Sistem bunu yapmak için elinden geleni yapar ancak bu işlemin gerçekleşeceği garanti edilmez.

Bir cihaz masaüstü pencere modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds() çağrısını yaparak yeni etkinliğin boyutlarını ve ekran konumunu belirtebilirsiniz. Cihaz çoklu pencere modunda değilse yöntemin hiçbir etkisi olmaz.

API düzeyi 30 ve altında, bir görev yığınında etkinlik başlatırsanız etkinlik, ekrandaki etkinliğin yerini alır ve tüm çok pencereli özelliklerini devralır. Yeni etkinliği çoklu pencere modunda ayrı bir pencere olarak başlatmak istiyorsanız yeni bir görev yığınında başlatmanız gerekir.

Android 12 (API düzeyi 31), uygulamaların bir uygulamanın görev penceresini birden fazla etkinlik arasında bölmelerine olanak tanır. Bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak uygulamanızın etkinliklerini nasıl (tam ekran, yan yana veya yığılmış) göstereceğini siz belirlersiniz.

Sürükleme ve bırakma

Kullanıcılar, iki etkinlik ekranı paylaşırken verileri bir etkinlikten diğerine sürükleyip bırakabilir. (Android 7.0'dan önce kullanıcılar yalnızca tek bir etkinlikte veri sürükleyip bırakabiliyordu.) Bırakılan içeriği kabul etme desteğini hızlıca eklemek için DropHelper API'sini inceleyin. Sürükle ve bırak işleviyle ilgili kapsamlı bilgi için Sürükle ve bırak işlevini etkinleştirme başlıklı makaleyi inceleyin.

Çoklu örnek

Her kök etkinliğin kendi penceresinde gösterilen kendi görevi vardır. Uygulamanızın yeni bir örneğini ayrı bir pencerede başlatmak için FLAG_ACTIVITY_NEW_TASK işaretiyle yeni etkinlikler başlatın. Yeni pencere için belirli bir konum istemek üzere bu ayarı çoklu pencere özellikleri ile birleştirebilirsiniz. Örneğin, bir alışveriş uygulaması, ürünleri karşılaştırmak için birden fazla bitişik pencere gösterebilir.

Android 12 (API düzeyi 31) ve sonraki sürümler, etkinlik yerleştirme özelliğinde bir etkinliğin iki örneğini aynı görev penceresinde yan yana başlatmanıza olanak tanır.

Kullanıcıların uygulama başlatıcıdan veya görev çubuğundan uygulamanızın başka bir örneğini başlatmasına izin vermek istiyorsanız başlatıcı etkinliğinizin manifest dosyasında android:resizeableActivity="true" değerini ayarlayın ve birden fazla örneği engelleyen bir başlatma modu kullanmayın. Örneğin, FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında bir singleInstancePerTask etkinliği farklı görevlerde birden çok kez oluşturulabilir.

Android 15 (API düzeyi 35) ve sonraki sürümlerde PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI, çoklu örnek için destek beyan etmenizi sağlar. Mülk, sistem kullanıcı arayüzünün uygulamanın birden fazla örneğini oluşturmak için kullanıcıya kontroller göstermesi için açık bir sinyaldir. Mülk, başlatma modundan bağımsızdır ancak yalnızca bir etkinliğin veya uygulamanın başlatma modu mülkle uyumlu olduğunda (ör. başlatma modu singleInstance olmadığında) kullanılmalıdır.

Katlanabilir bir cihazda bir uygulamanın birden fazla örneği ayrı pencerelerde çalışıyorsa cihazın duruşu değişirse bir veya daha fazla örnek arka plana gönderilebilir. Örneğin, katlanmış bir cihazın katlama noktasının her iki tarafında ayrı pencerelerde çalışan iki uygulama örneği olduğunu varsayalım. Cihaz katlanmışsa her iki örneğin pencerelerini daha küçük bir ekrana sığdırmaya çalışmak yerine örneklerden biri sonlandırılabilir.

Çoklu pencere modu doğrulaması

Uygulamanız API düzeyi 24 veya üstünü hedeflese de hedeflemese de kullanıcının Android 7.0 veya sonraki bir sürüm çalıştıran bir cihazda uygulamanızı çoklu pencere modunda başlatmaya çalışması ihtimaline karşı uygulamanızın çoklu pencere modunda nasıl davrandığını doğrulamanız gerekir.

Test cihazları

Android 7.0 (API seviyesi 24) veya sonraki sürümleri çalıştıran cihazlar çoklu pencere modunu destekler.

API düzeyi 23 veya daha düşük

Kullanıcılar uygulamayı çoklu pencere modunda kullanmaya çalıştıklarında, uygulama sabit bir yönü belirtmediği sürece sistem uygulamayı zorla yeniden boyutlandırır.

Uygulamanız sabit bir yönü belirtmiyorsa uygulamanızı Android 7.0 veya sonraki bir sürümü çalıştıran bir cihazda başlatıp uygulamayı bölünmüş ekran moduna getirmeyi denemelisiniz. Uygulama zorla yeniden boyutlandırıldığında kullanıcı deneyiminin kabul edilebilir olup olmadığını doğrulayın.

Uygulama sabit bir yönü belirtiyorsa uygulamayı çoklu pencere moduna geçirmeyi denemelisiniz. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.

API düzeyleri 24 ila 30

Uygulamanız API düzeyleri 24 ila 30'u hedefliyorsa ve çoklu pencere desteğini devre dışı bırakmıyorsa hem bölünmüş ekran hem de masaüstü pencere modlarında aşağıdaki davranışı doğrulayın:

  • Uygulamayı tam ekranda başlatın, ardından Sonlar düğmesine uzun basarak çoklu pencere moduna geçin. Uygulamanın düzgün şekilde geçiş yaptığını doğrulayın.

  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve düzgün şekilde başlatıldığını doğrulayın. Son Kullanılanlar düğmesine basıp uygulamanızın başlık çubuğuna uzun basarak ve ekrandaki vurgulanan alanlardan birine sürükleyerek uygulamayı çoklu pencere modunda başlatabilirsiniz.

  • Bölünmüş ekran modunda ekran ayırıcıyı sürükleyerek uygulamanızın boyutunu değiştirin. Uygulamanın kilitlenmeden yeniden boyutlandırıldığını ve gerekli kullanıcı arayüzü öğelerinin görünür olduğunu doğrulayın.

  • Uygulamanız için minimum boyutlar belirttiyseniz uygulamayı, pencere boyutu bu boyutlardan daha küçük olacak şekilde yeniden boyutlandırmayı deneyin. Uygulamayı belirtilen minimum boyutlardan daha küçük olacak şekilde yeniden boyutlandıramadığınızı doğrulayın.

  • Tüm testler boyunca uygulamanızın performansının kabul edilebilir olduğunu doğrulayın. Örneğin, uygulama yeniden boyutlandırıldıktan sonra kullanıcı arayüzünün güncellenmesi için çok uzun bir gecikme olmadığını doğrulayın.

API düzeyi 31 veya sonraki sürümler

Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa ve ana etkinliğin minimum genişliği ile minimum yüksekliği, kullanılabilir ekran alanının ilgili boyutlarından küçük veya bu boyutlara eşitse API düzeyleri 24 ila 30 için listelenen tüm davranışları doğrulayın.

Test yapılacaklar listesi

Uygulamanızın çoklu pencere modundaki performansını doğrulamak için aşağıdaki işlemleri deneyin. Aksi belirtilmediği sürece bu işlemleri hem bölünmüş ekran hem de masaüstü pencere modunda denemeniz gerekir.

  • Çoklu pencere moduna girip çıkabilirsiniz.

  • Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür ancak etkin değilken düzgün davrandığını doğrulayın. Örneğin, uygulamanızda video oynatılıyorsa kullanıcı başka bir uygulamayla etkileşimde bulunurken videonun oynatılmaya devam ettiğini doğrulayın.

  • Bölünmüş ekran modunda, uygulamanızı hem daha büyük hem de daha küçük yapmak için ekran ayırıcıyı hareket ettirmeyi deneyin. Bu işlemleri hem yan yana hem de diğer yapılandırmaların üzerinde deneyin. Uygulamanın kilitlenmediğinden, temel işlevlerin görünür olduğundan ve yeniden boyutlandırma işleminin çok uzun sürmediğinden emin olun.

  • Hızlı bir şekilde art arda birkaç yeniden boyutlandırma işlemi gerçekleştirin. Uygulamanızın kilitlenmediğini veya bellek sızıntısı olmadığını doğrulayın. Android Studio'nun Bellek Profilleyicisi, uygulamanızın bellek kullanımı hakkında bilgi sağlar (Bellek Profilleyici ile uygulamanızın bellek kullanımını inceleme başlıklı makaleyi inceleyin).

  • Uygulamanızı çeşitli pencere yapılandırmalarında normal şekilde kullanın ve uygulamanın düzgün şekilde davranıp davranmadığını doğrulayın. Metnin okunabilir ve kullanıcı arayüzü öğelerinin etkileşim kurulamayacak kadar küçük olmadığından emin olun.

Çoklu pencere desteği devre dışı bırakıldı

24 ile 30 arasındaki API düzeylerinde android:resizeableActivity="false" ayarını yaparak çoklu pencere desteğini devre dışı bıraktıysanız uygulamanızı Android 7.0 ile 11 arasındaki sürümleri çalıştıran bir cihazda başlatmalı ve uygulamayı bölünmüş ekran ve masaüstü pencere modlarına yerleştirmeye çalışmalısınız. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.

Ek kaynaklar

Android'de çoklu pencere desteği hakkında daha fazla bilgi için:

Sizin için önerilenler * Not: JavaScript kapalıyken bağlantı metni gösterilir * Cihaz uyumluluk modu * Büyük ekranda yeniden boyutlandırmayı destekleme * Yapılandırma değişikliklerini işleme