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

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

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

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

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

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

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

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

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

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

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

  • يمكن أن يدخل النشاط في وضع "نافذة ضمن النافذة" عندما ينقر المستخدم على زر الشاشة الرئيسية أو يمرِّر سريعًا إلى أعلى الصفحة الرئيسية. هذه هي الطريقة التي تستمر بها خرائط 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. وله فائدة إضافية تتمثل في توفير انتقالات أكثر سلاسة. لمعرفة التفاصيل، يُرجى الاطّلاع على المقالة جعل الانتقالات إلى وضع "نافذة ضمن النافذة" أكثر سلاسة من التنقّل بالإيماءات.

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

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 مناسب للدخول في وضع "نافذة ضمن النافذة" والخروج منه
  • إيقاف تغيير الحجم السلس للمحتوى من غير الفيديوهات

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

استخدام وضع "نافذة ضمن النافذة" (PiP) بشكل أكثر سلاسة من التنقّل بالإيماءات

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

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

Kotlin

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

Java

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

التعامل مع واجهة المستخدم أثناء وضع "نافذة ضمن النافذة"

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

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

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

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()، تحقَّق من وضع "نافذة ضمن النافذة" من خلال طلب المساعدة 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().

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

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

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

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

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

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

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

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

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

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

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

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

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