Etkinlik yerleştirme, bir öğeyi bölerek büyük ekranlı cihazlarda uygulamaları optimize eder. uygulamanın görev penceresinin iki etkinlik veya aynı iki etkinlik etkinliği'ne dokunun.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/settings_app.png?authuser=19&hl=tr)
Uygulamanızda birden fazla etkinlik varsa etkinlik yerleştirme özelliği; tabletlerde, katlanabilir cihazlarda ve ChromeOS cihazlarda gelişmiş bir kullanıcı deneyimi sunmanızı sağlar.
Etkinlik yerleştirme, kodun yeniden düzenlenmesini gerektirmez. Bir XML yapılandırma dosyası oluşturarak veya Jetpack WindowManager API çağrıları yaparak uygulamanızın etkinliklerini yan yana veya yığın halinde nasıl göstereceğini siz belirlersiniz.
Küçük ekran desteği otomatik olarak devam eder. Uygulamanız etkinlikler üst üste yığılıyor. Şu tarihte: etkinlikler yan yana görüntülenir. Sistem, oluşturduğunuz yapılandırmaya göre sunun; dallara ayırma mantık yürütmeniz gerekir.
Etkinlik yerleştirme özelliği, cihaz yönü değişikliklerini kabul eder ve katlanabilir cihazlarda sorunsuz şekilde çalışır. Cihaz katlanıp açılırken etkinlikleri yığma ve açma işlemleri
Etkinlik yerleştirme, Android 12L (API düzeyi 32) ve sonraki sürümleri çalıştıran büyük ekranlı cihazların çoğunda desteklenir.
Görev penceresini böl
Etkinlik yerleştirme, uygulama görevi penceresini iki kapsayıcıya ayırır: birincil ve ikincil. Kapsayıcılar, ana etkinlik veya halihazırda kapsayıcılarda bulunan diğer etkinliklerden gelen verileri toplamanızı sağlar.
Etkinlikler kullanıma sunuldukça ikincil kapsayıcıda yığılır ve üst kısımda bulunan küçük boyutlu ikincil kapsayıcı Böylece, etkinlik yığma ve geri gezinme işlevleri hâlihazırda uygulamanızda yerleşik olarak bulunan etkinliklerin sıralaması.
Etkinlik yerleştirme, etkinlikleri çeşitli şekillerde görüntülemenizi sağlar. Uygulamanız yan yana iki etkinlik başlatarak görev penceresini bölebilir aynı anda:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_b.png?authuser=19&hl=tr)
Veya tüm görev penceresini kaplayan bir etkinlik, yeni bir etkinlik başlatılacak:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_to_a_b.png?authuser=19&hl=tr)
Zaten bölünmüş olan ve bir görev penceresini paylaşan etkinlikler başlatılabilir. aşağıdaki şekillerde kullandığınızdan emin olun:
Başka bir aktivitenin yanında:
Şekil 4. A Etkinliği, B aktivitesinin üzerinde yan tarafta C aktivitesini başlatır. Önceki birincil aktiviteyi gizleyerek yana ve bölmeyi yana doğru kaydırın:
Şekil 5. B aktivitesi C aktivitesini kenara çeker ve yardımcı olabilir. Hemen bir etkinlik başlatın; Yani aynı etkinlik yığınında:
Şekil 6. B Etkinliği, C etkinliğini ekstra intent işareti olmadan başlatır. Aynı görevde bir etkinlik tam penceresini başlatma:
Şekil 7. A etkinliği veya B etkinliği C etkinliğini başlatır ve görev penceresi.
Geri gitme
Farklı uygulama türlerinin farklı geri gezinme kuralları olabilir ya da farklı görevler arasındaki bağımlılıklara bağlı olarak görev penceresi durumunu kullanıcıların geri etkinliği nasıl tetiklediğini gösterir. Örneğin:
- Bir araya gelme: Etkinlikler birbiriyle ilişkiliyse ve etkinliklerden birinin gösterilmemesi gerekiyorsa yoksa geri gezinme her ikisini de tamamlayacak şekilde yapılandırılabilir.
- Tek başına devam etme: Etkinlikler tamamen bağımsızysa, etkinliği görev penceresindeki başka bir etkinliğin durumunu etkilemez.
Geri etkinlik, düğme kullanılırken en son odaklanılan etkinliğe gönderilir yardımcı olabilir. Harekete dayalı gezinmeyle, geri etkinliği Hareketin gerçekleştiği etkinlik.
Çok bölmeli düzen
Jetpack WindowManager, Android 12L (API düzeyi 32) veya sonraki sürümleri çalıştıran büyük ekranlı cihazlarda ve daha eski platform sürümlerine sahip bazı cihazlarda çok bölmeli düzen yerleştirebilmenizi sağlar. SlidingPaneLayout
gibi parçalar veya görünüme dayalı düzenler yerine birden çok etkinliğe dayalı mevcut uygulamalar, kaynak kodunu yeniden düzenlemeden daha iyi bir büyük ekran kullanıcı deneyimi sağlayabilir.
Liste ayrıntılarına bölünme, yaygın bir örnektir. Yüksek kaliteli bir sunum sağlamak için sistem, liste etkinliğini başlatır ve ardından uygulama hemen ayrıntı etkinliğini başlatır. Geçiş sistemi, her iki etkinlik de çekilinceye kadar bekler, ardından bunları birlikte görüntüler. Kullanıcı için iki etkinlik tek bir etkinlik olarak başlatılır.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/launcher_to_list-detail.png?authuser=19&hl=tr)
Bölme özellikleri
Görev penceresinin bölünmüş kapsayıcılar arasında nasıl oranlanacağını ve kapsayıcıların birbirlerine göre nasıl düzenleneceğini belirtebilirsiniz.
Bir XML yapılandırma dosyasında tanımlanan kurallar için aşağıdaki özellikleri ayarlayın:
splitRatio
: Kapsayıcı oranlarını ayarlar. Değer, açık aralıktaki (0,0, 1,0) bir kayan nokta sayıdır.splitLayoutDirection
: Bölünen kapsayıcıların birbirine göre nasıl düzenleneceğini belirtir. Olası değerlere örnekler:ltr
: Soldan sağartl
: Sağdan solalocale
: Yerel ayardanltr
veyartl
belirlenir
Örnekler için aşağıdaki XML yapılandırması bölümüne bakın.
WindowManager API'leri kullanılarak oluşturulan kurallar için SplitAttributes.Builder
ile bir SplitAttributes
nesnesi oluşturun ve aşağıdaki oluşturucu yöntemlerini çağırın:
setSplitType()
: Bölme kapsayıcılarının oranlarını ayarlar.SplitAttributes.SplitType.ratio()
yöntemi de dahil olmak üzere geçerli bağımsız değişkenler içinSplitAttributes.SplitType
politikasına bakın.setLayoutDirection()
: Kapsayıcıların düzenini ayarlar. Olası değerler içinSplitAttributes.LayoutDirection
adresine bakın.
Örnekler için aşağıdaki WindowManager API'sini inceleyin.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_b_vs_a_b.png?authuser=19&hl=tr)
Yer tutucular
Yer tutucu etkinlikleri boş ikincil etkinliklerdir ve ve bir aktivite bölmesi var. Bunların, nihayetinde başka bir otomatik olarak oluşturulur. Örneğin, bir yer tutucu etkinliği bir etkinlik bölmesinin ikinci tarafını işgal edene kadar listeden bir öğe seçilir ve bu noktada ayrıntı bilgileri yer tutucunun yerini alır.
Varsayılan olarak sistem, yer tutucuları yalnızca etkinlik bölmesi için yeterli alan olduğunda görüntüler. Görüntü boyutu, bölme gösterilemeyecek kadar küçük bir genişlik veya yükseklik olarak değiştiğinde yer tutucular otomatik olarak işlemi bitirir. Alan izin verdiğinde sistem, yer tutucuyu sıfırlanmış durumda yeniden başlatır.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/placeholder_finished_recreated.png?authuser=19&hl=tr)
Bununla birlikte, SplitPlaceholder.Builder
SplitPlaceholderRule
veya setSticky()
yönteminin stickyPlaceholder
özelliği varsayılan davranışı geçersiz kılabilir. Özellik veya yöntem true
değerini belirttiğinde, ekran iki bölmeli bir ekrandan tek bölmeli bir ekrana yeniden boyutlandırıldığında sistem yer tutucuyu görev penceresinde en üst etkinlik olarak görüntüler (bir örnek için Bölünmüş yapılandırma bölümüne bakın).
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/placeholder_sticky.png?authuser=19&hl=tr)
Pencere boyutu değişiklikleri
Cihaz yapılandırmasındaki değişiklikler, görev penceresi genişliğini çok bölmeli düzen için yeterince büyük değildir (örneğin, katlanabilir cihazı tablet boyutundan telefon boyutuna veya uygulama penceresine göre çoklu pencere modunda yeniden boyutlandırıldıysa) ikincil kampanyadaki yer tutucu olmayan etkinlikler görev penceresinin bölmesi, birincil öğedeki etkinliklerin üzerine yığılır. bölmesini de kullanabilirsiniz.
Yer tutucu etkinlikleri yalnızca bir bölün. Daha küçük ekranlarda yer tutucu otomatik olarak kapatılır. Zaman görüntüleme alanı tekrar yeterince geniş hale geldiğinde yer tutucu yeniden oluşturulur. (Yukarıdaki Yer tutucular konusuna bakın.)
Etkinlik yığma mümkündür çünkü WindowManager z-sırayı kullanarak etkinlikleri görüntülemenizi sağlar.
İkincil bölmede birden fazla etkinlik
B Etkinliği, C etkinliğini ekstra amaç işaretleri olmadan, yerinde başlatır:
Bu durum, aynı görevde etkinliklerin z sırasına aşağıdaki gibi olmasına yol açar:
Bu nedenle, daha küçük bir görev penceresinde uygulama tek bir aktiviteye daralır. C tuşuna basın:
Küçük pencerede geri dönerseniz, yığılmış etkinlikler arasında gezinebilirsiniz üst üste bindirir.
Görev penceresi yapılandırması, geri yüklenebilecek daha büyük bir boyuta geri yüklenirse birden çok bölme bulunması halinde, etkinlikler tekrar yan yana görüntülenir.
Yığınlı bölmeler
B etkinliği C etkinliğini kenara çeker ve bölme yanlara doğru kaydırılır:
Sonuç, aynı görevdeki etkinliklerin z-sıralamasıdır:
Daha küçük bir görev penceresinde, uygulama C ile tek bir etkinliğe küçültülür üstte:
Sabit dikey yön
android:screenOrientation manifest ayarı, uygulamaların etkinlikleri dikey veya yatay yönde kısıtlamasına olanak tanır. Cihaz üreticileri (OEM'ler), tablet ve katlanabilir cihazlar gibi büyük ekranlı cihazlarda kullanıcı deneyimini iyileştirmek için, ekran yönü isteklerini ve yatay ekranlarda dikey yöndeki uygulamayı, dikey ekranlarda yatay yönde izleyen uygulamaları yoksayabilir.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_letterboxed_portrait_and_landscape.png?authuser=19&hl=tr)
Benzer şekilde, etkinlik yerleştirme etkinleştirildiğinde OEM'ler cihazları büyük ekranlarda yatay yönde (genişlik ≥ 600 dp) sinemaskop sabit dikey etkinlikler için özelleştirebilir. Sabit dikey etkinlik ikinci bir etkinliği başlattığında cihaz, bu iki etkinliği iki bölmeli bir ekranda yan yana görüntüleyebilir.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_letterboxed_portrait_to_a_b.png?authuser=19&hl=tr)
Cihaza, uygulamanızın etkinlik yerleştirmeyi desteklediğini bildirmek için her zaman android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED
özelliğini uygulama manifest dosyanıza ekleyin (aşağıdaki Bölünmüş yapılandırma bölümüne bakın). Ardından, OEM tarafından özelleştirilmiş cihazlar, sinemaskop sabit dikey aktivitelerin yapılıp yapılmayacağını belirleyebilir.
Bölünmüş yapılandırma
Bölme kuralları etkinlik bölümlerini yapılandırır. Bölme kurallarını XML yapılandırma dosyasında veya Jetpack WindowManager API çağrıları yaparak tanımlarsınız.
Her iki durumda da, uygulamanızın WindowManager kitaplığına erişmesi ve sisteme, uygulamanın etkinlik yerleştirme işlemini uyguladığını bildirmesi gerekir.
Aşağıdakileri yapın:
Uygulamanızın modül düzeyindeki
build.gradle
dosyasına en yeni WindowManager kitaplığı bağımlılığını ekleyin. Örneğin:implementation 'androidx.window:window:1.1.0-beta02'
WindowManager kitaplığı etkinlik yerleştirme için gereken tüm bileşenleri sağlar.
Sisteme, uygulamanızın etkinlik yerleştirmeyi uyguladığını bildirin.
android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED
özelliğini <application> uygulamasına ekleyin. öğesini eklemeniz ve değeri doğru olarak ayarlamanız gerekir. Örneğin:<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application> <property android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_SPLITS_ENABLED" android:value="true" /> </application> </manifest>
WindowManager 1.1.0-alpha06 ve sonraki sürümlerinde, özellik manifeste eklenip doğru değerine ayarlanmadığı sürece etkinlik yerleştirme bölmeleri devre dışı bırakılır.
Ayrıca cihaz üreticileri, etkinlik yerleştirmeyi destekleyen uygulamalar için özel özellikleri etkinleştirmek üzere bu ayarı kullanır. Örneğin, cihazlar ikinci bir etkinlik başladığında iki bölmeli düzene geçiş etkinliğini yönlendirmek için yatay ekranlarda yalnızca dikey olarak gösterilen bir etkinliği sinemaskop olarak ayarlayabilir (bkz. Dikey yön).
XML yapılandırması
Etkinlik yerleştirme özelliğinin XML tabanlı bir uygulamasını oluşturmak için aşağıdaki adımları tamamlayın:
Aşağıdakileri gerçekleştiren bir XML kaynak dosyası oluşturun:
- Bir bölümü paylaşan etkinlikleri tanımlar
- Bölme seçeneklerini yapılandırır
- İçerik kullanılamadığında bölmenin ikincil kapsayıcısı için bir yer tutucu oluşturur
- Hiçbir zaman bölmenin parçası olmaması gereken etkinlikleri belirtir
Örnek:
<!-- main_split_config.xml --> <resources xmlns:window="http://schemas.android.com/apk/res-auto"> <!-- Define a split for the named activities. --> <SplitPairRule window:splitRatio="0.33" window:splitLayoutDirection="locale" window:splitMinWidthDp="840" window:splitMaxAspectRatioInPortrait="alwaysAllow" window:finishPrimaryWithSecondary="never" window:finishSecondaryWithPrimary="always" window:clearTop="false"> <SplitPairFilter window:primaryActivityName=".ListActivity" window:secondaryActivityName=".DetailActivity"/> </SplitPairRule> <!-- Specify a placeholder for the secondary container when content is not available. --> <SplitPlaceholderRule window:placeholderActivityName=".PlaceholderActivity" window:splitRatio="0.33" window:splitLayoutDirection="locale" window:splitMinWidthDp="840" window:splitMaxAspectRatioInPortrait="alwaysAllow" window:stickyPlaceholder="false"> <ActivityFilter window:activityName=".ListActivity"/> </SplitPlaceholderRule> <!-- Define activities that should never be part of a split. Note: Takes precedence over other split rules for the activity named in the rule. --> <ActivityRule window:alwaysExpand="true"> <ActivityFilter window:activityName=".ExpandedActivity"/> </ActivityRule> </resources>
Başlatıcı oluşturun.
WindowManager
RuleController
bileşeni, XML yapılandırma dosyasını ayrıştırır ve kuralların sisteme uygunluğunu sağlar. Jetpack Startup kitaplığıInitializer
, XML dosyasını uygulama başlatılırkenRuleController
tarafından kullanılabilir hale getirir. Böylece, herhangi bir etkinlik başlatıldığında kurallar geçerli olur.Başlatıcı oluşturmak için aşağıdakileri yapın:
Modül düzeyindeki
build.gradle
dosyanıza en yeni Jetpack Startup kitaplığı bağımlılığını ekleyin. Örneğin:implementation 'androidx.startup:startup-runtime:1.1.1'
Initializer
arayüzünü uygulayan bir sınıf oluşturun.Başlatıcı, XML yapılandırma dosyasının kimliğini (
main_split_config.xml
)RuleController.parseRules()
yöntemine ileterek bölme kurallarınıRuleController
tarafından kullanılabilir hale getirir.Kotlin
class SplitInitializer : Initializer<RuleController> { override fun create(context: Context): RuleController { return RuleController.getInstance(context).apply { setRules(RuleController.parseRules(context, R.xml.main_split_config)) } } override fun dependencies(): List<Class<out Initializer<*>>> { return emptyList() } }
Java
public class SplitInitializer implements Initializer<RuleController> { @NonNull @Override public RuleController create(@NonNull Context context) { RuleController ruleController = RuleController.getInstance(context); ruleController.setRules( RuleController.parseRules(context, R.xml.main_split_config) ); return ruleController; } @NonNull @Override public List<Class<? extends Initializer<?>>> dependencies() { return Collections.emptyList(); } }
Kural tanımları için bir içerik sağlayıcı oluşturun.
androidx.startup.InitializationProvider
öğesini, uygulama manifest dosyanıza<provider>
olarak ekleyin.RuleController
başlatıcınızın (SplitInitializer
) uygulanmasıyla ilgili bir referans ekleyin:<!-- AndroidManifest.xml --> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- Make SplitInitializer discoverable by InitializationProvider. --> <meta-data android:name="${applicationId}.SplitInitializer" android:value="androidx.startup" /> </provider>
InitializationProvider
, uygulamanınonCreate()
yöntemi çağrılmadan önceSplitInitializer
uygulamasını bulup başlatır. Sonuç olarak, bölme kuralları uygulamanın ana etkinliği başladığında geçerli olur.
WindowManager API'sı
Birkaç API çağrısıyla etkinlik yerleştirmeyi programatik olarak uygulayabilirsiniz. Herhangi bir etkinlik başlamadan önce kuralların geçerli olduğundan emin olmak için Application
alt sınıfının onCreate()
yönteminde çağrılar yapın.
Programlı bir şekilde etkinlik bölmesi oluşturmak için aşağıdakileri yapın:
Bölme kuralı oluşturun:
Bu bölünmeyi paylaşan etkinlikleri tanımlayan bir
SplitPairFilter
oluşturun:Kotlin
val splitPairFilter = SplitPairFilter( ComponentName(this, ListActivity::class.java), ComponentName(this, DetailActivity::class.java), null )
Java
SplitPairFilter splitPairFilter = new SplitPairFilter( new ComponentName(this, ListActivity.class), new ComponentName(this, DetailActivity.class), null );
Filtreyi bir filtre grubuna ekleyin:
Kotlin
val filterSet = setOf(splitPairFilter)
Java
Set<SplitPairFilter> filterSet = new HashSet<>(); filterSet.add(splitPairFilter);
Bölme için düzen özellikleri oluşturun:
Kotlin
val splitAttributes: SplitAttributes = SplitAttributes.Builder() .setSplitType(SplitAttributes.SplitType.ratio(0.33f)) .setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT) .build()
Java
final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(SplitAttributes.SplitType.ratio(0.33f)) .setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT) .build();
SplitAttributes.Builder
, düzen özelliklerini içeren bir nesne oluşturur:setSplitType
: Kullanılabilir görüntüleme alanının her bir etkinlik kapsayıcısına nasıl ayrılacağını tanımlar. Oran bölme türü, birincil kapsayıcıya ayrılan kullanılabilir görüntüleme alanının oranını belirtir; ikincil kapsayıcı, kullanılabilir görüntüleme alanının geri kalanını kaplar.setLayoutDirection
: Etkinlik kapsayıcılarının, önce birincil kapsayıcı olmak üzere birbirine göre nasıl düzenleneceğini belirtir.
Bir
SplitPairRule
oluşturun:Kotlin
val splitPairRule = SplitPairRule.Builder(filterSet) .setDefaultSplitAttributes(splitAttributes) .setMinWidthDp(840) .setMinSmallestWidthDp(600) .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f)) .setFinishPrimaryWithSecondary(SplitRule.FinishBehavior.NEVER) .setFinishSecondaryWithPrimary(SplitRule.FinishBehavior.ALWAYS) .setClearTop(false) .build()
Java
SplitPairRule splitPairRule = new SplitPairRule.Builder(filterSet) .setDefaultSplitAttributes(splitAttributes) .setMinWidthDp(840) .setMinSmallestWidthDp(600) .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f)) .setFinishPrimaryWithSecondary(SplitRule.FinishBehavior.NEVER) .setFinishSecondaryWithPrimary(SplitRule.FinishBehavior.ALWAYS) .setClearTop(false) .build();
SplitPairRule.Builder
, kuralı oluşturur ve yapılandırır:filterSet
: Aynı bölünmeyi paylaşan etkinlikleri tanımlayarak kuralın ne zaman uygulanacağını belirleyen bölünmüş çift filtreleri içerir.setDefaultSplitAttributes
: Düzen özelliklerini kurala uygular.setMinWidthDp
: Bölme işleminin gerçekleştirilmesini sağlayan minimum görüntü genişliğini (yoğunluktan bağımsız piksel cinsinden, dp) ayarlar.setMinSmallestWidthDp
: Cihazın yönünden bağımsız olarak bölme işlemi yapabilmesi için iki ekran boyutundan daha küçük olana kadar olması gereken minimum değeri (dp cinsinden) ayarlar.setMaxAspectRatioInPortrait
: Etkinlik bölmelerinin görüntüleneceği dikey yönde maksimum görüntü en boy oranını (yükseklik:genişlik) ayarlar. Bir dikey ekranın en boy oranı maksimum en boy oranını aşarsa ekranın genişliği ne olursa olsun bölmeler devre dışı bırakılır. Not: Varsayılan değer 1,4'tür.Bu değer, çoğu tablette etkinliklerin dikey yönde tüm görev penceresinin tamamını kaplamasına neden olur. Ayrıca bkz.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
vesetMaxAspectRatioInLandscape
. Yatay için varsayılan değerALWAYS_ALLOW
şeklindedir.setFinishPrimaryWithSecondary
: İkincil kapsayıcıdaki tüm etkinliklerin tamamlanmasının birincil kapsayıcıdaki etkinlikleri nasıl etkileyeceğini belirler.NEVER
, ikincil kapsayıcıdaki tüm etkinlikler tamamlandığında sistemin birincil etkinlikleri tamamlamaması gerektiğini belirtir (İşlemleri tamamlama bölümüne bakın).setFinishSecondaryWithPrimary
: Birincil kapsayıcıdaki tüm etkinliklerin tamamlanmasının ikincil kapsayıcıdaki etkinlikleri nasıl etkileyeceğini belirler.ALWAYS
, birincil kapsayıcıdaki tüm etkinlikler tamamlandığında sistemin her zaman ikincil kapsayıcıdaki etkinlikleri tamamlaması gerektiğini belirtir (İşlemleri tamamlama bölümüne bakın).setClearTop
: Kapsayıcıda yeni bir etkinlik başlatıldığında ikincil kapsayıcıdaki tüm etkinliklerin tamamlanıp tamamlanmayacağını belirtir. Yanlış değeri, yeni etkinliklerin zaten ikincil kapsayıcıda bulunan etkinliklerin üzerine yığıldığını belirtir.
WindowManager
RuleController
tekli örneğini alın ve kuralı ekleyin:Kotlin
val ruleController = RuleController.getInstance(this) ruleController.addRule(splitPairRule)
Java
RuleController ruleController = RuleController.getInstance(this); ruleController.addRule(splitPairRule);
İçerik kullanılamadığında ikincil kapsayıcı için bir yer tutucu oluşturun:
Yer tutucunun bir görev penceresi bölmesini paylaştığı etkinliği tanımlayan bir
ActivityFilter
oluşturun:Kotlin
val placeholderActivityFilter = ActivityFilter( ComponentName(this, ListActivity::class.java), null )
Java
ActivityFilter placeholderActivityFilter = new ActivityFilter( new ComponentName(this, ListActivity.class), null );
Filtreyi bir filtre grubuna ekleyin:
Kotlin
val placeholderActivityFilterSet = setOf(placeholderActivityFilter)
Java
Set<ActivityFilter> placeholderActivityFilterSet = new HashSet<>(); placeholderActivityFilterSet.add(placeholderActivityFilter);
Bir
SplitPlaceholderRule
oluşturun:Kotlin
val splitPlaceholderRule = SplitPlaceholderRule.Builder( placeholderActivityFilterSet, Intent(context, PlaceholderActivity::class.java) ).setDefaultSplitAttributes(splitAttributes) .setMinWidthDp(840) .setMinSmallestWidthDp(600) .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f)) .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ALWAYS) .setSticky(false) .build()
Java
SplitPlaceholderRule splitPlaceholderRule = new SplitPlaceholderRule.Builder( placeholderActivityFilterSet, new Intent(context, PlaceholderActivity.class) ).setDefaultSplitAttributes(splitAttributes) .setMinWidthDp(840) .setMinSmallestWidthDp(600) .setMaxAspectRatioInPortrait(EmbeddingAspectRatio.ratio(1.5f)) .setFinishPrimaryWithPlaceholder(SplitRule.FinishBehavior.ALWAYS) .setSticky(false) .build();
SplitPlaceholderRule.Builder
, kuralı oluşturur ve yapılandırır:placeholderActivityFilterSet
: Yer tutucu etkinliğin ilişkili olduğu etkinlikleri tanımlayarak kuralın ne zaman uygulanacağını belirleyen etkinlik filtrelerini içerir.Intent
: Yer tutucu etkinliğin başlatıldığını belirtir.setDefaultSplitAttributes
: Düzen özelliklerini kurala uygular.setMinWidthDp
: Bölme işlemine izin veren minimum görüntü genişliğini (yoğunluktan bağımsız piksel cinsinden, dp cinsinden) ayarlar.setMinSmallestWidthDp
: Cihazın yönü ne olursa olsun iki ekran boyutundan daha küçük olanın bölmeye izin vermesi gereken minimum değeri (dp cinsinden) ayarlar.setMaxAspectRatioInPortrait
: Etkinlik bölmelerinin görüntüleneceği dikey yönde maksimum görüntü en boy oranını (yükseklik:genişlik) ayarlar. Not: Varsayılan değer 1,4'tür.Bu değer, çoğu tablette etkinliklerin görev penceresini dikey yönde doldurur. Ayrıca bkz.SPLIT_MAX_ASPECT_RATIO_PORTRAIT_DEFAULT
vesetMaxAspectRatioInLandscape
. Yatay için varsayılan değerALWAYS_ALLOW
şeklindedir.setFinishPrimaryWithPlaceholder
: Yer tutucu etkinliğini tamamlamanın birincil kapsayıcıdaki etkinlikleri nasıl etkileyeceğini belirler. HER ZAMAN yer tutucu tamamlandığında sistemin birincil kapsayıcıdaki etkinlikleri her zaman tamamlaması gerektiğini belirtir (İşlemleri tamamlama bölümüne bakın).setSticky
: Yer tutucu etkinliğin, yeterli minimum genişliğe sahip bir bölmede ilk kez göründükten sonra küçük ekranlarda etkinlik yığınının üstünde görünüp görünmeyeceğini belirler.
Kuralı WindowManager
RuleController
içine ekleyin:Kotlin
ruleController.addRule(splitPlaceholderRule)
Java
ruleController.addRule(splitPlaceholderRule);
Hiçbir zaman bölmenin parçası olmaması gereken etkinlikleri belirtin:
Tüm görev görüntüleme alanını her zaman kaplaması gereken bir etkinliği tanımlayan bir
ActivityFilter
oluşturun:Kotlin
val expandedActivityFilter = ActivityFilter( ComponentName(this, ExpandedActivity::class.java), null )
Java
ActivityFilter expandedActivityFilter = new ActivityFilter( new ComponentName(this, ExpandedActivity.class), null );
Filtreyi bir filtre grubuna ekleyin:
Kotlin
val expandedActivityFilterSet = setOf(expandedActivityFilter)
Java
Set<ActivityFilter> expandedActivityFilterSet = new HashSet<>(); expandedActivityFilterSet.add(expandedActivityFilter);
ActivityRule
oluşturun:Kotlin
val activityRule = ActivityRule.Builder(expandedActivityFilterSet) .setAlwaysExpand(true) .build()
Java
ActivityRule activityRule = new ActivityRule.Builder( expandedActivityFilterSet ).setAlwaysExpand(true) .build();
ActivityRule.Builder
, kuralı oluşturur ve yapılandırır:expandedActivityFilterSet
: Bölümlerden hariç tutmak istediğiniz etkinlikleri tanımlayarak kuralın ne zaman uygulanacağını belirleyen etkinlik filtrelerini içerir.setAlwaysExpand
: Etkinliğin görev penceresinin tamamını doldurup doldurmayacağını belirtir.
Kuralı WindowManager
RuleController
içine ekleyin:Kotlin
ruleController.addRule(activityRule)
Java
ruleController.addRule(activityRule);
Uygulamalar arası yerleştirme
Android 13 (API düzeyi 33) ve sonraki sürümlerde uygulamalar, diğer uygulamalardaki etkinlikleri yerleştirebilir. Uygulamalar arası veya UID'si için etkinlik yerleştirme, birden çok Android uygulamasındaki etkinliklerin görsel entegrasyonunu sağlar. Sistem, ana makine uygulamanın bir etkinliğini ve başka bir uygulamadaki yerleşik etkinliği, tek uygulama etkinlik yerleştirmede olduğu gibi ekranda yan yana veya üstte ve altta gösterir.
Örneğin, Ayarlar uygulaması, Wallpaper Picker uygulamasından duvar kağıdı seçici etkinliği yerleştirebilir:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/wallpaper_activity_embedded_in_settings_app.png?authuser=19&hl=tr)
Güven modeli
Diğer uygulamalardaki etkinliklerin yerleştirildiği ana makine işlemleri, yerleştirilmiş etkinliklerin sunumunu (boyut, konum, kırpma ve şeffaflık gibi) yeniden tanımlayabilir. Kötü amaçlı barındırıcılar, bu özelliği kullanıcıları yanıltmak, tıklama korsanlığı veya kullanıcı arayüzünü iyileştirmeye yönelik başka saldırılar oluşturmak için kullanabilir.
Android, uygulamalar arası etkinlik yerleştirme özelliğinin kötüye kullanılmasını önlemek için uygulamaların, etkinliklerinin yerleştirilmesine izin verme özelliğini etkinleştirmesini zorunlu kılar. Uygulamalar, ana makineleri güvenilir veya güvenilmeyen olarak atayabilir.
Güvenilir ana makineler
Diğer uygulamaların, uygulamanızdaki etkinliklerin sunumunu yerleştirmesine ve tamamen kontrol etmesine izin vermek için uygulamanızın manifest dosyasındaki <activity>
veya <application>
öğelerinin android:knownActivityEmbeddingCerts
özelliğinde ana makine uygulamasının SHA-256 sertifikasını belirtin.
android:knownActivityEmbeddingCerts
değerini bir dize olarak ayarlayın:
<activity
android:name=".MyEmbeddableActivity"
android:knownActivityEmbeddingCerts="@string/known_host_certificate_digest"
... />
veya birden fazla sertifika belirtmek için bir dize dizisi:
<activity
android:name=".MyEmbeddableActivity"
android:knownActivityEmbeddingCerts="@array/known_host_certificate_digests"
... />
aşağıdaki gibi bir kaynağa referans verir:
<resources>
<string-array name="known_host_certificate_digests">
<item>cert1</item>
<item>cert2</item>
...
</string-array>
</resources>
Uygulama sahipleri, Gradle signingReport
görevini çalıştırarak SHA sertifikası özeti alabilir. Sertifika özeti, ayırıcı iki nokta olmadan SHA-256 parmak izidir. Daha fazla bilgi için İmzalama raporu çalıştırma ve İstemcinizin Kimliğini Doğrulama başlıklı makaleleri inceleyin.
Güvenilmeyen ana makineler
Herhangi bir uygulamanın, uygulamanızın etkinliklerini yerleştirmesine ve bunların sunularını kontrol etmesine izin vermek için uygulama manifestindeki <activity>
veya <application>
öğelerinde android:allowUntrustedActivityEmbedding
özelliğini belirtin. Örneğin:
<activity
android:name=".MyEmbeddableActivity"
android:allowUntrustedActivityEmbedding="true"
... />
Özelliğin varsayılan değeri false'tur. Bu, uygulamalar arası etkinlik yerleştirmeyi engeller.
Özel kimlik doğrulama
Güvenilir olmayan etkinlik yerleştirme riskini azaltmak için ana makine kimliğini doğrulayan özel bir kimlik doğrulama mekanizması oluşturun. Ana makine sertifikalarını biliyorsanız kimlik doğrulaması için androidx.security.app.authenticator
kitaplığını kullanın. Ana makine, etkinliğinizi yerleştirdikten sonra kimlik doğrulaması yaparsa gerçek içeriği görüntüleyebilirsiniz. Değilse kullanıcıyı işleme izin verilmediğini bildirebilir ve içeriği engelleyebilirsiniz.
Bir ana makinenin etkinliğinizi yerleştirip yerleştirmediğini kontrol etmek için Jetpack WindowManager kitaplığındaki ActivityEmbeddingController#isActivityEmbedded()
yöntemini kullanın. Örneğin:
Kotlin
fun isActivityEmbedded(activity: Activity): Boolean { return ActivityEmbeddingController.getInstance(this).isActivityEmbedded(activity) }
Java
boolean isActivityEmbedded(Activity activity) { return ActivityEmbeddingController.getInstance(this).isActivityEmbedded(activity); }
Minimum boyut kısıtlaması
Android sistemi, yerleştirilmiş etkinliklere uygulama manifesti <layout>
öğesinde belirtilen minimum yükseklik ve genişliği uygular. Bir uygulama minimum yükseklik ve genişliği belirtmezse sistem varsayılan değerleri (sw220dp
) geçerli olur.
Ana makine, yerleştirilmiş kapsayıcıyı minimum değerden daha küçük bir boyuta yeniden boyutlandırmaya çalışırsa, yerleştirilmiş kapsayıcı genişleyerek tüm görev sınırlarını kaplar.
<activity-alias>
Güvenilen veya güvenilir olmayan etkinlik yerleştirmenin <activity-alias>
öğesiyle çalışması için hedef etkinliğe takma ad yerine android:knownActivityEmbeddingCerts
veya android:allowUntrustedActivityEmbedding
uygulanmalıdır. Sistem sunucusundaki güvenliği doğrulayan politika, takma ada değil, hedef üzerinde ayarlanan flag'lere dayanır.
Ana makine uygulaması
Ana makine uygulamaları, uygulamalar arası etkinlik yerleştirme işlemini, tek uygulama etkinliği yerleştirmeyi uyguladığı şekilde uygular. SplitPairRule
ve SplitPairFilter
veya ActivityRule
ve ActivityFilter
nesneleri, yerleştirilmiş etkinlikleri ve görev penceresi bölmelerini belirtir. Bölme kuralları, XML'de statik olarak veya çalışma zamanında Jetpack WindowManager API çağrıları kullanılarak tanımlanır.
Bir ana makine uygulaması, uygulamalar arası yerleştirmenin etkinleştirilmediği bir etkinliği yerleştirmeye çalışırsa bu etkinlik tüm görev sınırlarını kaplar. Sonuç olarak, barındıran uygulamaların hedef etkinliklerin uygulamalar arası yerleştirmeye izin verip vermediğini bilmesi gerekir.
Yerleştirilmiş bir etkinlik, aynı görevde yeni bir etkinlik başlatırsa ve yeni etkinlik, uygulamalar arası yerleştirmenin etkinleştirilmesini seçmemişse bu etkinlik, yerleştirilmiş kapsayıcının içine yerleştirmek yerine görev sınırlarının tamamını kaplar.
Bir barındırma uygulaması, etkinlikler aynı görevde başlatıldığı sürece kendi etkinliklerini herhangi bir kısıtlama olmadan yerleştirebilir.
Bölme örnekleri
Tam pencereden ayır
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_to_a_b.png?authuser=19&hl=tr)
Yeniden düzenleme gerekmez. Bölme yapılandırmasını tanımlayabilirsiniz
önce statik bir bağlantı oluşturup
Context#startActivity()
hiçbir ek parametre olmadan.
<SplitPairRule>
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Varsayılan olarak böl
Bir uygulamanın açılış sayfası ikiye bölünecek şekilde tasarlandığında büyük ekranlarda her iki etkinlik de olduğunda kullanıcı deneyimi aynı anda oluşturulup sunulur. Ancak içerik, kullanıcı etkileşime girene kadar bölmenin ikincil kapsayıcısı için kullanılabilir birincil kapsayıcıdaki etkinlikle birlikte (örneğin, kullanıcı, öğesine dokunun. Yer tutucu etkinlik, şu tarihe kadar boşluğu doldurabilir: içerik, bölmenin ikincil kapsayıcısında gösterilebilir (bkz. Yer tutucular bölümüne bakın).
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/launcher_main_placeholder.png?authuser=19&hl=tr)
Yer tutucuyla bölme oluşturmak için bir yer tutucu oluşturup ilişkilendirin birincil aktiviteyle:
<SplitPlaceholderRule
window:placeholderActivityName=".PlaceholderActivity">
<ActivityFilter
window:activityName=".MainActivity"/>
</SplitPlaceholderRule>
Derin bağlantı bölme
Bir uygulama bir intent aldığında, hedef etkinlik etkinlik bölümünün ikincil bölümü Örneğin, bir ayrıntıyı gösterme isteği listedeki bir öğeyle ilgili bilgiler içeren bir ekran. Küçük ekranlarda tüm görev penceresinde ayrıntılı bilgi gösterilir; simgesini tıklayın.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/deep_link_split.png?authuser=19&hl=tr)
Başlatma isteği ana etkinliğe yönlendirilmeli ve hedef ayrıntısı etkinliği bölünmüş bir şekilde başlatılmalıdır. Sistem, mevcut ekran genişliğine göre doğru sunuyu (yığılmış veya yan yana) otomatik olarak seçer.
Kotlin
override fun onCreate(savedInstanceState Bundle?) { . . . RuleController.getInstance(this) .addRule(SplitPairRule.Builder(filterSet).build()) startActivity(Intent(this, DetailActivity::class.java)) }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { . . . RuleController.getInstance(this) .addRule(new SplitPairRule.Builder(filterSet).build()); startActivity(new Intent(this, DetailActivity.class)); }
Derin bağlantı hedefi, kullanılabilir tek etkinlik olabilir geri gezinme yığınında gösterir ve çok dikkatli bir ayrıntı etkinliği kapatılıp yalnızca ana etkinlik kalsın:
Bunun yerine,
finishPrimaryWithSecondary
özelliği:
<SplitPairRule
window:finishPrimaryWithSecondary="always">
<SplitPairFilter
window:primaryActivityName=".ListActivity"
window:secondaryActivityName=".DetailActivity"/>
</SplitPairRule>
Aşağıdaki Yapılandırma özellikleri bölümüne bakın.
Bölünmüş kapsayıcılarda birden fazla etkinlik
Birden fazla etkinliği bölünmüş bir kapsayıcıda yığmak, kullanıcıların derinlere ve içerik. Örneğin, liste-ayrıntı dağılımında kullanıcının birincil etkinliği olduğu gibi saklayın:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/list-detail_to_list-sub-detail.png?authuser=19&hl=tr)
Kotlin
class DetailActivity { . . . fun onOpenSubDetail() { startActivity(Intent(this, SubDetailActivity::class.java)) } }
Java
public class DetailActivity { . . . void onOpenSubDetail() { startActivity(new Intent(this, SubDetailActivity.class)); } }
Alt ayrıntı etkinliği ayrıntı etkinliğinin üzerine yerleştirilir ve gizlenir:
Kullanıcı, daha sonra geri dönüp önceki ayrıntı düzeyine geri dönebilir. aşağıdaki adımları izleyin:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/list-sub-detail_to_list-detail.png?authuser=19&hl=tr)
Aşağıdaki durumlarda etkinlikleri birbirinin üzerine yığmak varsayılan davranıştır: etkinlikleri aynı ikincil kapsayıcıdaki bir etkinlikten başlatılır. Etkin bir bölümdeki birincil kapsayıcıdan başlatılan etkinlikler de sona erer. üst kısmındaki ikincil kapsayıcıda görünür.
Yeni bir görevdeki etkinlikler
Bölünmüş görev penceresindeki etkinlikler yeni bir görevde etkinlik başlattığında görev, bölmeyi içeren görevden ayrıdır ve tam olarak gösterilir penceresini kapatın. Son kullanılanlar ekranında iki görev gösterilir: Bölünmüş görev ve yeni görev görevi görebilir.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/task_1_to_task_2.png?authuser=19&hl=tr)
Etkinlik değişimi
Etkinlikler ikincil kapsayıcı yığınında değiştirilebilir; Örneğin, birincil etkinlik üst düzey gezinme için, ikincil etkinlik etkinliği seçilen bir hedeftir. Üst seviyeden gelen her seçim, navigasyonun ikincil kapsayıcıda yeni bir etkinlik başlatması ve mevcut olan etkinlik veya aktiviteler.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/menu_screen_a_to_menu_screen_b.png?authuser=19&hl=tr)
Uygulama, değişikliklerinde değişiklik yapıldığından geri gezinme, bölme daraltılmış (cihaz katlanmışken). Örneğin, A ve B ekranları ikincil bölmede üst üste yığılmış olarak gösterilir. Kullanıcı telefonu katladığında B, A'nın üzerinde, A ise menünün üst kısmında yer alıyor. Kullanıcı B'den geri döndüğünde, menü yerine A görünür.
Bu gibi durumlarda A ekranı arka yığından kaldırılmalıdır.
Yeni bir kapsayıcıda, yalnızca bir veya daha fazla
mevcut bölme, yeni ikincil kapsayıcıları üste yerleştirmek ve
bunları düşünmelisiniz. Önceki bölümleri temizlemek için bölümleri yapılandırabilirsiniz.
clearTop
ile ikincil kapsayıcılar oluşturabilir ve yeni etkinlikleri normal şekilde başlatabilir.
<SplitPairRule
window:clearTop="true">
<SplitPairFilter
window:primaryActivityName=".Menu"
window:secondaryActivityName=".ScreenA"/>
<SplitPairFilter
window:primaryActivityName=".Menu"
window:secondaryActivityName=".ScreenB"/>
</SplitPairRule>
Kotlin
class MenuActivity { . . . fun onMenuItemSelected(selectedMenuItem: Int) { startActivity(Intent(this, classForItem(selectedMenuItem))) } }
Java
public class MenuActivity { . . . void onMenuItemSelected(int selectedMenuItem) { startActivity(new Intent(this, classForItem(selectedMenuItem))); } }
Alternatif olarak, aynı ikincil etkinliği ve birincil (menü) yolunu kullanın etkinlik, aynı örneğe çözümlenen ancak aynı örneğe çözümlenen kullanıcı arayüzü güncellemesi yapın.
Çoklu bölme
Uygulamalar, farklı seviyelerde gezinmeye devam eden ek özellikler bir kenara koyarız.
İkincil kapsayıcıdaki bir etkinlik, yan tarafta yeni bir etkinlik başlattığında mevcut bölmenin üzerine yeni bir bölme oluşturulur.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/a_b_to_b_c.png?authuser=19&hl=tr)
Arka yığın, daha önce açılmış olan tüm etkinlikleri içerdiğinden kullanıcılar, C'yi bitirdikten sonra A/B bölümüne gidebilir.
Yeni bir bölme oluşturmak için yeni etkinliği mevcut bölümün yan tarafında başlatın anlamına gelir. Hem A/B hem de B/C için yapılandırmaları tanımlama bölünmesini ve C etkinliğini normal bir şekilde B’den başlatmasını sağlar:
<SplitPairRule>
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
<SplitPairFilter
window:primaryActivityName=".B"
window:secondaryActivityName=".C"/>
</SplitPairRule>
Kotlin
class B { . . . fun onOpenC() { startActivity(Intent(this, C::class.java)) } }
Java
public class B { . . . void onOpenC() { startActivity(new Intent(this, C.class)); } }
Bölünme durumu değişikliklerine tepki verme
Bir uygulamadaki farklı etkinlikler, aynı performansı gösteren kullanıcı arayüzü öğeleri içerebilir fonksiyon; örneğin, hesabınıza ait hesap içeren bir pencereyi açan Ayarlar'da devre dışı bırakabilirsiniz.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/main_detail_with_ui_element.png?authuser=19&hl=tr)
Ortak bir kullanıcı arayüzü öğesi olan iki etkinlik bir bölmedeyse hem gereksiz hem de kafa karıştırıcı olabilir.
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/main_detail_with_ui_element_duplicated.png?authuser=19&hl=tr)
Etkinliklerin ne zaman bölündüğünü öğrenmek için SplitController.splitInfoList
akışını kontrol edin veya bölme durumundaki değişiklikleri SplitControllerCallbackAdapter
ile görmek üzere bir işleyici kaydedin. Ardından, kullanıcı arayüzünü uygun şekilde ayarlayın:
Kotlin
val layout = layoutInflater.inflate(R.layout.activity_main, null) val view = layout.findViewById<View>(R.id.infoButton) lifecycleScope.launch { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { splitController.splitInfoList(this@SplitDeviceActivity) // The activity instance. .collect { list -> view.visibility = if (list.isEmpty()) View.VISIBLE else View.GONE } } }
Java
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { . . . new SplitControllerCallbackAdapter(SplitController.getInstance(this)) .addSplitListener( this, Runnable::run, splitInfoList -> { View layout = getLayoutInflater().inflate(R.layout.activity_main, null); layout.findViewById(R.id.infoButton).setVisibility( splitInfoList.isEmpty() ? View.VISIBLE : View.GONE); }); }
Eş yordamlar herhangi bir yaşam döngüsü durumunda başlatılabilir, ancak kaynakları korumak için genellikle STARTED
durumunda başlatılır (daha fazla bilgi için Yaşam döngüsüne duyarlı bileşenlerle Kotlin eş yordamlarını kullanma bölümüne bakın).
Geri çağırma, bir etkinliğin
durduruldu. Dinleyiciler genellikle onStart()
ve
onStop()
konumunda kayıt iptal edildi.
Tam pencere kalıcı pencere
Bazı etkinlikler, belirtilen eylem gerçekleştiğinde; örneğin giriş ekranı etkinliği, politika ve onay ekranını veya hata mesajını görebilirsiniz. Kalıcı etkinlikler önlenmelidir ortadan kaldırır.
Bir etkinlik, genişletme anahtarı kullanılarak görev penceresini her zaman doldurmaya zorlanabilir yapılandırma:
<ActivityRule
window:alwaysExpand="true">
<ActivityFilter
window:activityName=".FullWidthActivity"/>
</ActivityRule>
Etkinlikleri tamamlayın
Kullanıcılar, bölmenin her iki tarafındaki etkinlikleri tamamlamak için kenarını oynatır:
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/swipe_gesture_finish_b.png?authuser=19&hl=tr)
![](https://developer.android.google.cn/static/images/guide/topics/large-screens/activity-embedding/swipe_gesture_finish_a.png?authuser=19&hl=tr)
Cihaz, hareketle gezinme yerine geri düğmesini kullanacak şekilde ayarlanmışsa giriş, odaklanılan aktiviteye (dokunulan veya dokunulan aktiviteye) gönderilir son çıkan.
Bir kapsayıcıdaki tüm etkinliklerin sonlandırılmasının karşı kapsayıcı üzerindeki etkisi, bölme yapılandırmasına bağlıdır.
Yapılandırma özellikleri
Bölmenin bir tarafındaki tüm etkinlikleri bitirmenin, bölünmenin diğer tarafındaki etkinlikleri nasıl etkileyeceğini yapılandırmak için bölme çifti kuralı özelliklerini belirtebilirsiniz. Özellikler şunlardır:
window:finishPrimaryWithSecondary
: İkincil kapsayıcıda tüm etkinliklerin tamamlanması birincil kapsayıcıdaki etkinlikleri nasıl etkiler?window:finishSecondaryWithPrimary
: Birincil kapsayıcıdaki tüm etkinliklerin tamamlanması ikincil kapsayıcıdaki etkinlikleri nasıl etkiler?
Özelliklerin olası değerleri şunlardır:
always
: Etkinlikleri her zaman ilişkili kapsayıcıda tamamlayınnever
: İlişkili kapsayıcıdaki etkinlikleri hiçbir zaman tamamlamaadjacent
: İki kapsayıcı yan yana görüntülendiğinde (iki kapsayıcı yığıldığında değil) ilişkili kapsayıcıdaki etkinlikleri bitirin
Örnek:
<SplitPairRule
<!-- Do not finish primary container activities when all secondary container activities finish. -->
window:finishPrimaryWithSecondary="never"
<!-- Finish secondary container activities when all primary container activities finish. -->
window:finishSecondaryWithPrimary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Varsayılan yapılandırma
Bölmenin bir kapsayıcısındaki tüm etkinlikler sona erdiğinde, kalan kapsayıcı tüm pencereyi kaplar:
<SplitPairRule>
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Etkinlikleri birlikte tamamlayın
İkincil kapsayıcıdaki tüm etkinlikler tamamlandığında birincil kapsayıcıdaki etkinlikleri otomatik olarak tamamlayın:
<SplitPairRule
window:finishPrimaryWithSecondary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Birincil kapsayıcıdaki tüm etkinlikler tamamlandığında ikincil kapsayıcıdaki etkinlikleri otomatik olarak tamamlayın:
<SplitPairRule
window:finishSecondaryWithPrimary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Birincil veya ikincil kapsayıcıdaki tüm etkinlikler tamamlandığında etkinlikleri birlikte tamamlayın:
<SplitPairRule
window:finishPrimaryWithSecondary="always"
window:finishSecondaryWithPrimary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Kapsayıcılarda birden fazla etkinliği tamamlama
Birden fazla etkinlik bölünmüş bir kapsayıcıda yığılmışsa bir etkinliği tamamlama üst kısmı, etkinlikleri otomatik olarak en üstte tamamlamaz.
Örneğin, ikincil kapsayıcıda iki etkinlik varsa, B'nin üstündeki C:
Bölmenin konfigürasyonu da şu yapılandırma tarafından tanımlanır: A ve B aktiviteleri:
<SplitPairRule>
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
en büyük etkinliğin tamamlanması bölünmeyi sürdürüyor.
İkincil kapsayıcının alt (kök) etkinliğini tamamlamak üzerindeki etkinlikleri kaldırmalı; Dolayısıyla, bölünme de korunur.
Etkinlikleri bir arada tamamlamak için (ör. bitirme) birincil etkinlikteki ikincil etkinlikler de yürütülür:
<SplitPairRule
window:finishSecondaryWithPrimary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Bölme, birincil ve ikincil bölümleri birlikte bitirecek şekilde yapılandırıldığında:
<SplitPairRule
window:finishPrimaryWithSecondary="always"
window:finishSecondaryWithPrimary="always">
<SplitPairFilter
window:primaryActivityName=".A"
window:secondaryActivityName=".B"/>
</SplitPairRule>
Çalışma zamanında bölünmüş özellikleri değiştirme
O anda etkin olan ve görünür bir bölünmenin özellikleri değiştirilemez. Bölme kurallarının değiştirilmesi, ek etkinlik başlatmalarını ve yeni mevcut ve etkin bölmelerde hariç tutulur.
Etkin bölmelerin özelliklerini değiştirmek için yan etkinliği tamamlayın veya bir yapılandırmaya sahip olabilir.
Bir etkinliği bölünmüş pencereden tam pencereye çıkarma
Yan etkinlik tam penceresini görüntüleyen yeni bir yapılandırma oluşturun ve Ardından, aynı örneğe çözümlenen bir niyetle etkinliği yeniden başlatın.
Çalışma zamanında bölünmüş desteği kontrol etme
Etkinlik yerleştirme özelliği, Android 12L (API düzeyi 32) ve sonraki sürümlerde desteklenir ancak önceki platform sürümlerini çalıştıran bazı cihazlarda da kullanılabilir. Çalışma zamanında özelliğin kullanılabilir olup olmadığını kontrol etmek için SplitController.splitSupportStatus
özelliğini veya SplitController.getSplitSupportStatus()
yöntemini kullanın:
Kotlin
if (SplitController.getInstance(this).splitSupportStatus == SplitController.SplitSupportStatus.SPLIT_AVAILABLE) { // Device supports split activity features. }
Java
if (SplitController.getInstance(this).getSplitSupportStatus() == SplitController.SplitSupportStatus.SPLIT_AVAILABLE) { // Device supports split activity features. }
Bölmeler desteklenmiyorsa etkinlikler, etkinlik yığınının üzerinde başlatılır (etkinlik olmayan yerleştirme modelinden sonra).
Sistemde geçersiz kılmayı önle
Android cihaz üreticileri (özgün donanım üreticileri veya OEM'ler), cihaz sisteminin bir işlevi olarak etkinlik yerleştirme uygulayabilir. İlgili içeriği oluşturmak için kullanılan sistem, çoklu etkinlik uygulamaları için bölme kurallarını belirterek pencerelemeyi geçersiz kılar ve uygulamaların davranışlarıyla ilgilidir. Sistem geçersiz kılması, çoklu etkinlik uygulamalarını sistem tanımlı etkinlik yerleştirme modu.
Sistem etkinliği yerleştirme, çoklu bölme üzerinden uygulama sunumunu iyileştirebilir Örneğin, list-detail uygulamada hiçbir değişiklik yapmadan. Ancak, sistemin etkinlik yerleştirme işlemi ayrıca yanlış uygulama düzenlerine, hatalara veya etkinlik yerleştirmeyle çakışmalara da neden olur söz konusu olabilir.
Uygulamanız, sistem etkinliği yerleştirilmesini engelleyebilir veya buna izin verebilir. Bunun için mülk değerini göstermek istiyorsanız örneğin:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<property
android:name="android.window.PROPERTY_ACTIVITY_EMBEDDING_ALLOW_SYSTEM_OVERRIDE"
android:value="true|false" />
</application>
</manifest>
Özellik adı, Jetpack WindowManager'da tanımlanır
WindowProperties nesnesini ifade eder.
Uygulamanızda etkinlik yerleştirme kullanılıyorsa veya bu özelliği kullanıyorsanız değeri false
olarak ayarlayın.
Sistemin, etkinlik yerleştirme kurallarını uygulamasını engellemek isteyen kullanıcılar
ekleyin. Sistemin uygulanmasına izin vermek için değeri true
olarak ayarlayın.
sistem tarafından tanımlanmış etkinlik
yerleştirmesini gösterir.
Sınırlamalar, kısıtlamalar ve uyarılar
- Yalnızca kökün sahibi olarak tanımlanan görevin ana makine uygulaması diğer aktiviteleri organize edebilir ve göreve yerleştirebilir. Yerleştirme ve bölmeleri destekleyen etkinlikler ilgili bir görevde çalışırsa yerleştirme ve bölme işlemleri yardımcı olabilir.
- Aktiviteler yalnızca tek bir görev içinde düzenlenebilir. Etkinlik başlatma her zaman yeni bir genişletilmiş pencereye yerleştirir. bölmeniz gerekir.
- Yalnızca aynı süreçte yer alan etkinlikler düzenlenebilir ve bölümlere ayrılabilir. İlgili içeriği oluşturmak için kullanılan
SplitInfo
geri çağırma, yalnızca aynı sürece ait etkinlikleri raporlar. Çünkü farklı süreçlerdeki etkinlikleri bilmek mümkün değildir. - Her çift veya tekil etkinlik kuralı, yalnızca şu etkinlik kapsamındaki etkinlik başlatmalarına uygulanır: ne olduğunu öğreneceğiz. Şu anda mevcut bölümleri veya görsel özelliklerini güncelleyebilirsiniz.
- Bölünmüş çift filtre yapılandırması, şu durumlarda kullanılan amaçlarla eşleşmelidir: ve aktiviteleri tamamlamanıza yardımcı olur. Eşleşme, yeni bir anahtar kelimenin Bu etkinlik, başvuru sürecinde başladığından ne haberi olmayabilir? kullanılırken daha sonra çözümlenen bileşen adları gizli niyettir. Lansman sırasında bir bileşen adı bilinmiyorsa, bunun yerine joker karakter ("*/*") kullanılabilir ve filtreleme, amaç işlemine göre işlem yaparsınız.
- Şu anda etkinlikleri kapsayıcılar arasında veya içeri/dışarı taşımak mümkün değildir bölünmesini ifade eder. Bölmeler yalnızca Eşleşen kurallara sahip yeni etkinlikler başlatıldığında WindowManager kitaplığı, ve bölmeler, bölünmüş bir kapsayıcıdaki son etkinlik gerçekleştirildiğinde yok edilir. tamamlandı.
- Yapılandırma değiştiğinde etkinlikler yeniden başlatılabilir. Böylece, oluşturulduğunda veya kaldırıldığında ve etkinlik sınırları değiştiğinde etkinlik örneğinin tamamen yok edilmesi ve oluşturabilirsiniz. Sonuç olarak, uygulama geliştiriciler aşağıdaki gibi konularda dikkatli olmalıdır: yaşam döngüsü geri çağırma yoluyla yeni etkinlikler başlatmak mümkün.
- Cihazların, etkinlik yerleştirmeyi desteklemek için pencere uzantıları arayüzünü içermesi gerekir. Android 12L (API düzeyi 32) veya sonraki sürümleri çalıştıran büyük ekranlı cihazların neredeyse hepsi bu arayüze sahiptir. Ancak, birden fazla etkinlik çalıştıramayan bazı büyük ekranlı cihazlarda pencere uzantıları arayüzü bulunmaz. Büyük ekranlı bir cihaz çoklu pencere modunu desteklemiyorsa cihaz etkinlik yerleştirmeyi desteklemiyor olabilir.
Ek kaynaklar
- Codelab: Etkinlik yerleştirme ve Materyal Tasarım ile liste ayrıntıları düzeni oluşturma
- Öğrenme rotası: Etkinlik yerleştirme
Sizin için önerilenler
- Not: JavaScript kapalıyken bağlantı metni gösterilir
- Etkinlik yerleştirme ve Materyal Tasarım ile liste ayrıntıları düzeni oluşturma
- Cihaz uyumluluk modu
- Çoklu pencere modunu destekleme