Çoklu pencere desteği

Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasını sağlar. Uygulamalar yan yana veya birbirlerinin üzerine gelebilir (bölünmüş ekran modu), küçük bir pencerede diğer uygulamalarla yer paylaşımlı bir uygulama (pencere içinde pencere modu) veya ayrı, taşınabilir, yeniden boyutlandırılabilir pencerelerde yer alan ayrı ayrı uygulamalar (serbest biçim modu) olabilir.

Ş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 sunar.

    Bölünmüş ekran modu, ekranı iki uygulamayla doldurarak uygulamaları yan yana veya birbirlerinin üzerinde gösterir. Kullanıcılar, iki uygulamayı birbirinden ayırmak için ayırıcıyı sürükleyerek birini büyütebilir, diğerini küçültebilir.

    Pencere içinde pencere modu, kullanıcıların başka bir uygulamayla etkileşim kurarken video oynatmaya devam edebilmesini sağlar (bkz. Pencere içinde pencere desteği).

    Büyük ekran cihaz ü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 işleyeceğini yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekran göstermesini sağlamak için resizeableActivity="false" ayarlayarak 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.

    Platform, büyük ekranlarda (sw >= 600 dp) uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda tüm uygulamaları destekler. resizeableActivity="false" değerine ayarlanırsa uygulama, ekran boyutlarının barındırılması için gerektiğinde uyumluluk moduna alınır.

    Küçük ekranlarda (sw < 600 dp), sistem etkinliğin çok pencere modunda çalışıp çalışamayacağını belirlemek için bir etkinliğin minWidth ve minHeight değerlerini kontrol eder. resizeableActivity="false" değerine ayarlanırsa minimum genişlik ve yüksekliğe bakılmaksızın 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. Bir uygulamayı kaydırarak görünüm içine alın
  3. Uygulama başlık çubuğundaki uygulama simgesine basın
  4. Bölünmüş ekran menü 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ısını ekranın kenarına (yukarı veya aşağı, sola veya sağa) sürükleyerek bölünmüş ekran modundan çıkabilir.

Bitişikteki başlat

Uygulamanızın, içeriğe bir amaç aracılığıyla 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 bitişikteki pencerede etkinlik başlatmasına olanak tanımak için Android 7.0'da (API düzeyi 24) kullanıma sunuldu.

Android 12L (API düzeyi 32) ve sonraki sürümlerde, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirmesi ve bitişikteki pencerede etkinlikleri başlatması için bayrağın 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 uygulamaların devam ettirilen durumu Android'in farklı sürümlerinde değişiklik 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. Bir etkinlik, etkinliğin üzerinde şeffaf bir etkinlikse veya etkinlik odaklanılamıyorsa (örneğin, pencere içinde pencere modu) duraklatılabilir. Belirli bir zamanda hiçbir etkinliğe odaklanılmamış da olabilir (örneğin, 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 ettirme özelliği, 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 spesifikasyonlarına 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 şeklindedir ancak RESUMED değildir. Bununla birlikte sistem, bu görünür ancak devam ettirilmeyen etkinliklere, görünür olmayan etkinliklere göre daha yüksek öncelik verir. Kullanıcı, görünür etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve önceki en önemli etkinlik STARTED durumuna girer.

Tek bir etkin uygulama işleminde birden fazla etkinlik olduğunda, en yüksek z sırasına sahip 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ü etkileri, sisteme cihazın dikey yönden yatay yöne geçtiğini bildirmesiyle aynı şekilde uygulanır. Aradaki 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 kendi başına yapabilir veya sistemin etkinliği kaldırmasına ve yeni boyutlarla yeniden oluşturmasına izin verebilir.

Kullanıcı bir pencereyi yeniden boyutlandırır ve iki boyutta da büyütürse sistem, etkinliği kullanıcı işlemiyle eşleşecek şekilde yeniden boyutlandırır ve gerektiğinde yapılandırma değişiklikleri yapar. Uygulama yeni açığa çıkan alanlarda çizim 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ğini desteklemeye yardımcı olmak için onTopResumedActivityChanged() adında yeni bir yaşam döngüsü geri çağırma özelliği bulunuyor.

Bu yöntem, bir etkinlik devam ettirilen en üst etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bir etkinlikte, mikrofon veya kamera gibi paylaşılan tek bir kaynak kullandığında bunu 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ı kaybedebileceğini unutmayın.

