إضافة فيديوهات باستخدام ميزة "نافذة ضمن النافذة" (PiP)

بدءًا من إصدار Android 8.0 (المستوى 26 لواجهة برمجة التطبيقات)، يسمح Android بتشغيل الأنشطة نافذة ضمن النافذة (PiP). "نافذة ضمن النافذة" هو نوع خاص من وضع النوافذ المتعددة، وهو في الغالب المستخدم لتشغيل الفيديو. يتيح للمستخدم مشاهدة الفيديو في نافذة صغيرة مثبّتة إلى جانب من الشاشة أثناء التنقل بين التطبيقات أو تصفح المحتوى على الشاشة الرئيسية.

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

تظهر النافذة "نافذة ضمن النافذة" في أعلى الطبقة العلوية من الشاشة، في زاوية تختارها النظام.

يمكن أيضًا استخدام ميزة "نافذة ضمن النافذة" على الأجهزة المتوافقة التي تعمل بنظام التشغيل Android TV والتي تعمل بنظام التشغيل Android TV. Android 14 (المستوى 34) أو إصدار أحدث. في حين أن هناك العديد من أوجه التشابه، هناك اعتبارات إضافية عند استخدام ميزة "نافذة ضمن النافذة" على التلفزيون:

كيف يمكن للمستخدمين التفاعل مع نافذة "نافذة ضمن النافذة"

ويمكن للمستخدمين سحب نافذة "نافذة ضمن النافذة" إلى مكان آخر. بدءًا من نظام التشغيل Android 12، يمكن للمستخدمين يمكنك أيضًا:

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

  • انقر مرّتين على النافذة للتبديل بين حجم "نافذة ضمن النافذة" (PIP) الحالي والحد الأقصى. أو الحد الأدنى لحجم "نافذة ضمن النافذة"، مثل النقر مرّتين على نافذة مكبرة ويقلّلها، والعكس صحيح أيضًا.

  • يمكنك تخزين النافذة بسحبها إلى الحافة اليمنى أو اليسرى. لإلغاء إخفاء انقر على الجزء المرئي من النافذة المخزنة أو اسحبه للخارج.

  • غيِّر حجم النافذة في وضع "نافذة ضمن النافذة" باستخدام التصغير أو التكبير بإصبعين.

يتحكّم تطبيقك في وقت دخول النشاط الحالي في وضع "نافذة ضمن النافذة". إليك بعض الأمثلة الأمثلة:

  • يمكن أن يدخل النشاط في وضع "نافذة ضمن النافذة" عندما ينقر المستخدم على زر الشاشة الرئيسية أو يمرِّر سريعًا. الوصول إلى المنزل. هذه هي الطريقة التي يستمر بها تطبيق "خرائط Google" في عرض الاتجاهات أثناء تشغيل المستخدم لنشاط آخر في نفس الوقت.

  • يمكن لتطبيقك نقل فيديو إلى وضع "نافذة ضمن النافذة" إذا عاد المستخدم من وضع "نافذة ضمن النافذة". الفيديو لتصفّح محتوى آخر.

  • يمكن لتطبيقك تحويل فيديو إلى وضع "نافذة ضمن النافذة" عندما يشاهد المستخدم آخر الفيديو. حلقة من المحتوى. تعرض الشاشة الرئيسية عرضًا ترويجيًا أو ملخّصًا للحصول على معلومات حول الحلقة التالية في المسلسل.

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

الإعلان عن توفّر ميزة "نافذة ضمن النافذة" (PIP)

لا يتيح النظام تلقائيًا استخدام ميزة "نافذة ضمن النافذة" للتطبيقات. إذا أردت يمكنكم إتاحة الميزة "نافذة ضمن النافذة" في التطبيق، وتسجيل نشاط الفيديو في ملف البيان من خلال ضبط android:supportsPictureInPicture على true حدد أيضًا أن يتعامل النشاط مع تغييرات تهيئة التخطيط بحيث لا يؤدي نشاطك إعادة التشغيل عند حدوث تغييرات في التنسيق أثناء عمليات تبديل وضع "نافذة ضمن النافذة".

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

تبديل نشاطك إلى وضع "نافذة ضمن النافذة"

بدءًا من الإصدار 12 من نظام Android، يمكنك تبديل نشاطك إلى وضع "نافذة ضمن النافذة" من خلال ضبط. علامة setAutoEnterEnabled إلى true. باستخدام هذا الإعداد، يمكن أن يكون النشاط يتمّ التبديل تلقائيًا إلى وضع "نافذة ضمن النافذة" (PIP) حسب الحاجة بدون الحاجة إلى الاتصال بشكل صريح. enterPictureInPictureMode() في onUserLeaveHint. وهذا فائدة إضافية تتمثل في توفير انتقالات أكثر سلاسة. لمعرفة التفاصيل، يُرجى الاطّلاع على إنشاء الانتقال إلى وضع "نافذة ضمن النافذة" (PIP) بشكل أكثر سلاسة من التنقّل بالإيماءات

