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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

الإعلان عن توفّر ميزة "نافذة ضمن النافذة" (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)، قد تختفي هذه النافذة أثناء الانتقال قبل ظهورها مرة أخرى عند اكتمال عملية الانتقال.

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

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

راجِع نموذج Kotlin PictureInPicture لنظام التشغيل Android كمرجع لتفعيل تجربة انتقال منسَّقة.

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

بدءًا من 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 مناسبة للدخول في وضع "نافذة ضمن النافذة" والخروج منه

بدءًا من طرح ميزة "نافذة ضمن النافذة" في الإصدار 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() الخاصَّين بنشاطك. بهذه الطريقة، ستتجنّب الحاجة إلى التحقّق مما إذا كان وضع "نافذة ضمن النافذة" (PIP) في 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.
        ...
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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