Çoklu pencere desteği

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı eş zamanlı olarak paylaşmasına olanak tanır. Uygulamalar yan yana veya birbirinin üzerinde (bölünmüş ekran modu), küçük bir pencerede diğer uygulamalarla yer paylaşımlı olarak bir uygulama (pencere içinde pencere modu) veya ayrı ayrı taşınabilir, yeniden boyutlandırılabilir pencerelerde (serbest biçim modu) yer alabilir.

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

Kullanıcı deneyimi, Android OS sürümüne ve cihazın 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 sunuyor.

    Bölünmüş ekran modu, ekranı iki uygulama ile doldurarak uygulamaları yan yana veya üst üste gösterir. Kullanıcılar, birini büyütüp diğerini küçültmek için iki uygulamayı birbirinden ayıran ayırıcıyı sürükleyebilir.

    Pencere içinde pencere modu, kullanıcıların başka bir uygulamayla etkileşimde bulunurken videoyu oynatmaya devam etmesine olanak tanır (bkz. Pencere içinde pencere desteği).

    Büyük ekranlı cihazların üreticileri, kullanıcıların her bir etkinliği serbestçe yeniden boyutlandırabildiği serbest biçim modunu etkinleştirebilir.

    Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çoklu pencere modunu nasıl kullanacağını yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekran 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), pencere içinde pencere modunu küçük ekranlı cihazları da kapsayacak şekilde genişletir.
  • Android 12 (API düzeyi 31), çoklu pencere modunu standart davranış haline getirir.

    Büyük ekranlarda (sw >= 600 dp) platform, uygulama yapılandırmasından bağımsız olarak çoklu pencere modundaki tüm uygulamaları destekler. resizeableActivity="false" ise ekran boyutlarının yerleştirilmesi için gerektiğinde uygulama uyumluluk moduna alınır.

    Küçük ekranlarda (sw < 600 dp) sistem, etkinliğin birden fazla pencere modunda çalıştırılıp çalıştırılamayacağını belirlemek iç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.

    Not: Cihaz üreticileri bu davranışları geçersiz kılabilir.

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. Görünüme uygulama kaydırın
  3. Uygulamanın başlık çubuğunda uygulama simgesine basın
  4. Bölünmüş ekran menü seçeneğini belirleme
  5. Son Kullanılanlar ekranından başka bir uygulama seçin veya Son uygulamalar 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ı veya aşağı, sola veya sağa) sürükleyerek bölünmüş ekran modundan çıkabilir.

Bitişikte başlat

Uygulamanızın içeriğe bir niyetle 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 bitişik pencerede etkinlik başlatabilmesi için Android 7.0 (API düzeyi 24) sürümünde kullanıma sunulmuştur.

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

Bitişik bir etkinliği başlatmak için FLAG_ACTIVITY_LAUNCH_ADJACENT ile birlikte FLAG_ACTIVITY_NEW_TASK 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 penceredeki uygulamaların devam ettirilen 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 ettirmeyi destekler. Cihaz çoklu pencere modundayken tüm etkinlikler RESUMED durumunda kalır. Şeffaf bir etkinlik etkinliğin üzerindeyse veya etkinlik odaklanılamıyorsa pencere içinde pencere modu gibi etkinlikler duraklatılabilir. Belirli bir zamanda hiçbir etkinliğe odaklanılmamış olabilir (örneğin, bildirim çekmecesi açıksa). onStop yöntemi her zamanki gibi çalışır. Yöntem, bir etkinlik ekrandan her kaldırıldığında çağrılır.

Çoklu devam ettirme, Android 9 (API düzeyi 28) sürümünü çalıştıran belirli cihazlarda da kullanılabilir. Android 9 cihazlarda çoklu devam ettirmeyi 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 desteklediğ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 başarılı kabul edilir ve RESUMED durumundaki tek etkinliktir. Gösterilen diğer tüm etkinlikler STARTED şeklindedir, ancak RESUMED değildir. Bununla birlikte, sistem bu görünür ancak devam ettirilmeyen etkinliklere görünür olmayan etkinliklerden daha yüksek öncelik verir. Kullanıcı görünür etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve önceki en başarılı etkinlik STARTED durumuna geçer.

Tek bir etkin uygulama işleminde birden fazla etkinlik olduğunda, en yüksek z sırasına sahip olan etkinlik devam ettirilir ve diğer etkinlikler duraklatılır.