إذا كنت تستهدف الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم، يجب أن يتضمن أحد الأنشطة enterPictureInPictureMode() للتبديل إلى وضع "نافذة ضمن النافذة". على سبيل المثال، يقوم الرمز التالي بتبديل النشاط إلى وضع "نافذة ضمن النافذة" عندما ينقر المستخدم على زر مخصّص في واجهة مستخدم التطبيق:

Kotlin

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

Java

@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

قد ترغب في تضمين منطق يحول نشاطًا إلى وضع "نافذة ضمن النافذة" بدلاً من ذلك الدخول إلى الخلفية. على سبيل المثال، يتم تبديل "خرائط Google" إلى الوضع "نافذة ضمن النافذة" في حال ضغط المستخدِم على زر "الشاشة الرئيسية" أو زر "الأماكن الأخيرة" أثناء تنقُّل التطبيق. يمكنك اكتشاف هذه الحالة عن طريق تجاوز onUserLeaveHint():

Kotlin

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

Java

@Override
public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode();
    }
}

إجراء ننصح به: تقديم تجربة محسّنة لنقل البيانات في ميزة "نافذة ضمن النافذة" (PIP)

أضاف Android 12 تحسينات جمالية مهمة على الانتقالات المتحركة بين النوافذ في وضع "ملء الشاشة" و"نافذة ضمن النافذة" (PIP). ننصحك بشدة بتنفيذ جميع التغييرات السارية وبمجرد الانتهاء من ذلك، يتم توسيع هذه التغييرات تلقائيًا إلى الشاشات الكبيرة مثل الأجهزة القابلة للطي والأجهزة اللوحية بدون الحاجة إلى أي عمل إضافي.

إذا كان تطبيقك لا يتضمّن تحديثات سارية، لن يتم إجراء عمليات الانتقال إلى "نافذة ضمن النافذة". وظيفي، ولكن الرسوم المتحركة أقل تنقيحًا. على سبيل المثال، يمكن أن يؤدي الانتقال من وضع ملء الشاشة إلى وضع "نافذة ضمن النافذة" (PIP) إلى إخفاء النافذة أثناء الانتقال قبل أن يظهر مرة أخرى عند اكتمال الانتقال.

وتشمل هذه التغييرات ما يلي:

  • تسهيل الانتقال إلى وضع "نافذة ضمن النافذة" عند التنقّل بالإيماءات
  • ضبط sourceRectHint مناسبة للدخول في وضع "نافذة ضمن النافذة" والخروج منه
  • إيقاف ميزة تغيير الحجم السلس للمحتوى من غير الفيديوهات

يمكنك الرجوع إلى نظام Android نموذج عن صورة Kotlin PictureInPicture كمرجع لتفعيل تجربة انتقال منمّقة.

الانتقال إلى وضع "نافذة ضمن النافذة" بسهولة أكبر من خلال التنقُّل بالإيماءات

بدءًا من نظام التشغيل Android 12، توفّر علامة setAutoEnterEnabled الكثير من صورة متحركة أكثر سلاسة للانتقال إلى محتوى الفيديو في وضع "نافذة ضمن النافذة" باستخدام الإيماءات التنقّل، مثلاً عند التمرير سريعًا للأعلى إلى الشاشة الرئيسية من وضع ملء الشاشة.

أكمل الخطوات التالية لإجراء هذا التغيير وارجع إلى هذا النموذج المرجع:

  1. استخدام setAutoEnterEnabled للبناء PictureInPictureParams.Builder:

    Kotlin

    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())
    

    Java

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
    
  2. الاتصال بالرقم setPictureInPictureParams للاطّلاع على أحدث المكالمات PictureInPictureParams باكرًا. لا ينتظر التطبيق معاودة الاتصال onUserLeaveHint (كما كان يحدث في Android 11).

    على سبيل المثال، يمكنك الاتصال بـ setPictureInPictureParams على للتشغيل لأول مرة وأي عملية تشغيل تالية في حال تغيير نسبة العرض إلى الارتفاع.

  3. يمكنك الاتصال بالرقم setAutoEnterEnabled(false) عند الضرورة فقط. على سبيل المثال: قد لا تريد على الأرجح وضع "نافذة ضمن النافذة" إذا كان التشغيل الحالي متوقفًا مؤقتًا. الولاية.

ضبط sourceRectHint مناسبة للدخول في وضع "نافذة ضمن النافذة" والخروج منه