Her durumda, bir uygulama mevcut kaynakları etkileyen etkinlikleri ve durum değişikliklerini incelikle yönetmelidir.

Kamera kullanan uygulamalarda CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged(), kameraya erişmeyi denemenin iyi bir zaman olabileceğine dair ipucu verir. Bu yöntem, Android 10 (API düzeyi 29) sürümünden itibaren kullanılabilir.

Kamerayı kullanan diğer uygulamalar başka ekranlarda açılabileceğinden resizeableActivity=false özelliğinin özel kamera erişimini garanti etmediğini unutmayın.

Şekil 2. Kamera çoklu pencere modunda.

Odağı kaybedildiğinde uygulamanızın kamerayı serbest bırakması gerekmez. Örneğin, kullanıcı yeni odaklanılan en önemli uygulamayla etkileşim kurarken 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. Uygulama tekrar odaklandığında kamerayı yeniden açabilir.

Bir uygulama CameraDevice.StateCallback#onDisconnected() geri çağırması aldıktan sonra kamera cihazından yapılan sonraki çağrılar CameraAccessException hatası verir.

Çoklu Ekran

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

Bir uygulama, başlatıldığında veya başka bir etkinlik oluşturulduğunda hangi ekranda çalıştırılması gerektiğini belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan varlık tarafından belirlenen intent işaretleri ile seçeneklere bağlıdır. Daha fazla bilgi için ActivityOptions sayfasını ziyaret edin.

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. Yapılandırma değişikliğini gerçekleştiren etkinlik, onConfigurationChanged() içinde bildirilir. Aksi takdirde etkinlik yeniden başlatılır.

Bir etkinlik, yapılandırma değişikliğinin işlenip işlenmediğini onCreate ve onConfigurationChanged dillerindeki 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şlatmak, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.

Şekil 3.Bir etkinliğin birden fazla ekranda 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 görüntülü reklamlarda doğru bağlamı kullanmak çok önemlidir. Kaynaklara erişirken etkinlik bağlamı (gösterilen) uygulama bağlamından (gösterilmez) farklıdır.

Etkinlik bağlamı ekranla ilgili bilgiler içerir ve her zaman etkinliğin göründüğü görüntüleme alanı için ayarlanır. Bu sayede, uygulamanızın şu anda sahip olduğu görüntü yoğunluğu veya aralık metrikleri hakkında doğru bilgileri alabilirsiniz. Geçerli pencere veya ekran hakkında bilgi almak 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, Kısa mesajlara genel bakış konusuna 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();

Mevcut etkinlik aralığı metriklerini alın:

Kotlin

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

Java

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

Geçerli sistem yapılandırması için maksimum pencere 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 kaynakların boyutunu belirlemek içindir. Bu özelliğin onCreate() içinde sunulması, ilk düzen geçişinden önce bu kararları almanıza olanak tanır. 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ın katlanıp açıldığında farklı kesim geometrisi olabilir. Kesme sorunları yaşamamak için Ekran kesimi desteği için en iyi uygulamalar konusunu okuyun.

İkincil ekranlar

Kullanılabilir ekranları DisplayManager sistem hizmetinden edinebilirsiniz:

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 bilgi (ör. ekran boyutu veya bir ekranın güvenli olup olmadığını gösteren işaretler) için Display sınıfını kullanın. Ancak, görüntü boyutunun uygulamanıza ayrılan görüntüleme alanıyla aynı olacağını varsaymayın. Uygulamanızın, çoklu pencere modunda 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);

Sonra 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 ekranda klavye gösterilebilir. Bir metin alanı söz konusu ekranda giriş isterse giriş yöntemi düzenleyicisi otomatik olarak görünür.

Şekil 4. İkincil ekrandaki 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 bağımsız olarak çizdiğinden emin olun. Geliştiriciler, WallpaperService.Engine#getDisplayContext()'da görüntüleme bağlamını kullanarak öğeleri yükleyebilirler. Ayrıca, WallpaperInfo.xml dosyanızın android:supportsMultipleDisplays="true" olarak ayarlandığından emin olun.

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

Launcher'lar