Not: Android 9 ve önceki sürümlerde çoklu pencere modunda, kullanıcı tarafından görülebilse bile bir uygulama RESUMED durumunda olmayabilir ancak uygulamanın en üstte değilken çalışmasına devam etmesi gerekebilir. Örneğin, bu durumdaki bir video uygulaması videosunu oynatmaya devam etmelidir. Bu nedenle, videoyu oynatan etkinliklerin ON_PAUSE yaşam döngüsü etkinliğine yanıt olarak video oynatmayı duraklatmamasını öneririz. Bunun yerine, etkinlik ON_START komutuna yanıt olarak oynatmaya başlamalı ve ON_STOP komutuna göre oynatma duraklatılmalıdır. Yaşam döngüsü paketini kullanmak yerine yaşam döngüsü olaylarını doğrudan ele alıyorsanız video oynatmayı onStop() işleyicinizde duraklatın ve onStart() içinde oynatmaya devam edin.

Yapılandırma değişiklikleri

Kullanıcı bir uygulamayı çoklu pencere moduna aldığında sistem, İşleme yönelik yapılandırma değişikliklerini bölümünde belirtildiği gibi bir yapılandırma değişikliği etkinliğiyle ilgili bildirimde bulunur. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna aldığında da olur.

Temel olarak bu değişikliğin etkinlik yaşam döngüsüyle ilgili etkileri, uygulamaya cihazın dikey yönden yatay yöne geçiş yaptığını bildirmesiyle aynıdır. Tek fark, cihaz boyutlarının değiştirilmesi yerine değiştirilmesidir. Yapılandırma değişikliklerini işleme bölümünde açıklandığı gibi, etkinliğiniz yapılandırma değişikliğini gerçekleştirebilir veya sistemin etkinliği kaldırıp yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırıyorsa ve pencereyi her iki boyutta da büyütürse sistem, etkinliği kullanıcı işlemiyle eşleşecek şekilde yeniden boyutlandırır ve gerektiği şekilde yapılandırma değişiklikleri yapar. Uygulama, yeni açığa çıkan alanlarda çizim yapma konusunda geride kalırsa sistem bu alanları geçici olarak windowBackground veya varsayılan windowBackgroundFallback stil özelliğiyle belirtilen renkle doldurur.

Özel kaynak erişimi

Çoklu devam ettirme özelliğinin desteklenmesi için yeni bir yaşam döngüsü geri çağırması (onTopResumedActivityChanged()) vardır.

Bu yöntem, bir etkinlik devam ettirilen en üstteki etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bir etkinliğin mikrofon veya kamera gibi paylaşılan bir tekil kaynak kullandığını bilmek ö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ın kaldırılması gibi başka nedenlerle kaynaklarını 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 uygulamalarda CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), kameraya erişmeyi denemek için iyi bir zaman olabileceğine dair ipucu verir. Bu yöntem, Android 10 (API düzeyi 29) ve sonraki sürümlerde kullanılabilir.

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

Kamera çoklu pencere modunda.

2. Şekil. Kamera çoklu pencere modunda.

Odağı kaybolduğunda uygulamanızın kamerayı bırakması gerekmez. Örneğin, kullanıcı yeni odaklanılan en üstte devam ettirilen uygulama ile etkileşimde bulunurken kamera önizlemesine devam etmek isteyebilirsiniz. En üstteki devam ettirilen uygulama olmadığı halde uygulamanızın kamerayı çalıştırmaya devam etmesi sorun yaratmaz, ancak bağlantı kesilen kılıfı düzgün bir şekilde işlemesi gerekir. En üstte devam ettirilen uygulama, kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulamanız, odağı tekrar yeniden aldığında kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() araması aldıktan sonra, kamera cihazından yapılan sonraki çağrılarda CameraAccessException simgesi belirir.

Çoklu Ekran

Android 10 (API düzeyi 29), ikincil ekranlarda etkinlikleri destekler. Bir etkinlik birden fazla ekranı olan bir cihazda çalışıyorsa kullanıcılar bu etkinliği bir ekrandan diğerine taşıyabilir. Çoklu devam ettirme çok ekranlı senaryolar için de geçerlidir. Aynı anda birkaç etkinlik kullanıcı girişi alabilir.

Bir uygulama, başlatıldığında veya başka bir etkinlik oluşturduğunda hangi ekranda çalışması gerektiğini belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan varlık tarafından ayarlanan amaç bayraklarına ve seçeneklere bağlıdır. Daha fazla bilgi için ActivityOptions sayfasını inceleyin.

