هل من الطبيعي أن يتم استدعاء طريقة "Activity.oncreate ()" عدة مرات

StackOverflow https://stackoverflow.com/questions/3588682

  •  01-10-2019
  •  | 
  •  

سؤال

لدي بعض التعليمات البرمجية في طريقة oncreate نشاط ولاحظت أنه يطلق عليه ثلاث مرات. هل هو سلوك طبيعي؟ شكرًا.

هل كانت مفيدة؟

المحلول

قد ترغب في قراءة الوثائق على دورة حياة النشاط.

سيتم استدعاء OnCreate مرة واحدة فقط لكل عمر من النشاط. ومع ذلك ، هناك عدد من المواقف التي يمكن أن تتسبب في مقتل نشاطك وإعادته إلى الحياة. وبالتالي ، سيتم استدعاء oncreate مرة أخرى.

لدعم ذلك بشكل صحيح ، يمكنك حفظ معلومات الحالة في onsaveinstancestate واستعادتها على حزمة الحالة التي تحصل عليها.

نصائح أخرى

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

الحل بسيط (على الرغم من أنك قد لا تحب ذلك: P)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);

        if(savedInstanceState == null){
            // everything else that doesn't update UI
        }
    }

يمكنك أيضًا التعامل مع تغييرات التكوين بمفردك ، وإعدادها على AndroidManifest البيان التالي ، في تكوين النشاط:

android:configChanges="orientation|keyboardHidden"

لمزيد من المعلومات ، يمكنك إلقاء نظرة على الوثائق الرسمية

فيما يلي سيناريو واجهته (وحله) ينتج السلوك الذي تصفه:

هناك 3 أحداث ستؤدي إلى تشغيل OnTouch - 1. Android.View.Motionevent.action_up 2. Android.View.motionevent.action_down 3. android.view.motionevent.action_move.

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

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

واجهت مشكلة مماثلة ، كان سببها mobileads. بعد تهيئتها من قبل super.onCreate(...) ذهبت المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top