بدءًا من طرح ميزة "نافذة ضمن النافذة" (PIP) في الإصدار Android 8.0، setSourceRectHint. منطقة النشاط التي تكون مرئية بعد الانتقال إلى نافذة ضمن النافذة، على سبيل المثال، حدود مشاهدة الفيديو في مشغّل فيديو.

أمّا نظام التشغيل Android 12، فيستخدم sourceRectHint لتنفيذ مهام أكثر سلاسة الحركة عند الدخول إلى وضع "نافذة ضمن النافذة" والخروج منه.

لضبط sourceRectHint بشكل صحيح للدخول في وضع "نافذة ضمن النافذة" والخروج منه، يجب اتّباع الخطوات التالية:

  1. إنشاء PictureInPictureParams باستخدام الحدود الصحيحة مثل sourceRectHint. نقترح أيضًا إرفاق أداة معالجة تغيير التنسيق إلى مشغّل الفيديو:

    Kotlin

    val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, oldLeft: Int,
            oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop:
            Int, newRight: Int, newBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)
    

    Java

    private final View.OnLayoutChangeListener mOnLayoutChangeListener =
            (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight,
            newBottom) -> {
        final Rect sourceRectHint = new Rect();
        mYourVideoView.getGlobalVisibleRect(sourceRectHint);
        final PictureInPictureParams.Builder builder =
            new PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint);
        setPictureInPictureParams(builder.build());
    };
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener);
    
  2. إذا لزم الأمر، حدِّث sourceRectHint قبل أن يبدأ النظام والخروج من الصفحة. عندما يكون النظام على وشك الخروج من وضع "نافذة ضمن النافذة"، سيتم تفعيل تم تخطيط التسلسل الهرمي للعرض الهرمي على تهيئة الوجهة (على سبيل المثال، ملء الشاشة). يمكن للتطبيق إرفاق أداة معالجة تغيير التنسيق بالعرض الجذري. أو طريقة العرض المستهدفة (مثل مشاهدة مشغّل الفيديو) لاكتشاف الحدث عدِّل sourceRectHint قبل بدء الصورة المتحركة.

    Kotlin

    // Listener is called immediately after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom ->
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            val sourceRectHint = Rect()
            playerView.getGlobalVisibleRect(sourceRectHint)
            setPictureInPictureParams(
                PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build()
            )
        }
    }
    
    

    Java

    // Listener is called right after the user exits PiP but before
    // animating.
    playerView.addOnLayoutChangeListener((v, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom) -> {
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            final Rect sourceRectHint = new Rect();
            playerView.getGlobalVisibleRect(sourceRectHint);
            setPictureInPictureParams(
                new PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build());
        }
    });
    
    

إيقاف تغيير الحجم السلس للمحتوى من غير الفيديوهات

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

لإيقاف تغيير حجم المحتوى من غير الفيديوهات بسلاسة:

Kotlin

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build())

Java

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build());

التعامل مع واجهة المستخدم في وضع "نافذة ضمن النافذة" (PIP)

عندما يدخل النشاط في وضع "نافذة ضمن النافذة" أو يخرج منه، يستدعي النظام مكالمة. Activity.onPictureInPictureModeChanged() أو Fragment.onPictureInPictureModeChanged().

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

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

Kotlin

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean,
                                           newConfig: Configuration) {
    if (isInPictureInPictureMode) {
        // Hide the full-screen UI (controls, etc.) while in PiP mode.
    } else {
        // Restore the full-screen UI.
    }
}

Java

@Override
public void onPictureInPictureModeChanged (boolean isInPictureInPictureMode, Configuration newConfig) {
    if (isInPictureInPictureMode) {
        // Hide the full-screen UI (controls, etc.) while in PiP mode.
    } else {
        // Restore the full-screen UI.
        ...
    }
}

إضافة عناصر تحكّم

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

إذا كان التطبيق يحتوي على وسائط نشطة الجلسة ثم التشغيل الإيقاف المؤقت، التالية، وعناصر التحكم السابقة.

ويمكنك أيضًا تحديد إجراءات مخصصة بشكل صريح من خلال إنشاء PictureInPictureParams مع PictureInPictureParams.Builder.setActions() قبل الدخول في وضع "نافذة ضمن النافذة"، وتمرير المَعلمات عند الدخول إلى الوضع "نافذة ضمن النافذة" باستخدام enterPictureInPictureMode(android.app.PictureInPictureParams) أو setPictureInPictureParams(android.app.PictureInPictureParams). يُرجى توخّي الحذر. إذا حاولت إضافة أكثر من getMaxNumPictureInPictureActions(), فستحصل فقط على أقصى عدد.