Bir etkinlik ikincil ekrana taşındığında bağlam güncellemesi, pencere yeniden boyutlandırma, yapılandırma ve kaynak değişikliklerinden geçebilir. Yapılandırma değişikliğini etkinlik gerçekleştirirse etkinlik onConfigurationChanged() içinde bildirilir; aksi halde, etkinlik yeniden başlatılır.

Bir etkinlik, yapılandırma değişikliği gerçekleştiriliyorsa onCreate ve onConfigurationChanged alanlarındaki 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 bir ekranda başlatma işlemi etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilecek.

Bir etkinliğin birden fazla ekranda birden çok örneği.

3. Şekil. Bir etkinliğin birden fazla ekranda birden çok örneği.

Ayrıca, Android 8.0'da kullanıma sunulan çok ekranlı API'ler hakkında bilgi edinmek isteyebilirsiniz.

Etkinlik ve uygulama bağlamı

Doğru bağlamı kullanmak, çoklu görüntülü reklamlarda çok önemlidir. Kaynaklara erişirken, etkinlik bağlamı (gösterilen) uygulama bağlamından (değil) farklıdır.

Etkinlik bağlamı, ekran hakkında bilgiler içerir ve her zaman etkinliğin göründüğü görüntüleme alanına göre ayarlanır. Böylece uygulamanızın şu anda sahip olduğu görüntü yoğunluğu veya pencere metrikleri hakkında doğru bilgileri edinebilirsiniz. Geçerli pencere veya ekran hakkında bilgi almak için her zaman etkinlik bağlamını (veya kullanıcı arayüzü tabanlı başka bir bağlamı) kullanıyor olmanız gerekir. Bu durum, bağlamdaki bilgileri kullanan bazı sistem API'lerini de etkiler (örneğin, Bildirim dokümanlarına genel bakış).

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();

Mevcut etkinlik aralığı metriklerini alma:

Kotlin

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

Java

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

Geçerli sistem yapılandırması için maksimum aralık metriklerini alın:

Kotlin

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

Java

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

Maksimum aralık metrikleri; hesaplamalar yapmak, düzen seçimleri yapmak veya önceden getirilecek kaynak boyutunu belirlemek içindir. onCreate() ürününde bu bilginin kullanılabilir olması, bu kararları ilk düzen geçilmeden önce almanızı sağlar. Bu metrikler, belirli görünüm öğelerini düzenlemek için kullanılmamalıdır. Bunun yerine, Configuration nesnesindeki bilgileri kullanın.

Ekran kesimleri

Katlanabilir cihazlar katlandığında ve açıldığında farklı bir kesim geometrisine sahip olabilir. Kesme sorunlarını önlemek için Ekran kesimi desteği için en iyi uygulamalar konusunu okuyun.

İ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 ekran hakkında, ekran boyutu veya ekranın güvenli olup olmadığını belirten işaretler gibi bilgileri almak için Display sınıfını kullanın. Bununla birlikte, görüntü 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 kısmını kapladığını unutmayın.

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

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 ekranda etkinliği 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 bir ekranda klavye gösterilebilir. Bir metin alanı ilgili ekranda giriş isterse giriş yöntemi düzenleyicisi otomatik olarak görünür.

Klavye ikincil ekranda gösteriliyor.

4. Şekil. Klavye ikincil ekranda gösteriliyor.

Duvar kağıdı

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

Telefondaki ve ikincil ekranda duvar kağıdı.

5.Şekil Telefondaki ve ikincil ekranda duvar kağıdı.

Launcher'lar

Yeni bir amaç filtresi kategorisi olan SECONDARY_HOME, ikincil ekranlar için özel bir etkinlik sağlar. Etkinlik örnekleri, sistem süslemelerini destekleyen tüm ekranlarda her ekran başına bir tane olacak şekilde kullanılır.

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

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

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

Telefondaki Materyal Tasarım başlatıcı.

6.Şekil Telefondaki Materyal Tasarım başlatıcı.

İkincil ekranda Materyal Tasarım başlatıcı.

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

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'e geriye dönük uyumluluk sunar.

Geçerli ekran dışındaki ekranlarla ilgili metrikleri almak için aşağıdakileri yapın:

  • Görüntülü reklam bağlamı oluşturma
  • Ekran için pencere bağlamı oluşturun
  • Pencere bağlamının WindowManager bilgisini al
  • Uygulamada kullanılabilen 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 düzeyi 30'da kullanımdan kaldırılarak yerine yeni WindowManager yöntemleri kullanılmaya başlandı.

