وضع نافذة الشكل الحر لـ Android Nougat: ما هو وكيف يمكن للمطورين الاستفادة منه

وضع نافذة حر ، كما هو موضح لأول مرة من قبل آريس تكنيكا

عندما تم الإعلان عن Android 7.0 Nougat لأول مرة في أوائل عام 2016 ، فقد جلب معه ميزة مطلوبة للغاية لمنصة Android - دعم متعدد النوافذ. معظم الناس على دراية بتقسيم الشاشة متعدد النوافذ الممكّن افتراضيًا على جميع هواتف Android Nougat والأجهزة اللوحية. تأتي أجهزة تلفزيون Android المزودة بنظام Android Nougat مع دعم متعدد النوافذ للصور.

ومع ذلك ، يوجد وضع ثالث متعدد النوافذ في Android Nougat لا يعرفه الكثير من الأشخاص: وضع إطار حر . يتيح هذا الوضع لـ Android تقديم تطبيقات كنوافذ عائمة يمكن نقلها وتغيير حجمها حسب رغبة المستخدم. إنه في الأساس تطبيق Android لمدير نوافذ التراص.

في وثائق Android SDK ، تنص على ما يلي:

يمكن لمصنعي الأجهزة الأكبر اختيار تمكين وضع الشكل الحر ، حيث يمكن للمستخدم تغيير حجم كل نشاط بحرية. إذا كانت الشركة المصنعة تمكن هذه الميزة ، فإن الجهاز يوفر وضع الشكل الحر بالإضافة إلى وضع تقسيم الشاشة.

وأيضًا ، في Android 7.0 CDD:

تطبيقات الأجهزة مع حجم الشاشة xlarge يجب أن تدعم وضع الشكل الحر.

يشير هذا إلى أن أي جهاز Android بشاشة كبيرة يأتي مع الإصدار 7.0 من Android قد يحتمل أن يكون قد تم تمكين وضع إطار حر به من قبل الشركة المصنعة.

ومع ذلك ، هذا ليس مطلبًا صعبًا على الإطلاق. من الممكن فرض أي جهاز Android Nougat (مع تمكين خيارات المطور) لدعم وضع نافذة الشكل الحر باستخدام إحدى طريقتين مختلفتين:


تمكين وضع نافذة الشكل الحر على أي جهاز يعمل بنظام Android Nougat

يتيح تشغيل خيار "فرض أنشطة قابلة للقياس" إمكانية تشغيل التطبيقات في وضع الشكل الحر على أي جهاز

الطريقة الأولى (مطلوب كمبيوتر مع بنك التنمية الآسيوي)

تأكد من تمكين تصحيح أخطاء USB في خيارات المطور. بعد ذلك ، قم بتوصيل جهازك بأحد أجهزة الكمبيوتر مع تثبيت adb ، وقم بتنفيذ الأمر التالي:

 adb shell settings put global enable_freeform_support 1 

الطريقة 2 (لا توجد متطلبات إضافية)

قم بتمكين خيار "فرض أنشطة يمكن تغيير حجمها" في أسفل خيارات المطور.

تتطلب كلتا الطريقتين إعادة تشغيل واجهة مستخدم النظام قبل سريان مفعولها. أسهل طريقة للقيام بذلك هي إعادة تشغيل جهازك (أو ، إذا كان جهازك متجذرًا ، يمكنك ببساطة قتل عملية com.android.systemui )


حسنًا ، تم تمكين وضع الشكل الحر ... ماذا بعد؟

إذا قمت بتمكين وضع الشكل الحر باستخدام الطريقة الأولى ، فسيكون هناك زر جديد لإدخالات التطبيق في قائمة نظرة عامة لتشغيل تطبيق في وضع نافذة الشكل الحر.