مواصلة تشغيل الفيديو أثناء استخدام ميزة "نافذة ضمن النافذة"

عندما يتم تبديل نشاطك إلى "نافذة ضمن النافذة"، يضع النظام النشاط في "نافذة ضمن النافذة" مؤقتًا. ويسمي النشاط onPause(). حملة فيديو عدم إيقاف التشغيل مؤقتًا ومواصلة التشغيل إذا كان النشاط تم إيقافه مؤقتًا أثناء الانتقال إلى وضع "نافذة ضمن النافذة".

في نظام التشغيل Android 7.0 والإصدارات الأحدث، يجب إيقاف تشغيل الفيديو مؤقتًا واستئناف تشغيله عند إلى اتصال بيانات نشاطك onStop() و onStart(). من خلال القيام بذلك، يمكنك تجنُّب الاضطرار إلى التحقّق مما إذا كان تطبيقك في وضع "نافذة ضمن النافذة" على onPause(). مواصلة التشغيل بشكل صريح.

إذا لم تكن قد ضبطت علامة setAutoEnterEnabled على true وكنت بحاجة إلى إيقاف التشغيل مؤقتًا أثناء التنفيذ في onPause()، وللتحقّق من وضع "نافذة ضمن النافذة" (PIP) من خلال طلب isInPictureInPictureMode() والتعامل مع التشغيل بشكل مناسب. مثلاً:

Kotlin

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, do not pause playback
    if (isInPictureInPictureMode) {
        // Continue playback
    } else {
        // Use existing playback logic for paused Activity behavior.
    }
}

Java

@Override
public void onPause() {
    // If called while in PiP mode, do not pause playback
    if (isInPictureInPictureMode()) {
        // Continue playback
        ...
    } else {
        // Use existing playback logic for paused Activity behavior.
        ...
    }
}

عند تبديل نشاطك من وضع "نافذة ضمن النافذة" إلى وضع ملء الشاشة، يردّ النظام نشاطك ويتصل onResume().

استخدام نشاط تشغيل واحد لميزة "نافذة ضمن النافذة"

قد يختار المستخدم في تطبيقك فيديو جديدًا عند تصفّح المحتوى على الشاشة الرئيسية، بينما يكون نشاط تشغيل الفيديو في وضع "نافذة ضمن النافذة". تشغيل الفيديو الجديد في نشاط التشغيل الحالي في وضع ملء الشاشة، بدلاً من تشغيل نشاط جديد قد يربك المستخدم.

لضمان استخدام نشاط واحد لطلبات تشغيل الفيديو والتبديل في وضع "نافذة ضمن النافذة" (PIP) أو الخروج منه حسب الحاجة، اضبط السمة android:launchMode للنشاط على singleTask في بيان التطبيق:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

في نشاطك، يمكنك إلغاء onNewIntent() ومعالجة الفيديو الجديد، وإيقاف أي تشغيل فيديو حالي إذا لزم الأمر.

أفضل الممارسات

قد تكون ميزة "نافذة ضمن النافذة" غير مفعَّلة على الأجهزة ذات ذاكرة الوصول العشوائي (RAM). قبل أن يستخدم تطبيقك ميزة "نافذة ضمن النافذة"، تأكَّد من أنّها متاحة من خلال الاتصال hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE).

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

عندما يكون النشاط في وضع "نافذة ضمن النافذة"، لا يتم التركيز على الإدخال تلقائيًا. إلى تلقّي أحداث الإدخال أثناء استخدام وضع "نافذة ضمن النافذة"، واستخدام MediaSession.setCallback(). لمزيد من المعلومات عن استخدام setCallback()، راجع عرض ميزة "التعرّف التلقائي على الموسيقى"

عندما يكون التطبيق في وضع "نافذة ضمن النافذة"، قد يؤدي تشغيل الفيديو في هذه النافذة إلى تشغيل الصوت. التداخل مع تطبيق آخر، مثل تطبيق مشغّل موسيقى أو تطبيق بحث صوتي لتجنُّب حدوث ذلك، يمكنك طلب التركيز على الصوت عند بدء تشغيل الفيديو والتعامل مع إشعارات تغيير تركيز الصوت، كما هو موضّح في إدارة الصوت التركيز: إذا تلقّيت إشعارًا لفقدان تركيز الصوت عندما يكون وضع "نافذة ضمن النافذة" (PIP) إيقاف تشغيل الفيديو مؤقتًا أو إيقافه

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

رمز نموذجي إضافي

لتنزيل نموذج تطبيق مكتوب بلغة Kotlin، يمكنك الاطّلاع على مقالة Android PictureInPicture Sample على نظام التشغيل Android. (Kotlin).