Android 12 (API düzeyi 31), Display getRealSize() ve getRealMetrics() yöntemlerini kullanımdan kaldırarak getMaximumWindowMetrics() davranışına daha yakın olacak şekilde davranışlarını günceller.

Ç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 desteklediğini ve destekleyip desteklemediğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda öznitelikleri ayarlayabilirsiniz. Bir kök etkinliğin özellik ayarları, görev yığınındaki tüm etkinliklere uygulanır. Örneğin, kök etkinlikte android:resizeableActivity="true" varsa görev yığınındaki tüm etkinlikler yeniden boyutlandırılabilir. Chromebook'lar gibi bazı daha büyük cihazlarda, android:resizeableActivity="false" alanını belirtseniz bile uygulamanız yeniden boyutlandırılabilir bir pencerede çalışabilir. Bu durum, uygulamanızın bozulmasına neden olursa filtreleri kullanarak uygulamanızın bu tür cihazlarda kullanılabilirliğini kısıtlayabilirsiniz.

Not: API düzeyi 23 veya altını hedefleyen çok yönlü bir uygulama derlerseniz ve kullanıcı uygulamayı çoklu pencere modunda kullanırsa sistem, uygulamayı zorla yeniden boyutlandırır. Sistem, kullanıcıya uygulamanın beklenmedik şekilde davranabileceği konusunda uyarıda bulunan bir iletişim kutusu gösterir. Sistem, sabit yönlü uygulamaları yeniden yeniden boyutlandırmaz; kullanıcı çoklu pencere modunda sabit yönlü bir uygulamayı açmaya çalışırsa uygulama tüm ekranı ele alır.

Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere moduna geçer. Büyük ekranlarda (sw >= 600 dp), tüm uygulamalar uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Küçük ekranlarda sistem, etkinliğin birden fazla pencere modunda çalıştırılıp çalıştırılamayacağını belirlemek için minWidth, minHeight ve resizeableActivity ayarlarını kontrol eder.

yeniden boyutlandırma etkinliği

API düzeyi 30 ve önceki sürümler için çoklu pencere modunu etkinleştirmek ya da 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 (doğru) değerine ayarlanırsa etkinlik, bölünmüş ekran ve serbest biçim modlarında başlatılabilir. Özellik false değerine ayarlanırsa etkinlik çoklu pencere modunu desteklemez. Bu değer false 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 değerini alır.

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 (sw >= 600 dp): Tüm uygulamalar çoklu pencere modunu destekler. Özellik, bir etkinliğin yeniden boyutlandırılıp boyutlandırılamayacağını ifade eder. resizeableActivity="false" ise uygulama, görüntüleme boyutlarına uyması gerektiğinde uyumluluk moduna alınır.
  • Küçük ekranlar (sw < 600 dp): resizeableActivity="true" ve etkinlik minimum genişliği ve minimum yüksekliği çoklu pencere gereksinimleri dahilindeyse etkinlik, çoklu pencere modunu destekler. resizeableActivity="false" ise etkinlik, minimum genişlik ve yüksekliğine bakılmaksızın çoklu pencere modunu desteklemez.

resim içinde resim desteklenir

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

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

Not: supportsPictureInPicture="true" ise yapılandırma değişikliklerini işlemek amacıyla etkinliğinizi etkinleştirmek için android:configChanges özelliğini ayarlamanız gerekir ( Pencere içinde pencere desteği bölümüne bakın).

configChanges

Kullanıcının bir pencereyi yeniden boyutlandırması gibi çoklu pencere yapılandırma değişikliklerini kendiniz işlemek için android:configChanges özelliğini, en az aşağıdaki değerleri kullanarak uygulama manifesti <activity> düğümüne ekleyin:

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

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

<düzen>

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 birkaç özelliği destekler:

android:defaultHeight, android:defaultWidth
Serbest biçim modunda başlatıldığında etkinliğin varsayılan yüksekliği ve genişliği.
android:gravity
Serbest biçim modunda başlatıldığında etkinliğin ilk yerleşimi. Uygun değerler için bkz. Gravity.
android:minHeight, android:minWidth
Hem bölünmüş ekran hem de serbest biçim modlarında etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bir etkinliği belirtilen minimum değerden küçük hale getirmek için ayırıcıyı bölünmüş ekran modunda hareket ettirirse sistem, etkinliği kullanıcının istediği boyuta göre kırpar.

