Android Nougat'ın Serbest Biçimli Pencere Modu: Nedir ve Geliştiriciler Bunu Nasıl Kullanabilir?

Serbest biçimli çoklu pencere modu, Android Nougat'ta yeterince kullanılmayan ve yeterince takdir edilmeyen bir özelliktir. Bunun ne olduğunu ve geliştiricilerin bunu nasıl dahil edebileceğini açıklıyoruz.

Serbest biçimli pencere modu, ilk kez gösterildiği gibi Ars Teknik

Android 7.0 Nougat, 2016'nın başlarında ilk kez duyurulduğunda, Android platformuna çok istenen bir özelliği de beraberinde getirdi: çoklu pencere desteği. Çoğu kişi, tüm Android Nougat telefonlarda ve tabletlerde varsayılan olarak etkinleştirilmiş bölünmüş ekran çoklu pencere desteğinin farkındadır. Android Nougat'lı Android TV cihazları, resim içinde resim çoklu pencere desteği desteğiyle birlikte gelir.

Ancak Android Nougat'ta çok fazla kişinin bilmediği üçüncü bir çoklu pencere modu daha var: serbest biçimli pencere modu. Bu mod, Android'in uygulamaları kullanıcının isteğine göre taşınabilen ve yeniden boyutlandırılabilen kayan pencereler olarak sunmasına olanak tanır. Bu aslında Android'in bir uygulamasıdır. pencere yöneticisi istifleme.

İçinde Android SDK belgeleri, Şu hususları belirtmektedir:

Daha büyük cihazların üreticileri, kullanıcının her etkinliği serbestçe yeniden boyutlandırabileceği serbest biçimli modu etkinleştirmeyi seçebilir. Üreticinin bu özelliği etkinleştirmesi durumunda cihaz, bölünmüş ekran moduna ek olarak serbest biçimli mod da sunuyor.

Ve ayrıca Android 7.0 CDD'si:

Xlarge ekran boyutuna sahip cihaz uygulamalarının serbest biçim modunu desteklemesi GEREKİR.

Bu, Android 7.0 ile birlikte gelen herhangi bir yeni büyük ekranlı Android cihazının, üretici tarafından serbest biçimli pencere modunun etkinleştirilebileceğini gösterir.

Ancak bu kesinlikle zor bir gereklilik değildir. Zorlamak mümkün herhangi İki farklı yöntemden birini kullanarak serbest biçimli pencere modunu desteklemek için Android Nougat cihazı (geliştirici seçenekleri etkinleştirilmiş olarak):


Herhangi bir Android Nougat cihazında serbest biçimli pencere modunu etkinleştirme

"Etkinlikleri yeniden boyutlandırılabilir olmaya zorla" seçeneğinin açılması, uygulamaların herhangi bir cihazda serbest biçimli modda çalışmasına olanak tanır

Yöntem 1 (adb'li bir bilgisayar gereklidir)

Geliştirici Seçeneklerinde USB Hata Ayıklamanın etkinleştirildiğinden emin olun. Ardından cihazınızı adb yüklü bir bilgisayara bağlayın ve aşağıdaki komutu yürütün:

adb shell settings put global enable_freeform_support 1

Yöntem 2 (ek gereksinim yok)

Geliştirici Seçenekleri'nin altındaki "Etkinlikleri yeniden boyutlandırılabilir olmaya zorla" seçeneğini etkinleştirin.

Bu yöntemlerin her ikisinin de etkili olabilmesi için Sistem Kullanıcı Arayüzünün yeniden başlatılması gerekir. Bunu yapmanın en kolay yolu, cihazınızı yeniden başlatmaktır (veya cihazınız rootluysa, basitçe sonlandırabilirsiniz) com.android.systemui işlem)


Tamam, serbest biçim modu etkinleştirildi… şimdi ne olacak?