مع الطريقة الثانية ، ومع ذلك ، لا يمكن تشغيل تطبيق في وضع الشكل الحر من خلال نظام Android نفسه. لحسن الحظ ، يمكن لأي قاذفة خارجية تشغيل تطبيق في وضع نافذة حر باستخدام واجهات برمجة تطبيقات أندرويد القياسية التي تم الانتهاء منها كجزء من مستوى API 24.

مفتاح تشغيل تطبيق ما في وضع الشكل الحر هو استدعاء أسلوب ActivityOptions.setLaunchBounds() . تأخذ هذه الطريقة Rect كوسيطة ، تحتوي على حدود النافذة التي سيتم تشغيل التطبيق بها.

يمكنك بعد ذلك بدء تشغيل التطبيق باستخدام startActivity(Intent, Bundle) . إذا لم يكن لديك بالفعل حزمة ActivityOptions ، يمكنك إنشاء واحدة باستخدام ActivityOptions.makeBasic() ثم استدعاء setLaunchBounds() على الحزمة التي تم إنشاؤها حديثًا.

لاحظ أنه افتراضيًا ، إذا كانت هناك مهمة بالفعل للتطبيق الحالي في شاشة النظرة العامة ، فسيقوم Android ببساطة بإعادة توجيهك إلى المهمة الحالية (ملء الشاشة) التي بدأها المستخدم من قبل. ستحتاج إلى محو أية مهام للتطبيق في نظرة عامة قبل محاولة تشغيل التطبيق في نافذة مجانية. (بالنسبة للتطبيقات التي تشتمل على أنشطة يتم singleTop أوضاع standard أو singleTop ، يمكنك فرض نافذة جديدة لفتح بإضافة علامة Intent.FLAG_ACTIVITY_MULTIPLE_TASK إلى القصد قبل استدعاء startActivity() .)


كيف يعمل وضع الشكل الحر أسفل الغطاء؟

هناك مقال ممتاز مكتوب يوضح كيفية تنفيذ وضع النوافذ المتعددة ، بما في ذلك وضع الشكل الحر ، في Android Nougat. (ملاحظة: المقال مكتوب باللغة الصينية ، لذا تأكد من تشغيله من خلال خدمة الترجمة من Google)

باختصار ، يتم تشغيل التطبيقات في وضع الشكل الحر في كومة منفصلة عن بقية النظام (أعتقد: سطح المكتب الافتراضي). لذلك ، لا يمكن تشغيل التطبيقات المجانية أعلى المشغل أو أعلى تطبيق آخر بملء الشاشة.

تحتوي التطبيقات التي تعمل في وضع الشكل الحر (التي لا تحتوي على نظام android:windowIsFloating مضبوط على true) على DecorCaptionView تمت إضافتها إلى DecorCaptionView كطفل في DecorView المستوى DecorView . تحتوي طريقة العرض هذه على LinearLayout يحدد شريط التسمية التوضيحية للإطار LinearLayout الإطار LinearLayout وإغلاقه. على الرغم من أنني لا أوصي به شخصيًا ، فمن الممكن الوصول إلى طريقة العرض هذه وتخصيصها عن طريق الحصول على DecorView باستخدام Window.getDecorView() ، ViewGroup إلى ViewGroup ثم الوصول إلى طرق العرض التابعة لها.