Yeni amaç filtresi kategorisi (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>

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

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

Şekil 6. Telefonda Materyal Tasarım başlatıcı.
Şekil 7. İ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ığının yöntemleri computeCurrentWindowMetrics() ve computeMaximumWindowMetrics() benzer işlevler sunar ancak API düzeyi 14 ile geriye dönük uyumluluk sağlar.

Mevcut ekran dışındaki ekranlara ilişkin 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ştur
  • Pencere bağlamının WindowManager bilgisini al
  • 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();

Desteği sonlandırılan yöntemler

Display yöntemleri getSize() ve getMetrics() API düzeyi 30'da desteği sonlandırılarak yeni WindowManager yöntemleri kullanılmaya başlandı.

Android 12 (API düzeyi 31), getRealSize() ve getRealMetrics() Display yöntemlerini kullanımdan kaldırır ve davranışlarınıgetMaximumWindowMetrics() davranışıyla daha yakından eşleşecek şekilde günceller.

Çoklu pencere modu yapılandırması

Uygulamanız Android 7.0 (API düzeyi 24) veya sonraki sürümleri hedefliyorsa uygulama etkinliklerinin çoklu pencere modunu nasıl destekleyeceğini ve destekleyip desteklemeyeceğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızdaki özellikleri ayarlayabilirsiniz. Bir 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 bazı daha büyük cihazlarda, android:resizeableActivity="false" değerini 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 filtreler kullanabilirsiniz.

Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere moduna ayarlanır. Büyük ekranlarda (sw >= 600 dp) tüm uygulamalar, uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Sistem, küçük ekranlarda etkinliğin minWidth, minHeight ve resizeableActivity ayarlarını kontrol ederek etkinliğin çok pencere modunda çalışıp çalışmadığını belirler.

yeniden boyutlandırma Etkinliği

API düzeyi 30 ve önceki sürümlerde çoklu pencere modunu etkinleştirmek veya devre dışı bırakmak için manifest dosyanızın <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çimli modlarda başlatılabilir. Özellik false (yanlış) değerine ayarlanırsa etkinlik, çoklu pencere modunu desteklemez. Bu değer false (yanlış) değerine ayarlanırsa 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 "doğru" 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 (sw >= 600 dp): 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 uyması gerektiğinde uyumluluk moduna alınır.
  • Küçük ekranlar (sw < 600 dp): resizeableActivity="true" ve etkinlik minimum genişlik ve minimum yükseklik çoklu pencere gereksinimleri kapsamındaysa etkinlik, çoklu pencere modunu destekler. resizeableActivity="false" ise etkinlik, minimum genişlik ve yükseklikten bağımsız olarak çoklu pencere modunu desteklemez.

desteklerResim İçinde Resim

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"] />

configChanges

Kullanıcının bir pencereyi yeniden boyutlandırması gibi çok pencereli yapılandırma değişikliklerini kendiniz yönetmek için android:configChanges özelliğini en az aşağıdaki değerlerle birlikte 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 yok edilip yeniden oluşturulmak yerine onConfigurationChanged() için bir geri çağırma yapılı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.

<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 Gravity adresine göz atın.
android:minHeight, android:minWidth
Hem bölünmüş ekran hem de serbest biçimli modlarda etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bölünmüş ekran modunda ayırıcıyı bir etkinliği belirtilen minimum değerden daha küçük hale getirmek için taşırsa sistem, etkinliği kullanıcının istediği boyuta göre kırpar.

Aşağıdaki kodda, serbest biçim modunda görüntülenen bir etkinliğin varsayılan boyutu ile konumunun ve minimum boyutunun 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ışı özellikler

Android, çoklu pencere modunda, cihaz ekranını başka etkinliklerle veya uygulamalarla paylaşan etkinlikler 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ğırmalar

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(), true değerini döndürürse myActivity.isInMultiWindowMode() de true değerini döndürür.

onMultiWindowModeChanged()
Etkinlik, çoklu pencere moduna geçtiğinde veya bu moddan çıktığında sistem, bu yöntemi çağırır. Etkinlik çoklu pencere moduna giriyorsa sistem, yönteme "true" (doğru) değeri, etkinlik çoklu pencere modundan çıkıyorsa "false" (yanlış) 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. Etkinlik pencere içinde pencere moduna giriyorsa sistem bu yöntemi true (doğru), pencere içinde pencere modundan çıkıyorsa false (yanlış) değerini iletir.

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

Pencere içinde pencere modu

Bir etkinliği pencere içinde pencere moduna geçirmek için şu numarayı arayın: enterPictureInPictureMode() Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin bir etkisi olmaz. Daha fazla bilgi edinmek 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 geçerli etkinliğin yanında görüntülenmesi gerektiğini belirtebilirsiniz. Sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyleyen FLAG_ACTIVITY_LAUNCH_ADJACENT intent işaretini kullanın. Böylece iki etkinlik ekranı paylaşır. Sistem bunun için elinden gelenin en iyisini yapar, ancak bunun olacağı garanti edilmez.

Cihaz serbest biçim modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds() numaralı telefonu arayarak 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 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 çok pencereli modda ayrı bir pencere olarak başlatmak isterseniz bunu 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 etkinliğe bölmesini sağlar. 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ığın) göstereceğini siz belirlersiniz.