Yöntem 1'i kullanarak serbest biçim modunu etkinleştirdiyseniz, Genel Bakış menüsündeki uygulama girişlerinde bir uygulamayı serbest biçimli pencere modunda başlatmak için yeni bir düğme olacaktır.

Ancak Yöntem 2'de, bir uygulamayı Android'in kendisi aracılığıyla serbest biçim modunda başlatmak mümkün değildir. Neyse ki, herhangi bir üçüncü taraf başlatıcının bir uygulamayı serbest biçimli pencere modunda başlatması mümkündür API düzeyi 24 kapsamında sonlandırılan standart Android API'lerini kullanarak.

Bir uygulamayı serbest biçim modunda başlatmanın anahtarı, ActivityOptions.setLaunchBounds() yöntem. Bu yöntem bir Rect bağımsız değişken olarak uygulamanın başlatılacağı pencere sınırlarını içerir.

Daha sonra uygulamayı şununla başlatabilirsiniz: startActivity(Intent, Bundle). Zaten bir hesabınız yoksa ActivityOptions paket, şununla bir tane oluşturabilirsiniz: ActivityOptions.makeBasic() ve sonra arıyorum setLaunchBounds() yeni oluşturulan pakette.

Varsayılan olarak, Genel Bakış ekranında uygulama için zaten bir görev varsa, o zaman Android sizi daha önce başlatılan mevcut (tam ekran) göreve yönlendirecektir. kullanıcı. Uygulamayı serbest biçimli bir pencerede başlatmayı denemeden önce Genel Bakış'ta uygulamaya ilişkin tüm görevleri temizlemeniz gerekecektir. (Şu tarihte başlatılan etkinliklere sahip uygulamalar için: standard veya singleTop modlarını ekleyerek yeni bir pencerenin açılmasını sağlayabilirsiniz. Intent.FLAG_ACTIVITY_MULTIPLE_TASK çağırmadan önce amacı işaretleyin startActivity().)


Serbest biçim modu aslında nasıl çalışıyor?

Orada mükemmel bir makale Serbest biçimli mod da dahil olmak üzere çoklu pencere modunun Android Nougat'ta nasıl uygulandığını açıklayan bir yazı. (NOT: makale Çince yazılmıştır, bu nedenle Google Translate'den geçirdiğinizden emin olun)

Özetle, serbest biçim modundaki uygulamalar sistemin geri kalanından ayrı bir yığında çalışır (düşünün: sanal masaüstü). Bu nedenle serbest biçimli uygulamaların başlatıcının üzerinde veya başka bir tam ekran uygulamanın üzerinde çalışması mümkün değildir.

Serbest biçim modunda çalışan uygulamalar (bu android: windowIsFloating doğru olarak ayarlanmış) DecorCaptionView üst seviyenin çocuğu olarak eklendi DecorView. Bu görünüm şunları içerir: LinearLayout Pencereyi taşımak, büyütmek ve kapatmak için pencerenin başlık çubuğunu tanımlama. Şahsen tavsiye etmemekle birlikte, bu görünüme erişmek ve özelleştirmek mümkündür. DecorView kullanarak Window.getDecorView(), onu bir ViewGroup ve ardından alt görünümlerine erişiliyor.