أي تطبيق تم تصميمه للعمل بشكل جيد في وضع الشاشة المتعددة المقسومة على نظام Android سيعمل في وضع الشكل الحر. isInMultiWindowMode() سيعود صحيحًا للتطبيقات التي تعمل في وضع الشكل الحر. هناك عدد قليل من الفئات والأساليب المتاحة للعموم والتي يمكن للتطبيق استخدامها والتي ترتبط بشكل خاص بوضع الشكل الحر:

  • Window.setDecorCaptionShade() : يمكن استخدام هذه الطريقة لتجاوز ظل عناصر تحكم التسمية التوضيحية (الزر تكبير وإغلاق) للتطبيقات في وضع الشكل الحر.
  • Window.setRestrictedCaptionAreaListener() : يمكن استخدام هذا لاكتشاف عندما يتم نقل نافذة في وضع الشكل الحر. يتم استدعاء Window.OnRectrictedCaptionAreaChangedListener كل مرة يتم فيها تغيير موضع عناصر التحكم في التسمية التوضيحية (عندما يتحرك المستخدم في النافذة) ، ويوفر Rect مع الحدود الجديدة لعناصر التحكم في التسمية التوضيحية.
  • ActivityInfo.WindowLayout : تحتوي هذه الفئة على معلومات تم الإعلان عنها في بيان التطبيق فيما يتعلق بالموضع الأولي لإطار شكل حر يمكن لأحد التطبيقات أن يطلبه عند بدء التشغيل. على سبيل المثال ، يمكنك سرد ما يلي في علامة البيان الخاص بك:

    بعد ذلك ، عندما يكون الجهاز بالفعل في وضع الشكل الحر ويتم تشغيل التطبيق ، فسيتم تشغيله بهذه الحدود المحددة.


أمثلة من وضع نافذة الحر في العمل

يضيف شريط المهام قائمة البدء وصينية التطبيقات الحديثة لتكمل وضع نافذة الشكل الحر

في صيف عام 2016 ، بينما كان Android Nougat لا يزال بمثابة معاينة للمطورين ، قمت بإصدار تطبيق يسمى شريط المهام يوفر قائمة بدء تشبه Windows وقائمة تطبيقات حديثة في تراكب النظام. يتيح للمستخدمين على Nougat تشغيل التطبيقات في وضع نافذة شكل حر - وبما أن شريط المهام يستخدم تراكبًا ، فيمكن أن يبقى على الشاشة في بيئة نافذة الشكل الحر. يمنح الجمع بين شريط المهام ووضع الشكل الحر أي جهاز Android ، وخاصة الأجهزة اللوحية ، مثل الكمبيوتر.

يمكنك تنزيل شريط المهام على Google Play ، أو عرض التعليمات البرمجية المصدر بنفسك على GitHub. بالإضافة إلى المفاهيم المذكورة في هذه المقالة ، فإنني أوظف أيضًا بعض الحيل للحفاظ على بيئة وضع الشكل الحر نشطة حتى في حالة عدم عرض نوافذ شكل حر على الشاشة. يمكن للمستخدمين أيضًا تعيين "شريط المهام" اختياريًا كمشغلهم الافتراضي للسماح لأجهزتهم بالتمهيد تلقائيًا إلى بيئة وضع الشكل الحر.

نظرًا لعدم وجود أجهزة يتم شحنها رسميًا مع دعم نافذة شكل حر مُمكّن من قبل الشركة المصنعة (حتى كتابة هذه السطور) ، أوصي باستخدام شريط المهام كأداة للمطورين لاختبار تطبيقاتهم في بيئة نافذة الشكل الحر على الأجهزة التي لا تدعمها .

بالإضافة إلى شريط المهام ، قمت أيضًا بتعديل شفرة مصدر Launcher3 من AOSP للسماح لها بتشغيل التطبيقات في وضع الشكل الحر. هذا استنساخ مباشر لقاذفة Android 7.1.1 ، مع الحد الأدنى من التعديلات الضرورية للسماح له بتشغيل تطبيقات شكل حر. لقد قدمت هذا المشغل المعدل على أمل أن يقوم مطورون آخرون بتطبيق دعم لإطلاق نوافذ حرة في مشغلاتهم المخصصة. يمكنك عرض التعليمات البرمجية المصدر على GitHub ، أو تنزيل نموذج APK.

آمل أن يتمكن مطورو برامج الإطلاق المخصصة من استخدام هذا الرمز وتمكين الدعم لبدء تشغيل تطبيقات نافذة حرة لهؤلاء المستخدمين الذين يرغبون في مزيد من المرونة لإدارة النوافذ على أجهزتهم الكبيرة الشاشة.