Sürükleyin ve bırakın

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 verileri sürükleyip bırakabiliyordu.) Bırakılan içeriği kabul etmeyle ilgili hızlıca destek eklemek için DropHelper API'ye göz atın. Sürükleyip bırakmayla ilgili kapsamlı yardım için Sürükleme ve bırakma sayfasına bakın.

Birden çok ö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), aynı görev penceresinde bir etkinliğin iki örneğini 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" parametresini ayarladığı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.

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

Katlanabilir bir cihazda birden fazla örnek ayrı pencerelerde çalışırken durumun değişmesi durumunda bir veya daha fazla örneğin arka plana gönderilebileceğini unutmayın. Örneğin, bir cihazın açılmış olduğunu ve ekranın her iki yanındaki iki pencerede çalışan iki uygulama örneği olduğunu varsayalım. Cihaz katlanmışsa daha küçük bir ekrana her iki örnekteki pencereleri sığdırmaya çalışmak yerine örneklerden biri sonlandırılabilir.

Çok 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ı çoklu pencere modunda 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 yön belirtmediği sürece sistem uygulamayı zorla yeniden boyutlandırır.

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

Uygulama sabit yön belirtiyorsa uygulamayı çoklu pencere moduna almayı denemeniz gerekir. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığından emin olun.

24 ile 30 arasındaki 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çimli modlarda 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ığından emin olun.
  • Uygulamayı doğrudan çoklu pencere modunda başlatın ve uygulamanın düzgün şekilde başlatıldığını doğrulayın. Son kullanılanlar düğmesine bastıktan sonra uygulamanızın başlık çubuğuna uzun basıp uygulamayı ekranın vurgulanan alanlarından birine sürükleyerek çoklu pencere modunda başlatabilirsiniz.
  • 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 yeniden boyutlandırmayı deneyin. Uygulamayı, belirtilen minimum boyutlardan küçük olacak şekilde yeniden boyutlandıramayacağınızı doğrulayın.
  • Tüm testler aracılığıyla uygulamanızın performansının kabul edilebilir düzeyde olduğunu doğrulayın. Örneğin, uygulama yeniden boyutlandırıldıktan sonra kullanıcı arayüzünü güncellemek 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, kullanılabilir görüntüleme alanının ilgili boyutlarından küçük veya bu boyutlara eşitse 24 ile 30 arasındaki API düzeyleri için listelenen tüm davranışları doğrulayın.

Test kontrol listesi

Uygulamanızın çoklu pencere modunda performansını doğrulamak için aşağıdaki işlemleri deneyin. Aksi belirtilmedikçe, bu işlemleri hem bölünmüş ekran hem de serbest biçimli modda denemelisiniz.

  • Çoklu pencere moduna girin ve bu moddan çıkın.
  • Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür ama etkin değilken düzgün bir şekilde davrandığını doğrulayın. Örneğin, uygulamanız video oynatıyorsa kullanıcı başka bir uygulamayla etkileşimde bulunurken videonun oynatılmaya devam ettiğini doğrulayın.
  • Bölünmüş ekran modundayken, uygulamanızı hem büyütmek hem de küçültmek için ekran ayırıcının yerini değiştirmeyi deneyin. Bu işlemleri hem yan yana hem de diğer yapılandırmaların üstünde olacak şekilde 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.
  • Art arda birkaç yeniden boyutlandırma işlemi gerçekleştirin. Uygulamanızın kilitlenmediğini veya bellek sızdırmadığı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ı çeşitli pencere yapılandırmalarında normal bir ş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 ile 30 arasındaki API düzeylerinde, android:resizeableActivity="false" ayarlayarak ç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 kullanıma sunmalı ve uygulamayı bölünmüş ekran ve serbest biçim modlarına yerleştirmeyi 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: