Ç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 pencerelerdeki ayrı uygulamalar (serbest biçim modu) olabilir.
Kullanıcı deneyimi, Android 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 sundu.
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 uygulamalardan 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 etmesini sağlar (Pencere içinde pencere desteği bölümüne bakın).
Kullanıcıların her bir etkinliği serbestçe yeniden boyutlandırabildiği serbest biçim modu, büyük ekranlı cihaz üreticileri tarafından etkinleştirilebilir.
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
resizeabableActivity="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.
Platform, büyük ekranlarda (en küçük genişlik >= 600 dp) uygulama yapılandırmasından bağımsız olarak çoklu pencere modundaki tüm uygulamaları destekler.
resizeableActivity="false"
ise uygulama, ekran boyutlarının kullanılması için gerektiğinde uyumluluk moduna alınır.Küçük ekranlarda (en küçük genişlik < 600 dp), sistem, etkinliğin çoklu pencere modunda çalışıp çalışamayacağını belirlemek için bir etkinliğin
minWidth
veminHeight
özelliklerini kontrol eder.resizeableActivity="false"
değerine ayarlanırsa uygulamanın, minimum genişlik ve yükseklikten bağımsız olarak ç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:
- Son Kullanılanlar ekranını açın.
- Bir uygulamayı kaydırarak görünüm içine alın
- Uygulama başlık çubuğundaki uygulama simgesine basın
- Bölünmüş ekran menü seçeneğini belirleyin
- 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ç ü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 bitişikteki pencerede etkinlik başlatmasına olanak tanımak için Android 7.0'da (API düzeyi 24) kullanıma sunulmuştur.
Android 12L (API düzeyi 32) ve sonraki sürümlerde, bayrağın tanımının genişletilmesi, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirmesine ve ardından bitişikteki pencerede etkinlikleri başlatmasına olanak tanır.
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. Bununla birlikte, 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. Üstünde şeffaf bir etkinlik varsa veya etkinliğe odaklanılamıyorsa (örneğin, pencere içinde pencere modunda) bir etkinlik duraklatılabilir. Ayrıca, örneğin bildirim çekmecesi açıksa, belirli bir zamanda hiçbir etkinliğe odaklanılmamış da olabilirsiniz. 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
olup 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 ö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ü ü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 yapabilir veya uygulamanız, 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ıyorsa 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()
yaşam döngüsü geri çağırmasını kullanın.
Geri çağırma, bir etkinlik en üst devam ettirilen etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bu, etkinliğin mikrofon veya kamera gibi paylaşılan bir tekil kaynağı kullandığı durumlarda ö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
uygulamasının özel kamera erişimini garanti etmediğini unutmayın.
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-camera.png?authuser=3&hl=tr)
Odağı kaybedildiğinde uygulamanızın kamerayı serbest bırakması gerekmez. Örneğin, kullanıcı yeni odaklanılan en önemli devam ettirilen uygulama ile 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. Uygulama yeniden odakladığı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
sinyalini 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şini 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 ayrıntı için ActivityOptions
sınıfını inceleyin.
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 işleme alırsa etkinlik onConfigurationChanged()
içinde bildirilir. Aksi takdirde etkinlik yeniden başlatılır.
Bir etkinlik, yapılandırma değişikliği işleniyorsa 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 ekranda başlatmak, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-multi-display.png?authuser=3&hl=tr)
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, uygulamanızın görüntü yoğunluğu veya pencere metrikleri hakkında doğru bilgileri almanızı sağlar. Mevcut 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ı) kullanmanız gerekir. Bu durum, bağlamdan alınan 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ını önlemek için Ekran kesimlerini destekleme bölümüne bakın.
İ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();
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. 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.
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-keyboard.png?authuser=3&hl=tr)
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()
'deki görüntülü reklam bağlamını kullanarak öğeleri yükleyebilir. Ayrıca, WallpaperInfo.xml
dosyanızda android:supportsMultipleDisplays="true"
bulunduğundan emin olun.
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-wallpaper.png?authuser=3&hl=tr)
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.
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-launcher-phone.png?authuser=3&hl=tr)
![](https://developer.android.com/static/images/guide/topics/ui/foldables/fold-launcher-display.png?authuser=3&hl=tr)
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:
getCurrentWindowMetrics()
: Sistemin geçerli pencere durumu için birWindowMetrics
nesnesi döndürür.getMaximumWindowMetrics()
: Sistemin en büyük potansiyel aralık durumu içinWindowMetrics
değerini döndürür.
Jetpack WindowManager kitaplık yöntemleri computeCurrentWindowMetrics()
ve computeMaximumWindowMetrics()
sırasıyla ancak API düzeyi 14 ile geriye dönük uyumluluğa sahip olan benzer işlevler sunar.
Mevcut ekran dışındaki ekranlara ilişkin metrikleri almak için aşağıdakileri (kod snippet'inde gösterildiği gibi) 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 kullanımdan kaldırılarak yeni WindowManager
yöntemlerinin yerini aldı.
Android 12 (API düzeyi 31), Display
getRealSize()
ve getRealMetrics()
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 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. Bir kök etkinliğinin ö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 Google Play'deki filtreleri 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 çoklu pencere modunda çalışıp çalışmadığını belirler.
resizeableActivity
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
değerine ayarlanırsa etkinlik, bölünmüş ekran ve serbest biçimli modlarda başlatılabilir. Özellik false
değerine ayarlanırsa etkinlik, çoklu pencere modunu desteklemez. Değer false ise ve kullanıcı etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tam ekranı devralır.
Uygulamanız API düzeyi 24 veya üstünü hedefliyorsa ancak bu özellik için bir değer belirtmezseniz özelliğin değeri varsayılan olarak "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ı belirtir.
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.
supportsPictureInPicture
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 uygulama manifesti <activity>
düğümüne en azından aşağıdaki değerlere sahip 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 yok edilip yeniden oluşturulmak yerine onConfigurationChanged()
için bir 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
: 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çinGravity
sınıfına bakı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 yapmak 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 çoklu pencere modunda olup olmadığını belirtir.isInPictureInPictureMode()
: Etkinliğin pencere içinde pencere modunda olup olmadığını gösterir.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öntemi "true" (doğru) değerini, 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 almak için enterPictureInPictureMode()
işlevini çağırın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin herhangi bir etkisi olmaz. Daha fazla bilgi için Pencere içinde pencere (PiP) özelliğini kullanarak video ekleme bölümü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. Amaç işaretini FLAG_ACTIVITY_LAUNCH_ADJACENT
kullanın. Bu işaret, iki etkinliğin ekranı paylaşmasını sağlamak için sisteme yeni etkinliği bitişik bir pencerede oluşturmayı denemesini söyler. Sistem bunun için elinden gelenin en iyisini yapar ancak bunun olacağı garanti edilmez.
Bir 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 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 çok pencereli modda ayrı bir pencere olarak başlatmak istiyorsanız 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 verileri yalnızca tek bir etkinlik içinde sürükleyip bırakabiliyordu.) Çıkarılan içerikleri kabul etmeyle ilgili hızlıca destek almak için DropHelper
API'ye göz atın. 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.
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 isterseniz başlatıcı Etkinliğinizin android:resizeableActivity="true"
olarak ayarlandığı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.
Ç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ı ç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 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 doğru ş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 ekranın vurgulanan alanlarından birine sürükleyerek bir uygulamayı ç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ı pencere boyutu bu boyutlardan daha küçük olacak şekilde yeniden boyutlandırmayı deneyin. Uygulamayı belirtilen minimum boyutlardan daha 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 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 daha büyük hem de daha küçük hale getirmek 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 moduna geçirmeyi denemelisiniz. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığından emin olun.
Ek kaynaklar
Android'de çoklu pencere desteği hakkında daha fazla bilgi edinmek için:
- Android MultiWindowPlayground örneği
Sizin için önerilenler
* Not: bağlantı metni JavaScript kapalıyken gösterilir * Cihaz uyumluluğu modu * Büyük ekranları yeniden boyutlandırmayı destekleyin * Yapılandırma değişikliklerini işleme