Ç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örüntüleyin.

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 ekran göstermesini sağlamak için resizeabableActivity="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.

    • Platform, büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı) uygulama yapılandırmasından bağımsız olarak çoklu pencere modundaki tüm uygulamaları 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üksekliğe bakılmaksızın 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, içeriğe bir amaç üzerinden erişmesi gerekiyorsa içeriği bitişik bir bölünmüş ekran penceresinde açmak için FLAG_ACTIVITY_LAUNCH_ADJACENT öğesini 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ümler, bayrağın tanımını genişleterek tam ekran çalıştıran uygulamaların bölünmüş ekran modunu etkinleştirmesine ve ardından bitişikteki pencerede etkinlikleri başlatmasına olanak tanıdı.

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ıdır.

Ç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 değilse (ör. pencere içinde pencere modunda) 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 üst olarak kabul edilir ve RESUMED durumundaki tek etkinliktir. Diğer tüm görünür 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 koyduğunda, sistem bir yapılandırma değişikliği etkinliğini Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna getirdiğinde de gerçekleşir.

Esasen, bu değişikliğin etkinlik yaşam döngüsü üzerindeki etkileri, sisteme cihazın dikey yönden yatay yöne geçtiğinin sistem tarafından bildirilmesiyle aynıdır. Tek fark, uygulama boyutlarının 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 etkinlik mikrofon veya kamera gibi paylaşılan tekil bir kaynak kullandığı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 odaklanılan en önemli devam ettirilen uygulamayla etkileşimde bulunurken kamera önizlemesine devam etmek isteyebilirsiniz. Uygulamanızın devam ettirilen en önemli uygulama olmasa da kamerayı çalıştırmaya devam etmesi sorun yaratmaz, ancak bağlantı kesme kılıfını doğru bir şekilde yönetmesi gerekir. Devam ettirilen en üstteki 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ğırması aldıktan sonra kamera cihazında yapılan sonraki aramalar CameraAccessException hatası verir.

Çoklu Ekran

Android 10 (API düzeyi 29), ikincil ekranlarda 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 ekrana taşındığında bağlam güncellemesi, pencere yeniden boyutlandırma, yapılandırma ve kaynak değişiklikleri gibi işlemlerden geçebilir. 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ğe izin veriyorsa ikincil ekranda başlatmak, 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.

Ayrıca, Android 8.0'da kullanıma sunulan çoklu ekran API'leri hakkında bilgi edinmek de isteyebilirsiniz.

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 bilgiler edinebilirsiniz. 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ı kesik 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();

Ekran boyutu veya bir ekranın güvenli olup olmadığını gösteren işaretler gibi belirli bir ekran hakkında bilgi almak için Display sınıfını kullanın. Ancak, görüntü boyutunun uygulamanız için 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ızda android:supportsMultipleDisplays="true" bulunduğundan emin olun.

Şekil 5. Telefon ve ikincil ekranda 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, her ekran başına bir tane olmak üzere sistem süslemelerini destekleyen tüm ekranlarda 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 görüntüleme alanının WindowMetrics kadarını 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 destekleyip desteklemediğini ve destekleyip desteklemeyeceğ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'lar 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ı bozarsa 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 yanlış ise ve kullanıcı, etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tüm 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ı gösterir. 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, etkinliğin minimum genişliği ve yüksekliğine bakılmaksızın ç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. Daha sonra 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 çoklu pencere modunda nasıl davranacağını etkileyen çeşitli özellikleri destekler:

  • android:defaultHeight, android:defaultWidth: Masaüstü pencere modunda başlatıldığında etkinliğin varsayılan yüksekliği ve genişliği.

  • android:gravity: Masaüstü pencere modunda başlatıldığında etkinliğin 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 değerden 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

Sistem, Android 7.0'dan itibaren çoklu pencere modunda çalışabilen uygulamaları destekleyecek 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ğırmalar

Activity sınıfı, çoklu pencere modunu 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(): Etkinlik, pencere içinde pencere moduna geçtiğinde veya bu moddan çıktığında sistem bu yöntemi çağırır. Sistem, etkinlik pencere içinde pencere moduna giriyorsa yönteme true değerini, etkinlik pencere içinde pencere modundan çıkıyorsa false değerini iletir.

Fragment sınıfı, bu yöntemlerin çoğunun sürümlerini gösterir (ör. 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 daha düşük sürümlerde, görev yığını içinde bir etkinlik başlatırsanız etkinlik, ekrandaki etkinliğin yerini alır ve tüm çoklu pencere ö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 bir etkinlikten diğerine veri sürükleyip bırakabilir. (Android 7.0'dan önce kullanıcılar yalnızca tek bir etkinlik içinde 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. Kapsamlı sürükle ve bırak kılavuzu için Sürükleyip bırakma işlevini etkinleştirme bölümüne bakın.

Çoklu örnek

Her kök etkinliğinin, ayrı bir işlemde yürütülen ve 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şlatabilirsiniz. Yeni pencere için belirli bir konum istemek üzere bunu çoklu pencere özelliklerinden bazılarıyla birleştirebilirsiniz. Örneğin, bir alışveriş uygulamasında ürünleri karşılaştırmak için birden fazla pencere gösterilebilir.

Android 12 (API düzeyi 31), 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 android:resizeableActivity="true" değerini ayarladığından ve birden fazla örneği engelleyen bir başlatma modu kullanmadığından emin olun. Örneğin, bir singleInstancePerTask etkinliği FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında farklı görevlerde birden çok kez örneklenebilir.

Çok örnekliliği, tek bir pencerede çalışan SlidingPaneLayout kullanan liste ayrıntısı sunumu gibi çok panelli bir düzenle karıştırmayın.

Katlanabilir bir cihazda birden fazla örnek ayrı pencerelerde çalışırken cihazın duruşu değişirse bir veya daha fazla örneğin arka plana gönderilebileceğini unutmayın. Örneğin, bir cihazın açık olduğunu ve katlanmanın her iki yanında iki pencerede ç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ın API düzeyi 24 veya üstünü hedefleyip hedeflemediğine bakılmaksızın, kullanıcının Android 7.0 veya sonraki bir sürümü çalıştıran bir cihazda uygulamayı çok pencereli modda başlatmaya çalışması durumunda uygulamanızın çoklu pencere modunda nasıl davrandığını doğrulamanız gerekir.

Test cihazları

Android 7.0 (API düzeyi 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.

24 ile 30 arasındaki API düzeyleri

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 uygulamanın doğru ş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 kontrol 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.

  • 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ında bir sürüm ç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 önerilir * Not: Bağlantı metni JavaScript kapalıyken görüntülenir * Cihaz uyumluluk modu * Büyük ekranda yeniden boyutlandırılabilirliği destekleme * Yapılandırma değişikliklerini işleme