Aşağıdaki kod, etkinlik serbest biçim modunda görüntülenirken bir etkinliğin varsayılan boyutu ve konumunun yanı sıra minimum boyutunun nasıl belirtileceğini gösterir:

<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ı destekleyecek işlevler sunar.

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

Android, çoklu pencere modunda cihaz ekranını diğer etkinliklerle ya da uygulamalarla paylaşan bir etkinlik için geçerli olmayan özellikleri devre dışı bırakabilir veya yoksayabilir.

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

Sistem, android:screenOrientation özelliğinde yapılan değişiklikleri yoksayar.

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

Activity sınıfı, çoklu pencere modunu desteklemek için aşağıdaki yöntemleri sunar:

isInMultiWindowMode()
Etkinliğin birden fazla pencere modunda olup olmadığını belirtir.
isInPictureInPictureMode()
Etkinliğin pencere içinde pencere modunda olup olmadığını belirtir.
Not: Pencere içinde pencere modu, çoklu pencere modunun özel bir durumudur. myActivity.isInPictureInPictureMode() doğru değerini döndürürse myActivity.isInMultiWindowMode() de true değerini döndürür.
onMultiWindowModeChanged()
Etkinlik çoklu pencere moduna girdiğinde veya bu moddan çıktığında sistem bu yöntemi çağırır. Etkinlik birden fazla pencere moduna giriyorsa sistem yönteme true (doğru), etkinlik birden fazla pencere modundan çıkıyorsa false (yanlış) değerini iletir.
onPictureInPictureModeChanged()
Etkinlik, pencere içinde pencere moduna girdiğinde veya bu moddan çıktığında sistem bu yöntemi çağırır. Etkinlik pencere içinde pencere moduna giriyorsa sistem metodu "doğru", 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() çağrısı yapın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin etkisi olmaz. Daha fazla bilgi için Pencere içinde pencere desteği sayfasını inceleyin.

Çoklu pencere modunda yeni etkinlikler

Yeni bir etkinlik başlattığınızda, mümkünse yeni etkinliğin mevcut etkinliğin yanında görüntülenmesi gerektiğini belirtebilirsiniz. Sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyleyen amaç işaretini FLAG_ACTIVITY_LAUNCH_ADJACENT kullanın. Böylece iki etkinlik ekranı paylaşır. Sistem bunun için elinden geleni yapar, ancak gerçekleşeceği garanti edilmez.

Bir cihaz serbest biçim modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds() yöntemini çağırarak yeni etkinliğin boyutlarını ve ekran konumunu belirtebilirsiniz. Cihaz çoklu pencere modunda değilse bu yöntemin herhangi bir etkisi olmaz.

API düzeyi 30 ve önceki sürümlerde bir görev yığını içinde bir etkinlik başlatırsanız bu 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 isterseniz yeni bir görev yığınında başlatmalısınız.

Android 12 (API düzeyi 31), uygulamaların, bir uygulamanın görev penceresini birden fazla etkinliğe bölmesine olanak tanır. Uygulamanızın etkinliklerini (tam ekran, yan yana veya yığın halinde) nasıl görüntüleyeceğini bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak belirlersiniz.

Sürükleyin ve bırakın

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 tek bir etkinlik içinde yalnızca verileri sürükleyip bırakabiliyordu.) Bırakılan içeriği kabul etme desteğini hızlıca eklemek için DropHelper API'ye bakın. Kapsamlı sürükleme ve bırakma yönergeleri için Sürükleme ve bırakma bölümüne bakın.

Birden çok kopya

Her kök etkinliğinin, ayrı bir işlemde çalışan ve kendi penceresinde gösterilen kendi görevi vardır. Ayrı bir pencerede uygulamanızın yeni bir örneğini 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ı, ürünleri karşılaştırmak için birden fazla pencere görüntüleyebilir.

Android 12 (API düzeyi 31), aynı görev penceresinde bir etkinliğin iki örneğini yan yana başlatabilmenizi sağlar.

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" ayarını yaptığından ve birden fazla örneği engelleyen bir başlatma modu kullanmadığından emin olun. Örneğin, FLAG_ACTIVITY_MULTIPLE_TASK veya FLAG_ACTIVITY_NEW_DOCUMENT ayarlandığında bir singleInstancePerTask etkinliği farklı görevlerde birden çok kez örneklenebilir. Not: Uygulama başlatıcı, belirli bir amacı karşılayan uygulamaların listesini görüntüleyen bir sistem iletişim kutusudur. Kullanıcılar bir uygulamayı listeden seçerek başlatabilir. Amaç türleri bölümünü inceleyin.

Birden çok örneği, tek bir pencere içinde çalışan SlidingPaneLayout kullanan list-detail sunusu gibi çok panelli bir düzenle karıştırmayın.

Katlanabilir bir cihazda ayrı pencerelerde birden fazla örnek çalışırken, pozisyonun değişmesi halinde bir veya daha fazla örneğin arka plana gönderilebileceğini unutmayın. Örneğin, bir cihazın açık olduğunu ve ekranın her iki tarafı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 API düzeyi 24 veya üstünü hedeflese de etmese de, kullanıcının Android 7.0 veya sonraki sürümleri çalıştıran bir cihazda birden fazla pencere modunda başlatmaya çalıştığı durumlarda uygulamanızın çok pencereli modda 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 altı

Kullanıcılar uygulamayı çoklu pencere modunda kullanmayı denediğinde, uygulama sabit bir yön beyan etmedikçe sistem uygulamayı zorla yeniden boyutlandırır.

Uygulamanız sabit bir yön bildirmiyorsa uygulamanızı Android 7.0 veya sonraki sürümleri çalıştıran bir cihazda başlatmanız ve uygulamayı bölünmüş ekran moduna geçirmeyi denemeniz gerekir. Uygulama zorla yeniden boyutlandırıldığında kullanıcı deneyiminin kabul edilebilir olduğunu doğrulayın.

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

24 ila 30 API düzeyleri

Uygulamanız 24 ile 30 arasındaki API düzeylerini hedefliyorsa ve çoklu pencere desteğini devre dışı bırakmıyorsa hem bölünmüş ekran hem de serbest biçim modlarında aşağıdaki davranışı doğrulayın:

  • Uygulamayı tam ekran olarak başlatın, ardından Son Kullanılanlar düğmesine uzun basarak çoklu pencere moduna geçin. Uygulamanın düzgün bir şekilde geçiş yaptığını doğrulayın.
  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve uygulamanın düzgün şekilde başladığından emin olun. Bir uygulamayı çoklu pencere modunda başlatmak için Son Kullanılanlar düğmesine basıp uygulamanızın başlık çubuğuna uzun basın ve ekrandaki vurgulanan alanlardan birine sürükleyin.
  • Ekran ayırıcıyı sürükleyerek uygulamanızı bölünmüş ekran modunda yeniden boyutlandırın. 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 belirlediyseniz uygulamayı bu boyutların altında 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 testlerde uygulama performansınızın kabul edilebilir düzeyde 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 üstü

Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa ve ana etkinliğin minimum genişliği ve minimum yüksekliği, mevcut görüntüleme alanının ilgili boyutlarından az veya buna eşitse 24-30 API düzeyleri için listelenen tüm davranışları doğrulayın.

Not: Activity#isInMultiWindowMode() değerinin döndürülen değerini kontrol ederek uygulamanızın çoklu pencere modunda olup olmadığını programatik olarak belirleyebilirsiniz.

Test kontrol listesi

Uygulamanızın çok pencereli modda 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 modunda hem de serbest biçimli modda denemeniz gerekir.

  • Çoklu pencere moduna girip bu moddan çıkın.
  • Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür haldeyken 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 büyütmek hem de küçültmek için ekran ayırıcıyı hareket ettirmeyi deneyin. Bu işlemleri yan yana ve diğer yapılandırmaların üzerinde deneyin. Uygulamanın kilitlenmediğini, temel işlevlerin görünür olduğunu ve yeniden boyutlandırma işleminin çok uzun sürmediğini doğrulayın.
  • Hızlı bir şekilde arka arkaya 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 Profil Aracı, uygulamanızın bellek kullanımı hakkında bilgi sağlar (Bellek Profil Aracı ile uygulamanızın bellek kullanımını inceleme bölümüne bakın).
  • Uygulamanızı birkaç farklı pencere yapılandırmasında normal şekilde kullanın ve uygulamanın düzgün bir şekilde davrandığını doğrulayın. Metnin okunabilir olduğunu ve kullanıcı arayüzü öğelerinin etkileşimde bulunamayacak kadar küçük olmadığını doğrulayın.

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

24-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 serbest biçim modlarına koymayı denemelisiniz. 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 edinmek için aşağıdaki makalelere bakın: