Çoklu pencere modu, birden fazla uygulamanın aynı ekranı aynı anda paylaşmasına olanak tanır. Uygulamalar yan yana veya üst üste (bölünmüş ekran modu) olabilir, küçük bir pencerede diğer uygulamaların üzerine binen bir uygulama (pencere içinde pencere modu) veya ayrı, taşınabilir, yeniden boyutlandırılabilir pencerelerde tek tek uygulamalar (masaüstü pencere modu) olabilir.
Telefonlarda bölünmüş ekran moduna erişmeyle ilgili kullanıcı talimatları için Pixel telefonda aynı anda iki uygulamayı görme başlıklı makaleyi inceleyin.
Sürüme özgü çoklu pencere özellikleri
Çoklu pencere kullanıcı deneyimi, Android sürümüne ve cihaz türüne bağlıdır:
Android 7.0 (API düzeyi 24), küçük ekranlı cihazlarda bölünmüş ekran modunu ve belirli cihazlarda pencere içinde pencere modunu kullanıma sundu.
Bölünmüş ekran modu, ekranı iki uygulamayla doldurur ve bunları yan yana veya üst üste gösterir. Kullanıcılar, iki uygulamayı ayıran böleni sürükleyerek bir uygulamayı daha büyük, diğerini daha küçük hale getirebilir.
Pencere içinde pencere modu, kullanıcıların başka bir uygulamayla etkileşimde bulunurken video oynatmaya devam etmesine olanak tanır (Pencere içinde pencere desteği bölümüne bakın).
Kullanıcıların her etkinliği özgürce yeniden boyutlandırabileceği masaüstü pencere modu, büyük ekranlı cihazların üreticileri tarafından etkinleştirilebilir.
Etkinliğinizin izin verilen minimum boyutlarını belirterek uygulamanızın çoklu pencere modunu nasıl işlediğini yapılandırabilirsiniz. Ayrıca, sistemin uygulamanızı her zaman tam ekranda göstermesini sağlamak için
resizeableActivity="false"
ayarını yaparak uygulamanız için çoklu pencere modunu devre dışı bırakabilirsiniz.
Android 8.0 (API düzeyi 26), küçük ekranlı cihazlarda resim içinde resim modunu destekler.
Android 12 (API düzeyi 31), çoklu pencere modunu standart davranış haline getirir.
Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), platform uygulama yapılandırmasından bağımsız olarak tüm uygulamaları çoklu pencere modunda destekler.
resizeableActivity="false"
ise uygulama, görüntü boyutlarına uyum sağlamak için gerektiğinde uyumluluk moduna geçirilir.Küçük ekranlarda (kompakt pencere boyutu sınıfı), sistem etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin
minWidth
veminHeight
değerlerini kontrol eder.resizeableActivity="false"
ise minimum genişlik ve yükseklikten bağımsız olarak uygulamanın çoklu pencere modunda çalışması engellenir.
Bölünmüş ekran modu
Kullanıcılar aşağıdakileri yaparak bölünmüş ekran modunu etkinleştirebilir:
- Son kullanılanlar ekranını açın.
- Uygulamaları kaydırarak görüntüleme
- Uygulama başlık çubuğundaki uygulama simgesine basın
- Bölünmüş ekran menüsü 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ıyı ekranın kenarına (yukarı, aşağı, sola veya sağa) sürükleyerek bölünmüş ekran modundan çıkar.
Bitişik başlatma
Uygulamanızın bir intent aracılığıyla içeriğe erişmesi gerekiyorsa içeriği bitişik bir bölünmüş ekran penceresinde açmak için FLAG_ACTIVITY_LAUNCH_ADJACENT
kullanabilirsiniz.
FLAG_ACTIVITY_LAUNCH_ADJACENT
, bölünmüş ekran modunda çalışan uygulamaların yan pencerede etkinlik başlatmasını sağlamak için Android 7.0'da (API düzeyi 24) kullanıma sunulmuştur.
Android 12L (API düzeyi 32) ve sonraki sürümlerde, tam ekran çalışan uygulamaların bölünmüş ekran modunu etkinleştirip ardından bitişik pencerede etkinlikleri başlatmasını sağlamak için işaretin tanımı genişletildi.
Bitişik bir etkinliği başlatmak için FLAG_ACTIVITY_NEW_TASK
ile birlikte FLAG_ACTIVITY_LAUNCH_ADJACENT
kullanın. Örneğin:
Kotlin
fun openUrlInAdjacentWindow(url: String) { Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT or Intent.FLAG_ACTIVITY_NEW_TASK) }.also { intent -> startActivity(intent) } }
Java
public void openUrlInAdjacentWindow(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
Çoklu pencere modunda etkinlik yaşam döngüsü
Çoklu pencere modu, etkinlik yaşam döngüsünü değiştirmez. Ancak birden fazla pencerede devam eden uygulamaların durumu, Android'in farklı sürümlerinde farklılık gösterir.
Çoklu devam ettirme
Android 10 (API düzeyi 29) ve sonraki sürümler çoklu devamı destekler. Cihaz çoklu pencere modundayken tüm etkinlikler RESUMED
durumunda kalır. Bir etkinliğin üstünde şeffaf bir etkinlik varsa veya etkinlik odaklanılabilir durumda değilse (ör. etkinlik pencere içinde pencere modundaysa) etkinlik duraklatılabilir. Belirli bir zamanda hiçbir etkinliğin odakta olmaması da mümkündür (ör. bildirim çekmecesi açıksa). onStop()
yöntemi her zamanki gibi çalışır: Bir etkinlik ekrandan kaldırıldığında yöntem çağrılır.
Çoklu devam özelliği, Android 9 (API düzeyi 28) yüklü belirli cihazlarda da kullanılabilir. Android 9 cihazlarda çoklu devam etmeyi etkinleştirmek için aşağıdaki manifest meta verilerini ekleyin:
<meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" />
Belirli bir cihazın bu manifest meta verilerini destekleyip desteklemediğini doğrulamak için cihaz özelliklerine bakın.
Android 9
Android 9 (API düzeyi 28) ve önceki sürümlerde çoklu pencere modunda, belirli bir zamanda yalnızca kullanıcının en son etkileşimde bulunduğu etkinlik etkindir. Bu etkinlik en üstte kabul edilir ve RESUMED
durumundaki tek etkinliktir. Görünen diğer tüm etkinlikler STARTED
olarak görünür ancak RESUMED
değildir.
Ancak sistem, görünür ancak devam ettirilmemiş bu etkinliklere görünmeyen etkinliklerden daha yüksek öncelik verir. Kullanıcı görünür etkinliklerden biriyle etkileşimde bulunursa bu etkinlik devam ettirilir ve daha önce en üstte olan etkinlik STARTED
durumuna girer.
Tek bir etkin uygulama sürecinde birden fazla etkinlik olduğunda, z-sıralı en yüksek olan etkinlik devam ettirilir ve diğerleri duraklatılır.
Yapılandırma değişiklikleri
Kullanıcı bir uygulamayı çoklu pencere moduna aldığında sistem, Yapılandırma değişikliklerini işleme bölümünde belirtildiği gibi yapılandırma değişikliği etkinliğini bildirir. Bu durum, kullanıcı uygulamayı yeniden boyutlandırdığında veya uygulamayı tekrar tam ekran moduna geçirdiğinde de gerçekleşir.
Bu değişiklik, temel olarak sistemin uygulamaya cihazın dikeyden yatay yöne geçtiğini bildirmesiyle aynı etkinlik yaşam döngüsü etkilerine sahiptir. Tek fark, uygulama boyutlarının yalnızca değiştirilmesi yerine değiştirilmesidir. Etkinliğiniz yapılandırma değişikliğini kendi başına halledebilir veya uygulamanız, sistemin etkinliği yok etmesine ve yeni boyutlarla yeniden oluşturmasına izin verebilir.
Kullanıcı bir pencereyi yeniden boyutlandırıyorsa ve pencereyi herhangi bir boyutta büyütüyorsa sistem, etkinliği kullanıcı işlemine uyacak şekilde yeniden boyutlandırır ve gerektiğinde yapılandırma değişiklikleri yapar. Uygulama, yeni ışığa maruz kalan alanları çizmede gecikirse sistem bu alanları geçici olarak windowBackground
özelliği veya varsayılan windowBackgroundFallback
stil özelliği tarafından belirtilen renkle doldurur.
Özel kaynak erişimi
Çoklu devam özelliğini desteklemek için onTopResumedActivityChanged()
yaşam döngüsü geri çağırma işlevini kullanın.
Geri çağırma işlevi, bir etkinlik devam ettirilen en üst etkinlik konumunu kazandığında veya kaybettiğinde çağrılır. Bu, bir etkinlikte mikrofon veya kamera gibi paylaşılan tekil bir kaynak kullanıldığında önemlidir:
Kotlin
override fun onTopResumedActivityChanged(topResumed: Boolean) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Java
@Override public void onTopResumedActivityChanged(boolean topResumed) { if (topResumed) { // Top resumed activity. // Can be a signal to re-acquire exclusive resources. } else { // No longer the top resumed activity. } }
Bir uygulamanın, paylaşılan bir donanım parçasının kaldırılması gibi başka nedenlerle de kaynak kaybedebileceğini unutmayın.
Her durumda, uygulama mevcut kaynakları etkileyen etkinlikleri ve durum değişikliklerini sorunsuz bir şekilde ele almalıdır.
Kamera kullanan uygulamalar için CameraManager.AvailabilityCallback#onCameraAccessPrioritiesChanged()
, kameraya erişmeye çalışmanın iyi bir zaman olabileceğine dair bir ipucu sağlar.
Bu yöntem Android 10 (API düzeyi 29) sürümünden itibaren kullanılabilir.
Kamerayı kullanan diğer uygulamalar diğer ekranlarda açılabileceğinden, resizeableActivity=false
'ün özel kamera erişimi garantisi olmadığını unutmayın.
Uygulamanızın, odağı kaybettiğinde kamerayı bırakması gerekmez. Örneğin, kullanıcı yeni odaklanan en üstte devam eden uygulamayla etkileşimde bulunurken kamera önizlemesini devam ettirmek isteyebilirsiniz. Uygulamanızın, en üstte devam eden uygulama olmadığında kamerayı çalıştırmaya devam etmesi sorun değildir ancak bağlantının kesilmesi durumunu düzgün şekilde ele alması gerekir. Devam eden en üst uygulama kamerayı kullanmak istediğinde kamerayı açabilir ve uygulamanız erişimi kaybeder. Uygulamanız, odağı tekrar aldığında kamerayı yeniden açabilir.
Bir uygulama CameraDevice.StateCallback#onDisconnected()
geri çağırma aldıktan sonra kamera cihazında yapılan sonraki aramalar CameraAccessException
hatası verir.
Çoklu ekran
Android 10 (API düzeyi 29), ikincil ekranlardaki etkinlikleri destekler. Birden fazla ekrana sahip bir cihazda çalışan bir etkinliği kullanıcılar bir ekrandan diğerine taşıyabilir. Çoklu devam ettirme, çoklu ekran senaryoları için de geçerlidir. Birden fazla etkinlik aynı anda kullanıcı girişi alabilir.
Uygulamalar, başlatıldıklarında veya başka bir etkinlik oluşturduklarında hangi ekranda çalıştırılacaklarını belirtebilir. Bu davranış, manifest dosyasında tanımlanan etkinlik başlatma moduna ve etkinliği başlatan öğe tarafından ayarlanan intent işaretlerine ve seçeneklere bağlıdır. Daha fazla bilgi için ActivityOptions
sınıfına bakın.
Bir etkinlik ikincil bir ekrana taşındığında bağlam güncellemesi, pencere boyutlandırması, yapılandırma ve kaynak değişiklikleri yapılabilir. Etkinlik yapılandırma değişikliğini yönetirse onConfigurationChanged()
içinde etkinlik bilgilendirilir. Aksi takdirde etkinlik yeniden başlatılır.
Bir etkinlik, yapılandırma değişikliğini ele alıyorsa onCreate()
ve onConfigurationChanged()
'deki mevcut ekranı kontrol etmelidir. Ekran değiştiğinde kaynakları ve düzenleri güncellediğinizden emin olun.
Bir etkinlik için seçilen başlatma modu birden fazla örneğine izin veriyorsa ikincil bir ekranda başlatma, etkinliğin yeni bir örneğini oluşturabilir. Her iki etkinlik de aynı anda devam ettirilir.
Android 8.0'da kullanıma sunulan çoklu ekran API'leri hakkında da bilgi edinebilirsiniz.
Etkinlik ve uygulama bağlamı
Çoklu ekranlarda doğru bağlamı kullanmak çok önemlidir. Kaynaklara erişirken etkinlik bağlamı (gösterilir) uygulama bağlamından (gösterilmez) farklıdır.
Etkinlik bağlamı, ekranla ilgili bilgileri içerir ve her zaman etkinliğin göründüğü ekran alanına göre ayarlanır. Bu sayede, uygulamanızın ekran yoğunluğu veya pencere metrikleri hakkında doğru bilgileri alabilirsiniz. Mevcut pencere veya ekran hakkında bilgi edinmek için her zaman etkinlik bağlamını (veya kullanıcı arayüzüne dayalı başka bir bağlamı) kullanmanız gerekir. Bu durum, bağlamdaki bilgileri kullanan bazı sistem API'lerini de etkiler (örneğin, Toast'lara genel bakış bölümüne bakın).
Etkinlik penceresi yapılandırması ve üst ekran, kaynakları ve bağlamı tanımlar. Mevcut ekranı aşağıdaki gibi alın:
Kotlin
val activityDisplay = activity.getDisplay()
Java
Display activityDisplay = activity.getDisplay();
Geçerli etkinlik aralığı metriklerini alın:
Kotlin
val windowMetrics = activity.getWindowManager().getCurrentWindowMetrics()
Java
WindowMetrics windowMetrics = activity.getWindowManager().getCurrentWindowMetrics();
Mevcut sistem yapılandırması için maksimum pencere metriklerini alın:
Kotlin
val maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics()
Java
WindowMetrics maximumWindowMetrics = activity.getWindowManager().getMaximumWindowMetrics();
Maksimum pencere metrikleri, hesaplama yapmak, düzen seçimleri yapmak veya önceden getirilecek kaynakların boyutunu belirlemek için kullanılır. Bu özelliği onCreate()
'te kullanabilmeniz, ilk düzen geçişinden önce bu kararları vermenizi sağlar. Bu metrikler, belirli görüntüleme öğelerini yerleştirmek için kullanılmamalıdır. Bunun yerine Configuration
nesnesinden alınan bilgileri kullanın.
Ekran kesimleri
Katlanabilir cihazların, katlanmış ve açılmış hallerinde farklı kesit geometrileri olabilir. Kesinti sorunlarını önlemek için Ekran kesimlerini destekleme başlıklı makaleyi inceleyin.
İkincil ekranlar
Kullanılabilir ekranları DisplayManager
sistem hizmetinden alabilirsiniz:
Kotlin
val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager val displays = displayManager.getDisplays()
Java
DisplayManager displayManager = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays();
Belirli bir ekranla ilgili bilgi edinmek için Display
sınıfını kullanın. Örneğin, ekran boyutu veya ekranın güvenli olup olmadığını belirten işaretler.
Ancak ekran boyutunun, uygulamanıza ayrılan görüntüleme alanıyla aynı olacağını varsaymayın. Çoklu pencere modunda uygulamanızın ekranın bir bölümünü kapladığını unutmayın.
Bir etkinliğin ekranda başlatılıp başlatılamayacağını belirleme:
Kotlin
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager val activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent)
Java
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean activityAllowed = activityManager.isActivityStartAllowedOnDisplay(context, displayId, intent);
Ardından, etkinliği ekranda başlatın:
Kotlin
val options = ActivityOptions.makeBasic() options.setLaunchDisplayId(targetDisplay.displayId) startActivity(intent, options.toBundle())
Java
ActivityOptions options = ActivityOptions.makeBasic(); options.setLaunchDisplayId(targetDisplay.displayId); startActivity(intent, options.toBundle());
Çoklu ekran desteği
Android, yazılım klavyeleri, duvar kağıtları ve başlatıcılar için çoklu ekran desteği sağlar.
Yazılım klavyesi
Ekran, sistem süslemelerini destekleyecek şekilde yapılandırılmışsa ikincil ekranda klavye gösterilebilir. Bir metin alanı o ekranda giriş isterse giriş yöntemi düzenleyici otomatik olarak görünür.
Duvar kağıdı
Android 10'da (API düzeyi 29) ikincil ekranlarda duvar kağıdı olabilir. Çerçeve, her ekran için ayrı bir WallpaperService.Engine
örneği oluşturur. Her motorun yüzeyinin ayrı ayrı çizildiğinden emin olun. Geliştiriciler, WallpaperService.Engine#getDisplayContext()
'teki görüntüleme bağlamını kullanarak öğeleri yükleyebilir. Ayrıca, WallpaperInfo.xml
dosyanızı android:supportsMultipleDisplays="true"
olarak ayarlayın.
Launcher'lar
Yeni bir intent filtresi kategorisi olan SECONDARY_HOME
, ikincil ekranlar için özel bir etkinlik sağlar. Etkinliğin örnekleri, sistem süslemelerini destekleyen tüm ekranlarda (her ekran için bir tane) kullanılır.
<activity>
...
<intent-filter>
<category android:name="android.intent.category.SECONDARY_HOME" />
...
</intent-filter>
</activity>
Etkinliğin, birden fazla örneği engellemeyen ve farklı ekran boyutlarına uyum sağlayabilen bir başlatma modu olmalıdır. Başlatma modu singleInstance
veya singleTask
olamaz.
Örneğin, Launcher3
için AOSP uygulaması SECONDARY_HOME
etkinliğini destekler.
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 mevcut pencereleme durumu için birWindowMetrics
nesnesi döndürür.getMaximumWindowMetrics()
: Sistemin en büyük olası pencereleme durumu içinWindowMetrics
döndürür.
Jetpack WindowManager kitaplık yöntemleri computeCurrentWindowMetrics()
ve computeMaximumWindowMetrics()
sırasıyla benzer işlevler sunar ancak API düzeyi 14 ile geriye dönük uyumludur.
Mevcut ekran dışındaki ekranlarla ilgili metrikler elde etmek için aşağıdakileri yapın (kod snippet'inde gösterildiği gibi):
- Görüntülü reklam bağlamı oluşturma
- Görüntüleme için bir pencere bağlamı oluşturma
- Pencere bağlamının
WindowManager
değerini alma - Uygulamanın kullanabileceği maksimum ekran alanının
WindowMetrics
değerini alın
Kotlin
val windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager::class.java) .maximumWindowMetrics
Java
WindowMetrics windowMetrics = context.createDisplayContext(display) .createWindowContext(WindowManager.LayoutParams.TYPE_APPLICATION, null) .getSystemService(WindowManager.class) .getMaximumWindowMetrics();
Kullanımdan kaldırılan yöntemler
Display
yöntemleri getSize()
ve getMetrics()
, API 30 seviyesinde yeni WindowManager
yöntemleri lehine kullanımdan kaldırıldı.
Android 12 (API düzeyi 31), Display
yöntemleri getRealSize()
ve getRealMetrics()
için desteği sonlandırıyor ve bu yöntemlerin davranışını getMaximumWindowMetrics()
'ın davranışına daha yakın olacak şekilde güncelliyor.
Çoklu pencere modu yapılandırması
Uygulamanız Android 7.0 (API düzeyi 24) veya sonraki sürümleri hedefliyorsa uygulamanızın etkinliklerinin çoklu pencere modunu nasıl ve ne ölçüde destekleyeceğini yapılandırabilirsiniz. Hem boyutu hem de düzeni kontrol etmek için manifest dosyanızda özellikler ayarlayabilirsiniz. Kök etkinliğin özellik ayarları, görev yığınındaki tüm etkinlikler için geçerlidir. Örneğin, kök etkinlikte android:resizeableActivity="true"
varsa görev yığınındaki tüm etkinlikler yeniden boyutlandırılabilir. Chromebook gibi daha büyük bazı cihazlarda, android:resizeableActivity="false"
belirtseniz bile uygulamanız yeniden boyutlandırılabilir bir pencerede çalışabilir. Bu durum uygulamanızın çalışmamasına neden oluyorsa uygulamanızın bu tür cihazlarda kullanılabilirliğini kısıtlamak için Google Play'deki filtreleri kullanabilirsiniz.
Android 12 (API düzeyi 31) varsayılan olarak çoklu pencere modunu kullanır. Büyük ekranlarda (orta veya genişletilmiş pencere boyutu sınıfı), tüm uygulamalar uygulama yapılandırmasından bağımsız olarak çoklu pencere modunda çalışır. Küçük ekranlarda sistem, etkinliğin çok pencereli modda çalışıp çalışamayacağını belirlemek için etkinliğin minWidth
, minHeight
ve resizeableActivity
ayarlarını kontrol eder.
resizeableActivity
API düzeyi 30 ve altı için çoklu pencere modunu etkinleştirmek veya devre dışı bırakmak üzere manifest'inizin <activity>
veya <application>
öğesinde bu özelliği ayarlayın:
<application
android:name=".MyActivity"
android:resizeableActivity=["true" | "false"] />;
Bu özellik true
olarak ayarlanırsa etkinlik bölünmüş ekran ve masaüstü pencere modlarında başlatılabilir. Özellik false
olarak ayarlanırsa etkinlik çoklu pencere modunu desteklemez. Değer false ise ve kullanıcı etkinliği çoklu pencere modunda başlatmaya çalışırsa etkinlik tam ekranı devralır.
Uygulamanız API düzeyi 24 veya üstünü hedefliyorsa ancak bu özellik için bir değer belirtmezseniz özelliğin değeri varsayılan olarak true olur.
Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa bu özellik küçük ve büyük ekranlarda farklı şekilde çalışır:
- Büyük ekranlar (orta veya genişletilmiş pencere boyutu sınıfı): Tüm uygulamalar çoklu pencere modunu destekler. Bu özellik, bir etkinliğin yeniden boyutlandırılıp boyutlandırılamayacağını belirtir.
resizeableActivity="false"
ise uygulama, ekran boyutlarına uymak için gerektiğinde uyumluluk moduna geçirilir. - Küçük ekranlar (kompakt pencere boyutu sınıfı):
resizeableActivity="true"
ve etkinliğin minimum genişliği ve minimum yüksekliği çoklu pencere koşullarını karşılıyorsa etkinlik çoklu pencere modunu destekler.resizeableActivity="false"
ise etkinlik minimum genişliği ve yüksekliğinden bağımsız olarak çoklu pencere modunu desteklemez.
supportsPictureInPicture
Etkinliğin pencere içinde pencere modunu destekleyip desteklemediğini belirtmek için bu özelliği manifest'inizin <activity>
düğümünde ayarlayın.
<activity
android:name=".MyActivity"
android:supportsPictureInPicture=["true" | "false"] />
configChanges
Kullanıcı bir pencereyi yeniden boyutlandırdığında olduğu gibi çoklu pencere yapılandırma değişikliklerini kendiniz işlemek için uygulama manifest'inizin <activity>
düğümüne en az aşağıdaki değerlerle android:configChanges
özelliğini ekleyin:
<activity
android:name=".MyActivity"
android:configChanges="screenSize | smallestScreenSize
| screenLayout | orientation" />
android:configChanges
eklendikten sonra etkinliğiniz ve parçalarınız, silinip yeniden oluşturulmak yerine onConfigurationChanged()
için geri çağırma alır. Ardından görünümlerinizi manuel olarak güncelleyebilir, kaynakları yeniden yükleyebilir ve gerektiğinde diğer işlemleri gerçekleştirebilirsiniz.
<layout>
Android 7.0 (API düzeyi 24) ve sonraki sürümlerde <layout>
manifest öğesi, bir etkinliğin çok pencereli modda nasıl davrandığını etkileyen çeşitli özellikleri destekler:
android:defaultHeight
,android:defaultWidth
: Etkinlik, masaüstü pencere modunda başlatıldığında varsayılan yükseklik ve genişlik.android:gravity
: Etkinliğin masaüstü pencere modunda başlatılırken ilk yerleşimi. Uygun değerler içinGravity
sınıfına bakın.android:minHeight
,android:minWidth
: Hem bölünmüş ekran hem de masaüstü pencere modlarında etkinlik için minimum yükseklik ve minimum genişlik. Kullanıcı, bölünmüş ekran modunda ayırıcıyı hareket ettirerek bir etkinliği belirtilen minimum boyuttan daha küçük hale getirirse sistem, etkinliği kullanıcının istediği boyuta kırpar.
Aşağıdaki kodda, bir etkinliğin varsayılan boyutu ve konumu ile etkinliğin masaüstü pencere modunda gösterildiğindeki minimum boyutu nasıl belirtileceği gösterilmektedir:
<activity android:name=".MyActivity">
<layout android:defaultHeight="500dp"
android:defaultWidth="600dp"
android:gravity="top|end|..."
android:minHeight="450dp"
android:minWidth="300dp" />
</activity>
Çalışma zamanında çoklu pencere modu
Android 7.0'dan itibaren sistem, çoklu pencere modunda çalışabilen uygulamaları destekleyen işlevler sunar.
Çoklu pencere modunda devre dışı bırakılan özellikler
Android, çoklu pencere modunda cihaz ekranını diğer etkinliklerle veya uygulamalarla paylaşan bir etkinliğe uygulanmayan özellikleri devre dışı bırakabilir ya da yoksayabilir.
Ayrıca, bazı sistem kullanıcı arayüzü özelleştirme seçenekleri devre dışı bırakılır. Örneğin, çoklu pencere modunda çalışan uygulamalar durum çubuğunu gizleyemez (Sistem kullanıcı arayüzü görünürlüğünü kontrol etme bölümüne bakın).
Sistem, android:screenOrientation
özelliğindeki değişiklikleri yoksayar.
Çoklu pencere modu sorguları ve geri çağırma işlevleri
Activity
sınıfı, çok pencereli modu desteklemek için aşağıdaki yöntemleri sunar:
isInMultiWindowMode()
: Etkinliğin çok pencereli modda olup olmadığını belirtir.isInPictureInPictureMode()
: Etkinliğin pencere içinde pencere modunda olup olmadığını belirtir.onMultiWindowModeChanged()
: Sistem, etkinlik çoklu pencere moduna girdiğinde veya bu moddan çıktığında bu yöntemi çağırır. Sistem, etkinlik çoklu pencere moduna giriyorsa yönteme true değerini, etkinlik çoklu pencere modundan çıkıyorsa false değerini iletir.onPictureInPictureModeChanged()
: Sistem, etkinlik pencere içinde pencere moduna girdiğinde veya bu moddan çıktığında bu yöntemi çağırır. Sistem, etkinlik pencere içinde pencere moduna giriyorsa yönteme doğru değerini, etkinlik pencere içinde pencere modundan çıkıyorsa yanlış değerini iletir.
Fragment
sınıfı, bu yöntemlerin çoğunun sürümlerini gösterir. Örneğin, Fragment.onMultiWindowModeChanged()
.
Pencere içinde pencere modu
Bir etkinliği pencere içinde pencere moduna almak için enterPictureInPictureMode()
yöntemini çağırın. Cihaz pencere içinde pencere modunu desteklemiyorsa bu yöntemin hiçbir etkisi olmaz. Daha fazla bilgi için Bilinmeyen bir dilde yayınlanan videoları altyazılarla izleme başlıklı makaleyi inceleyin.
Çoklu pencere modunda yeni etkinlikler
Yeni bir etkinlik başlattığınızda, yeni etkinliğin mümkünse mevcut etkinliğin yanında gösterilmesi gerektiğini belirtebilirsiniz. Sisteme yeni etkinliği bitişik bir pencerede oluşturmaya çalışmasını söyleyen intent işaretçisini FLAG_ACTIVITY_LAUNCH_ADJACENT
kullanın. Böylece iki etkinlik ekranı paylaşır. Sistem bunu yapmak için elinden geleni yapar ancak bu işlemin gerçekleşeceği garanti edilmez.
Bir cihaz masaüstü pencere modundaysa ve yeni bir etkinlik başlatıyorsanız ActivityOptions.setLaunchBounds()
çağrısını yaparak yeni etkinliğin boyutlarını ve ekran konumunu belirtebilirsiniz. Cihaz çoklu pencere modunda değilse yöntemin hiçbir etkisi olmaz.
API düzeyi 30 ve altında, bir görev yığınında etkinlik başlatırsanız etkinlik, ekrandaki etkinliğin yerini alır ve tüm çok pencereli özelliklerini devralır. Yeni etkinliği çoklu pencere modunda ayrı bir pencere olarak başlatmak istiyorsanız yeni bir görev yığınında başlatmanız gerekir.
Android 12 (API düzeyi 31), uygulamaların bir uygulamanın görev penceresini birden fazla etkinlik arasında bölmelerine olanak tanır. Bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak uygulamanızın etkinliklerini nasıl (tam ekran, yan yana veya yığılmış) göstereceğini siz belirlersiniz.
Sürükleme ve bırakma
Kullanıcılar, iki etkinlik ekranı paylaşırken verileri bir etkinlikten diğerine sürükleyip bırakabilir. (Android 7.0'dan önce kullanıcılar yalnızca tek bir etkinlikte veri sürükleyip bırakabiliyordu.) Bırakılan içeriği kabul etme desteğini hızlıca eklemek için DropHelper
API'sini inceleyin. Sürükle ve bırak işleviyle ilgili kapsamlı bilgi için Sürükle ve bırak işlevini etkinleştirme başlıklı makaleyi inceleyin.
Çoklu örnek
Her kök etkinliğin kendi penceresinde gösterilen kendi görevi vardır. Uygulamanızın yeni bir örneğini ayrı bir pencerede başlatmak için FLAG_ACTIVITY_NEW_TASK
işaretiyle yeni etkinlikler başlatın. Yeni pencere için belirli bir konum istemek üzere bu ayarı çoklu pencere özellikleri ile birleştirebilirsiniz. Örneğin, bir alışveriş uygulaması, ürünleri karşılaştırmak için birden fazla bitişik pencere gösterebilir.
Android 12 (API düzeyi 31) ve sonraki sürümler, etkinlik yerleştirme özelliğinde bir etkinliğin iki örneğini aynı görev penceresinde yan yana başlatmanıza olanak tanır.
Kullanıcıların uygulama başlatıcıdan veya görev çubuğundan uygulamanızın başka bir örneğini başlatmasına izin vermek istiyorsanız başlatıcı etkinliğinizin manifest dosyasında android:resizeableActivity="true"
değerini ayarlayın ve birden fazla örneği engelleyen bir başlatma modu kullanmayın. Örneğin, FLAG_ACTIVITY_MULTIPLE_TASK
veya FLAG_ACTIVITY_NEW_DOCUMENT
ayarlandığında bir singleInstancePerTask
etkinliği farklı görevlerde birden çok kez oluşturulabilir.
Android 15 (API düzeyi 35) ve sonraki sürümlerde PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI
, çoklu örnek için destek beyan etmenizi sağlar. Mülk, sistem kullanıcı arayüzünün uygulamanın birden fazla örneğini oluşturmak için kullanıcıya kontroller göstermesi için açık bir sinyaldir. Mülk, başlatma modundan bağımsızdır ancak yalnızca bir etkinliğin veya uygulamanın başlatma modu mülkle uyumlu olduğunda (ör. başlatma modu singleInstance
olmadığında) kullanılmalıdır.
Katlanabilir bir cihazda bir uygulamanın birden fazla örneği ayrı pencerelerde çalışıyorsa cihazın duruşu değişirse bir veya daha fazla örnek arka plana gönderilebilir. Örneğin, katlanmış bir cihazın katlama noktasının her iki tarafında ayrı pencerelerde çalışan iki uygulama örneği olduğunu varsayalım. Cihaz katlanmışsa her iki örneğin pencerelerini daha küçük bir ekrana sığdırmaya çalışmak yerine örneklerden biri sonlandırılabilir.
Çoklu pencere modu doğrulaması
Uygulamanız API düzeyi 24 veya üstünü hedeflese de hedeflemese de kullanıcının Android 7.0 veya sonraki bir sürüm çalıştıran bir cihazda uygulamanızı çoklu pencere modunda başlatmaya çalışması ihtimaline karşı uygulamanızın çoklu pencere modunda nasıl davrandığını doğrulamanız gerekir.
Test cihazları
Android 7.0 (API seviyesi 24) veya sonraki sürümleri çalıştıran cihazlar çoklu pencere modunu destekler.
API düzeyi 23 veya daha düşük
Kullanıcılar uygulamayı çoklu pencere modunda kullanmaya çalıştıklarında, uygulama sabit bir yönü belirtmediği sürece sistem uygulamayı zorla yeniden boyutlandırır.
Uygulamanız sabit bir yönü belirtmiyorsa uygulamanızı Android 7.0 veya sonraki bir sürümü çalıştıran bir cihazda başlatıp uygulamayı bölünmüş ekran moduna getirmeyi denemelisiniz. Uygulama zorla yeniden boyutlandırıldığında kullanıcı deneyiminin kabul edilebilir olup olmadığını doğrulayın.
Uygulama sabit bir yönü belirtiyorsa uygulamayı çoklu pencere moduna geçirmeyi denemelisiniz. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.
API düzeyleri 24 ila 30
Uygulamanız API düzeyleri 24 ila 30'u hedefliyorsa ve çoklu pencere desteğini devre dışı bırakmıyorsa hem bölünmüş ekran hem de masaüstü pencere modlarında aşağıdaki davranışı doğrulayın:
Uygulamayı tam ekranda başlatın, ardından Sonlar düğmesine uzun basarak çoklu pencere moduna geçin. Uygulamanın düzgün şekilde geçiş yaptığını doğrulayın.
Uygulamayı doğrudan çoklu pencere modunda başlatın ve düzgün şekilde başlatıldığını doğrulayın. Son Kullanılanlar düğmesine basıp uygulamanızın başlık çubuğuna uzun basarak ve ekrandaki vurgulanan alanlardan birine sürükleyerek uygulamayı çoklu pencere modunda başlatabilirsiniz.
Bölünmüş ekran modunda ekran ayırıcıyı sürükleyerek uygulamanızın boyutunu değiştirin. Uygulamanın kilitlenmeden yeniden boyutlandırıldığını ve gerekli kullanıcı arayüzü öğelerinin görünür olduğunu doğrulayın.
Uygulamanız için minimum boyutlar belirttiyseniz uygulamayı, pencere boyutu bu boyutlardan daha küçük olacak şekilde yeniden boyutlandırmayı deneyin. Uygulamayı belirtilen minimum boyutlardan daha küçük olacak şekilde yeniden boyutlandıramadığınızı doğrulayın.
Tüm testler boyunca uygulamanızın performansının kabul edilebilir olduğunu doğrulayın. Örneğin, uygulama yeniden boyutlandırıldıktan sonra kullanıcı arayüzünün güncellenmesi için çok uzun bir gecikme olmadığını doğrulayın.
API düzeyi 31 veya sonraki sürümler
Uygulamanız API düzeyi 31 veya üstünü hedefliyorsa ve ana etkinliğin minimum genişliği ile minimum yüksekliği, kullanılabilir ekran alanının ilgili boyutlarından küçük veya bu boyutlara eşitse API düzeyleri 24 ila 30 için listelenen tüm davranışları doğrulayın.
Test yapılacaklar listesi
Uygulamanızın çoklu pencere modundaki performansını doğrulamak için aşağıdaki işlemleri deneyin. Aksi belirtilmediği sürece bu işlemleri hem bölünmüş ekran hem de masaüstü pencere modunda denemeniz gerekir.
Çoklu pencere moduna girip çıkabilirsiniz.
Uygulamanızdan başka bir uygulamaya geçin ve uygulamanın görünür ancak etkin değilken düzgün davrandığını doğrulayın. Örneğin, uygulamanızda video oynatılıyorsa kullanıcı başka bir uygulamayla etkileşimde bulunurken videonun oynatılmaya devam ettiğini doğrulayın.
Bölünmüş ekran modunda, uygulamanızı hem daha büyük hem de daha küçük yapmak için ekran ayırıcıyı hareket ettirmeyi deneyin. Bu işlemleri hem yan yana hem de diğer yapılandırmaların üzerinde deneyin. Uygulamanın kilitlenmediğinden, temel işlevlerin görünür olduğundan ve yeniden boyutlandırma işleminin çok uzun sürmediğinden emin olun.
Hızlı bir şekilde art arda birkaç yeniden boyutlandırma işlemi gerçekleştirin. Uygulamanızın kilitlenmediğini veya bellek sızıntısı olmadığını doğrulayın. Android Studio'nun Bellek Profilleyicisi, uygulamanızın bellek kullanımı hakkında bilgi sağlar (Bellek Profilleyici ile uygulamanızın bellek kullanımını inceleme başlıklı makaleyi inceleyin).
Uygulamanızı çeşitli pencere yapılandırmalarında normal şekilde kullanın ve uygulamanın düzgün şekilde davranıp davranmadığını doğrulayın. Metnin okunabilir ve kullanıcı arayüzü öğelerinin etkileşim kurulamayacak kadar küçük olmadığından emin olun.
Çoklu pencere desteği devre dışı bırakıldı
24 ile 30 arasındaki API düzeylerinde android:resizeableActivity="false"
ayarını yaparak çoklu pencere desteğini devre dışı bıraktıysanız uygulamanızı Android 7.0 ile 11 arasındaki sürümleri çalıştıran bir cihazda başlatmalı ve uygulamayı bölünmüş ekran ve masaüstü pencere modlarına yerleştirmeye çalışmalısınız. Bunu yaptığınızda uygulamanın tam ekran modunda kaldığını doğrulayın.
Ek kaynaklar
Android'de çoklu pencere desteği hakkında daha fazla bilgi için:
- Android MultiWindowPlayground örneği
Sizin için önerilenler * Not: JavaScript kapalıyken bağlantı metni gösterilir * Cihaz uyumluluk modu * Büyük ekranda yeniden boyutlandırmayı destekleme * Yapılandırma değişikliklerini işleme