Android el cihazları için pencere içinde pencere (PiP) özelliği, kullanıcıların etkinliği devam eden bir uygulamayı küçük bir pencerede yeniden boyutlandırmasına olanak tanır. Kullanıcı diğer işlemleri gerçekleştirirken içerik oynatılmaya devam ettiği için PiP özellikle video uygulamaları için kullanışlıdır. Kullanıcılar, bu pencerenin konumunu SystemUI üzerinden değiştirebilir ve uygulama tarafından sağlanan üç adede kadar işlemle, şu anda pencere içinde pencere olarak çalışan uygulamayla etkileşim kurabilir.
PIP, destekleyen uygulamalardan açık bir şekilde etkinleştirmeyi gerektirir ve etkinlik bazında çalışır. (Tek bir uygulamada birden fazla etkinlik bulunabilir. Bunlardan yalnızca biri PIP'dedir.) Etkinlikler, enterPictureInPictureMode()
çağrısı yaparak pencere içinde pencere moduna girme isteğinde bulunur ve onPictureInPictureModeChanged()
biçiminde etkinlik geri çağırma alır.
setPictureInPictureParams()
yöntemi, PIP ve özel işlemler sırasında etkinliklerin en boy oranını kontrol etmesine olanak tanır. Bu sayede kullanıcılar, etkinliği genişletmek zorunda kalmadan etkinlikle etkileşim kurabilir. PIP'de etkinlik duraklatılmış ancak oluşturulma aşamasındadır ve doğrudan dokunma girişi veya pencere odağı almaz.
Aynı anda yalnızca bir görev PIP'de olabilir.
Daha fazla bilgi için Android geliştirici Resim içinde resim belgelerini inceleyin.
Cihaz gereksinimleri
PIP'yi desteklemek için /android/frameworks/base/core/java/android/content/pm/PackageManager.java
'te PackageManager#FEATURE_PICTURE_IN_PICTURE
sistem özelliğini etkinleştirin.
PIP'yi destekleyen cihazların en küçük genişliği 220 dp'den büyük olmalıdır. Bölünmüş ekran çoklu pencereye benzer şekilde PIP, ekranda aynı anda birden fazla etkinliğin yürütülmesine olanak tanır. Bu nedenle, cihazlarda bu kullanım alanını desteklemek için yeterli CPU ve RAM bulunmalıdır.
Uygulama
Etkinlik yaşam döngüsü yönetiminin çoğu, sistemde ActivityManager
ile WindowManager
arasında gerçekleşir.
Referans kullanıcı arayüzü uygulaması SystemUI
paketindedir.
Sistemde yapılan değişiklikler, Uyumluluk Test Paketi (CTS) testleri tarafından tanımlanan doğal davranışını etkilememelidir. PIP'nin sistem mantığı, temel olarak "sabitlenmiş" yığın içindeki görev ve etkinliklerin yönetimiyle ilgilidir. Sınıflara kısa bir genel bakış:
ActivityRecord
: Her etkinliğin pencere içinde pencere durumunu izler. Kullanıcıların, kilit ekranından veya VR sırasında gibi belirli durumlarda PIP'ye girmesini engellemek içincheckEnterPictureInPictureState()
alanına durumlar ekleyin.ActivityManagerService
: PIP'ye girme isteğinde bulunmak için etkinlikten gelen birincil arayüz ve PIP etkinlik durumunu değiştirmek içinWindowManager
veSystemUI
çağrılarından gelen arayüz.ActivityStackSupervisor
: Görevleri sabitlenmiş yığına veya yığından taşımak içinActivityManagerService
çağrılır. Bu sıradaWindowManager
gerektiği gibi güncellenir.PinnedStackWindowController
:ActivityManager
'dekiWindowManager
arayüzü.PinnedStackController
: SistemdeSystemUI
olarak yapılan değişiklikleri (ör. IME gösterilir/gizlenir, en boy oranı değiştirilir veya işlemler değiştirilir) bildirir.BoundsAnimationController
: Boyut değiştirirken PIP etkinlik pencerelerini, yapılandırma değişikliği tetiklemeyecek şekilde animasyonlu olarak gösterir.PipSnapAlgorithm
: Hem sistemde hem de SystemUI'de kullanılan, ekranın kenarlarına yakın PIP penceresinin sabitlenme davranışını kontrol eden ortak sınıf.
Referans SystemUI
, kullanıcılara özel işlemler sunmayı ve genişletme ve kapatma gibi genel işlemleri destekleyen tam bir PIP uygulaması sağlar.
Cihaz üreticileri, CDD tarafından tanımlanan doğal davranışları etkilemediği sürece bu değişikliklerden yararlanabilir. Sınıflara kısa bir genel bakış:
PipManager
:SystemUI
ile başlayanSystemUI
bileşeni.PipTouchHandler
: PIP'yi değiştiren hareketleri kontrol eden dokunma işleyici. Bu yalnızca PIP için giriş tüketicisi etkinken kullanılır (InputConsumerController
bölümüne bakın). Buraya yeni hareketler eklenebilir.PipMotionHelper
: PIP konumunu ve ekrandaki izin verilen bölgeyi izleyen bir kolaylık sınıfı. PIP'nin konumunu ve boyutunu güncellemek veya bunlara animasyon uygulamak içinActivityManagerService
'e yönlendirilen aramalar.PipMenuActivityController
: Şu anda PIP'de olan etkinlik tarafından sağlanan işlemleri gösteren bir etkinlik başlatır. Bu etkinlik, görev yer paylaşımı etkinliğidir ve etkileşimli olması için yer paylaşımlı giriş tüketicisini kaldırır.PipMenuActivity
: Menü etkinliğinin uygulanması.PipMediaController
: Medya oturumu PIP'deki varsayılan işlemleri etkileyebilecek bir şekilde değiştiğindeSystemUI
öğesini güncelleyen dinleyici.PipNotificationController
: Kullanıcı PIP özelliğini kullanırken bildirimlerin etkin olmasını sağlayan kontrolör.PipDismissViewController
: PIP ile etkileşime geçmeye başlayan kullanıcılara, PIP'nin kapatılabileceğini belirten yer paylaşımı.
Varsayılan yerleşim
PIP'nin varsayılan yerleşimini kontrol eden çeşitli sistem kaynakları vardır:
config_defaultPictureInPictureGravity
: PIP'nin yerleştirileceği köşeyi kontrol eden gravity tam sayısı (ör.BOTTOM|RIGHT
).config_defaultPictureInPictureScreenEdgeInsets
: PIP'yi yerleştirmek için ekranın kenarlarından olan ofsetler.config_pictureInPictureDefaultSizePercent
veconfig_pictureInPictureDefaultAspectRatio
: Ekran genişliğinin yüzdesi ile en boy oranının birleşimi, PIP'nin boyutunu kontrol eder. Hesaplanan varsayılan PIP boyutu, CTS ve CDD tarafından tanımlanan@dimen/default_minimal_size_pip_resizable_task
değerinden küçük olmamalıdır.config_pictureInPictureSnapMode
:PipSnapAlgorithm
'da tanımlandığı şekilde sabitleme davranışı.
Cihaz uygulamaları, CDD ve CTS'de tanımlanan minimum ve maksimum en boy oranlarını değiştirmemelidir.
İzinler
AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) sürümündeki paket başına "uygulama işlemi" (OP_PICTURE_IN_PICTURE
), kullanıcıların sistem ayarları aracılığıyla PIP'yi uygulama düzeyinde kontrol etmesine olanak tanır.
Bir etkinlik, pencere içinde pencere moduna girme isteğinde bulunduğunda cihaz uygulamalarının bu denetime uyması gerekir.
Test
PIP uygulamalarını test etmek için /cts/hostsidetests/services/activitymanager
altındaki ana makine tarafı CTS testlerinde bulunan, özellikle ActivityManagerPinnedStackTests.java
bölümündeki tüm pencere içinde pencereyle ilgili testleri çalıştırın.