Android'in standart bölünmüş ekran çoklu pencere modunda iyi çalışacak şekilde tasarlanan herhangi bir uygulama, serbest biçimli modda çalışacaktır. isInMultiWindowMode() serbest biçim modunda çalışan uygulamalar için true değerini döndürecektir. Bir uygulamanın kullanabileceği, özellikle serbest biçimli modla ilgili, genel kullanıma açık birkaç sınıf ve yöntem daha vardır:

  • Window.setDecorCaptionShade(): Bu yöntem, serbest biçim modundaki uygulamalar için başlık kontrollerinin gölgesini (büyütme ve kapatma düğmesi) geçersiz kılmak için kullanılabilir.
  • Window.setRestrictedCaptionAreaListener(): Bu, bir pencerenin serbest biçim modunda ne zaman hareket ettiğini algılamak için kullanılabilir. Window.OnRectrictedCaptionAreaChangedListener Altyazı kontrollerinin konumu her değiştiğinde (kullanıcı pencereyi hareket ettirdiğinde) çağrılır ve Rect altyazı kontrollerinin yeni sınırlarıyla.
  • ActivityInfo.WindowLayout: Bu sınıf, bir uygulamanın başlatıldığında isteyebileceği serbest biçimli bir pencerenin ilk konumlandırılmasına ilişkin olarak uygulamanın bildiriminde bildirilen bilgileri içerir. Örneğin aşağıdakileri listeleyebilirsiniz: manifestinizin etiketi:
     android: defaultHeight="640dp"
    android: defaultWidth="360dp"
    android: gravity="center" />
    Daha sonra cihaz zaten serbest biçim modundayken ve uygulama başlatıldığında, belirtilen sınırlarla başlatılacaktır.

Serbest biçimli pencere modunun uygulama örnekleri

Görev Çubuğu, serbest biçimli pencere modunu tamamlamak için bir başlat menüsü ve en son uygulamalar tepsisini ekler

2016 yazında, Android Nougat hâlâ geliştirici önizlemesiyken, adında bir uygulama yayınladım. Görev çubuğu Bu, bir sistem katmanında Windows benzeri bir başlat menüsü ve en son uygulama listesini sağlar. Nougat'taki kullanıcıların uygulamaları serbest biçimli pencere modunda başlatmasına olanak tanır ve Görev Çubuğu bir kaplama kullandığından, serbest biçimli pencere ortamında ekranda kalabilir. Görev Çubuğu ve serbest biçim modunun birleşimi, herhangi bir Android cihazına, özellikle de tabletlere, PC benzeri bir his verir.

Yapabilirsiniz Görev Çubuğunu indir Google Play'de veya kaynak kodunu görüntüle GitHub'da kendiniz. Bu makalede bahsedilen kavramlara ek olarak, ekranda serbest biçimli pencere görüntülenmediğinde bile serbest biçim modu ortamını aktif tutmak için birkaç püf noktası da kullanıyorum. Kullanıcılar ayrıca isteğe bağlı olarak Görev Çubuğunu, cihazlarının serbest biçimli mod ortamına otomatik olarak önyüklenmesine izin vermek için varsayılan başlatıcı olarak ayarlayabilirler.

OEM tarafından etkinleştirilen serbest biçimli pencere desteğiyle resmi olarak gönderilen hiçbir cihaz olmadığından (bu yazının yazıldığı an itibariyle), şunu öneririm: Görev Çubuğunu, geliştiricilerin uygulamalarını başka türlü desteklemeyen cihazlarda serbest biçimli pencere ortamında test etmeleri için bir araç olarak kullanma BT.

Görev Çubuğuna ek olarak, uygulamaları serbest biçim modunda başlatmasına izin vermek için AOSP'deki Launcher3 kaynak kodunu da değiştirdim. Bu, serbest biçimli uygulamaları başlatmasına izin vermek için gereken minimum değişikliklerle birlikte, stok Android 7.1.1 başlatıcısının düz bir kopyasıdır. Bu değiştirilmiş başlatıcıyı, diğer geliştiricilerin kendi özel başlatıcılarında serbest biçimli pencereleri başlatmak için destek uygulayacakları umuduyla sağladım. Yapabilirsiniz kaynak kodunu görüntüle GitHub'da veya örnek bir APK indir.

Umudum, özel başlatıcı geliştiricilerinin bu kodu kullanabilmesi ve serbest biçimli başlatma desteğini etkinleştirebilmesidir Geniş ekranlarında pencere yönetimi için daha fazla esneklik isteyen kullanıcılar için pencere uygulamaları cihazlar.