วงจรชีวิตกิจกรรม Android - วิธีการทั้งหมดเหล่านี้มีไว้เพื่ออะไร?


420

วงจรชีวิตของกิจกรรม Android คืออะไร ทำไมจึงมีจำนวนมากดังนั้นวิธีการที่คล้ายกันทำให้เกิดเสียง ( onCreate(), onStart(), onResume()) เรียกว่าในระหว่างการเตรียมและอื่น ๆ มากมาย (onPause() , onStop(), onDestroy()) ที่เรียกว่าสิ้นสุดหรือไม่

จะเรียกวิธีการเหล่านี้เมื่อใดและควรใช้อย่างเหมาะสมอย่างไร


17
ทำไมคำถามนี้ถูกยกระดับขึ้นมาหลายครั้งแล้ว? ทำไมมันยังไม่ถูกปิด?
Alexander Kulyakhtin

54
ทำไมต้องปิดคำถามด้วยจำนวนผู้อัปโหลดมาก? Stackoverflow มีนิสัยที่ไม่ดี
Dick Lucas

12
นี่เป็นคำถามสไตล์ wiki และฉันรู้สึกว่าควรได้รับอนุญาตบนเว็บไซต์
Mateen Ulhaq

2
@Alexander Kulyakhtin - ทำไมต้องปิดคำถามนี้ คุณควรปิดบัญชีของคุณหากคุณไม่สามารถแยกแยะข้อมูลที่ให้ไว้ในคำตอบสำหรับผู้ใช้ android รุ่นใหม่ คำถามนี้เต็มไปด้วยความรู้และฉันจะลงคะแนนคำถามนี้
Stack Overflow

เมื่อใดที่วิธีการเหล่านี้เรียกว่าคำถามคุณลองทำอะไรบ้าง
Sreekanth Karumanaghat

คำตอบ:


748

ดูได้ในActivity Lifecycle (ที่นักพัฒนา Android)

ป้อนคำอธิบายภาพที่นี่

onCreate () :

เรียกว่าเมื่อกิจกรรมถูกสร้างขึ้นครั้งแรก นี่คือที่ที่คุณควรทำการตั้งค่าสแตติกปกติทั้งหมดของคุณ: สร้างมุมมองผูกข้อมูลไปยังรายการ ฯลฯ วิธีนี้ยังช่วยให้คุณมีบันเดิลที่มีสถานะแช่แข็งก่อนหน้าของกิจกรรมถ้ามี ตามมาด้วย onStart () เสมอ

onRestart () :

เรียกว่าหลังจากที่กิจกรรมของคุณหยุดลงก่อนที่จะเริ่มต้นอีกครั้ง ตามมาด้วย onStart () เสมอ

onStart () :

เรียกว่าเมื่อผู้ใช้มองเห็นกิจกรรม ตามด้วย onResume () หากกิจกรรมมาถึงเบื้องหน้า

onResume () :

เรียกว่าเมื่อกิจกรรมจะเริ่มโต้ตอบกับผู้ใช้ ณ จุดนี้กิจกรรมของคุณจะอยู่ที่ด้านบนสุดของสแต็กกิจกรรมโดยอินพุตของผู้ใช้จะเข้าสู่กิจกรรม ตามมาด้วย onPause () เสมอ

onPause () :

เรียกว่าเป็นส่วนหนึ่งของวงจรชีวิตของกิจกรรมเมื่อกิจกรรมเข้าสู่พื้นหลัง แต่ยังไม่ถูกฆ่า (ยัง) คู่กับ onResume () เมื่อกิจกรรม B เปิดตัวต่อหน้ากิจกรรม A การเรียกกลับนี้จะถูกเรียกใช้บน A. B จะไม่ถูกสร้างขึ้นจนกว่า A ของ onPause () จะกลับมาดังนั้นอย่าทำอะไรเลยที่นี่

onStop () :

ถูกเรียกเมื่อคุณไม่เห็นผู้ใช้อีกต่อไป คุณจะได้รับ onRestart (), onDestroy () หรือไม่มีอะไรเลยขึ้นอยู่กับกิจกรรมของผู้ใช้ในภายหลัง โปรดทราบว่าวิธีนี้อาจไม่เคยถูกเรียกใช้ในสถานการณ์ที่หน่วยความจำเหลือน้อยซึ่งระบบมีหน่วยความจำไม่เพียงพอที่จะทำให้กระบวนการของกิจกรรมของคุณทำงานหลังจากที่มีการเรียกใช้เมธอด onPause ()

onDestroy () :

การโทรครั้งสุดท้ายที่คุณได้รับก่อนที่กิจกรรมของคุณจะถูกทำลาย สิ่งนี้อาจเกิดขึ้นได้เนื่องจากกิจกรรมกำลังสิ้นสุดลง (บางคนเรียกว่า finish () บนกิจกรรมหรือเนื่องจากระบบกำลังทำลายอินสแตนซ์ของกิจกรรมนี้ชั่วคราวเพื่อประหยัดพื้นที่คุณสามารถแยกแยะระหว่าง> สองสถานการณ์นี้ด้วยเมธอด isFinishing ()

เมื่อกิจกรรมครั้งแรกโหลดเหตุการณ์จะถูกเรียกว่าด้านล่าง:

onCreate()
onStart()
onResume()

เมื่อคุณคลิกที่ปุ่มโทรศัพท์กิจกรรมไปที่พื้นหลังและกิจกรรมด้านล่างเรียกว่า:

onPause()
onStop()

ออกจากตัวเรียกเลขหมายโทรศัพท์และกิจกรรมด้านล่างจะถูกเรียก:

onRestart()
onStart()
onResume()

เมื่อคุณคลิกที่ปุ่มย้อนกลับหรือพยายามที่จะเสร็จสิ้น ()กิจกรรมที่เรียกว่ากิจกรรมดังต่อไปนี้:

onPause()
onStop()
onDestroy()

สถานะกิจกรรม

Android OS ใช้คิวลำดับความสำคัญเพื่อช่วยในการจัดการกิจกรรมที่ทำงานบนอุปกรณ์ ขึ้นอยู่กับสถานะของกิจกรรม Android โดยเฉพาะกิจกรรมนั้นจะถูกกำหนดให้มีลำดับความสำคัญภายในระบบปฏิบัติการ ระบบลำดับความสำคัญนี้ช่วยให้ Android สามารถระบุกิจกรรมที่ไม่ได้ใช้งานได้อีกต่อไปทำให้ระบบปฏิบัติการสามารถเรียกคืนหน่วยความจำและทรัพยากรได้ แผนภาพต่อไปนี้แสดงให้เห็นถึงสถานะของกิจกรรมที่สามารถผ่านได้ในช่วงอายุการใช้งาน:

สถานะเหล่านี้สามารถแบ่งออกเป็นสามกลุ่มหลักดังนี้:

แอคทีฟหรือกำลังรัน - กิจกรรมจะถูกพิจารณาว่าแอ็คทีฟหรือกำลังรันหากอยู่ในเบื้องหน้าหรือที่เรียกว่าด้านบนของสแต็กกิจกรรม กิจกรรมนี้ถือว่าเป็นกิจกรรมที่มีความสำคัญสูงสุดในสแต็กกิจกรรม Android และระบบปฏิบัติการดังกล่าวจะถูกฆ่าในสถานการณ์ที่รุนแรงเช่นหากกิจกรรมพยายามใช้หน่วยความจำมากกว่าที่มีอยู่ในอุปกรณ์เนื่องจากอาจทำให้ UI ไม่ตอบสนอง

หยุดชั่วคราว - เมื่ออุปกรณ์เข้าสู่โหมดสลีปหรือกิจกรรมยังคงมองเห็นได้ แต่ซ่อนบางส่วนโดยกิจกรรมใหม่ที่ไม่เต็มขนาดหรือโปร่งใสกิจกรรมจะถูกหยุดชั่วคราว กิจกรรมที่หยุดชั่วคราวยังคงมีอยู่นั่นคือจะรักษาข้อมูลสถานะและสมาชิกทั้งหมดและยังคงติดอยู่กับตัวจัดการหน้าต่าง กิจกรรมนี้ถือว่าเป็นกิจกรรมที่มีลำดับความสำคัญสูงสุดลำดับที่สองในกิจกรรม Android และจะถูกฆ่าโดยระบบปฏิบัติการเท่านั้นหากการฆ่ากิจกรรมนี้จะตอบสนองความต้องการทรัพยากรที่จำเป็นเพื่อให้กิจกรรมใช้งาน / กำลังทำงานเสถียรและตอบสนอง

หยุด - กิจกรรมที่ถูกบดบังอย่างสมบูรณ์โดยกิจกรรมอื่นจะถือว่าหยุดทำงานหรืออยู่ในพื้นหลัง กิจกรรมที่หยุดยังคงพยายามรักษาสถานะและข้อมูลสมาชิกให้นานที่สุดเท่าที่จะเป็นไปได้ แต่กิจกรรมที่หยุดจะถือเป็นลำดับความสำคัญต่ำสุดในสามรัฐและเช่นนี้ระบบปฏิบัติการจะฆ่ากิจกรรมในสถานะนี้ก่อนเพื่อตอบสนองความต้องการทรัพยากร ของกิจกรรมที่มีลำดับความสำคัญสูงกว่า

* กิจกรรมตัวอย่างเพื่อทำความเข้าใจวงจรชีวิต **

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
    String tag = "LifeCycleEvents";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       Log.d(tag, "In the onCreate() event");
    }
    public void onStart()
    {
       super.onStart();
       Log.d(tag, "In the onStart() event");
    }
    public void onRestart()
    {
       super.onRestart();
       Log.d(tag, "In the onRestart() event");
    }
    public void onResume()
    {
       super.onResume();
       Log.d(tag, "In the onResume() event");
    }
    public void onPause()
    {
       super.onPause();
       Log.d(tag, "In the onPause() event");
    }
    public void onStop()
    {
       super.onStop();
       Log.d(tag, "In the onStop() event");
    }
    public void onDestroy()
    {
       super.onDestroy();
       Log.d(tag, "In the onDestroy() event");
    }
}

1
ดังนั้นถ้าฉันเข้าใจถูกต้อง onStop () จะถูกเรียกหลังจาก onPause () เสมอ?
Titouan de Bailleul

4
ไม่เสมอ "onStop (): เรียกเมื่อคุณไม่ปรากฏให้ผู้ใช้เห็นอีกต่อไป"
Yaqub Ahmad

2
มีโอกาสใดบ้างที่ถูกเรียกมาก่อนสร้างหรือไม่?
NodeDad

6
ใช่มี - คอนสตรัคเตอร์เริ่มต้น (นั่นคืออันที่ไม่มีพารามิเตอร์) แต่มีการใช้งานที่ จำกัด อย่างมากสำหรับวัตถุประสงค์ในการเริ่มต้นพื้นฐานเท่านั้น โดยปกติแล้วคุณไม่ควรใช้มันนอกจากว่าคุณรู้ว่ากำลังทำอะไรอยู่ และถึงอย่างนั้นคุณควรคิดสองครั้งหากมีวิธีที่ดีกว่าในการทำสิ่งต่าง ๆ
Mjoellnir

1
ฉันคิดว่าลิงก์นี้อาจช่วยให้คุณเข้าใจวงจรชีวิตของกิจกรรมด้วยวิธีที่ดีกว่า iphtechnologies.com/understanding-lifecycle-in-android-activity
Ashish Kumar Mishra

162

กิจกรรมมีหกสถานะ

  • ที่สร้างไว้
  • เริ่มต้น
  • กลับมาทำงานต่อ
  • หยุดชั่วคราว
  • หยุด
  • ทำลาย

วงจรชีวิตของกิจกรรมมีเจ็ดวิธี

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onStop()
  • onRestart()
  • onDestroy()

วงจรชีวิตของกิจกรรม

สถานการณ์

  • เมื่อเปิดแอพ

    onCreate() --> onStart() -->  onResume()
  • เมื่อกดปุ่มย้อนกลับและออกจากแอป

    onPaused() -- > onStop() --> onDestory()
  • เมื่อกดปุ่มโฮม

    onPaused() --> onStop()
  • หลังจากกดปุ่มโฮมเมื่อเปิดแอปอีกครั้งจากรายการงานล่าสุดหรือคลิกที่ไอคอน

    onRestart() --> onStart() --> onResume()
  • เมื่อเปิดแอพอีกแอพหนึ่งจากแถบการแจ้งเตือนหรือการตั้งค่าที่เปิดอยู่

    onPaused() --> onStop()
  • ปุ่มย้อนกลับที่กดจากแอพหรือการตั้งค่าอื่นที่ใช้ไปจะเห็นแอพของเรา

    onRestart() --> onStart() --> onResume()
  • เมื่อกล่องโต้ตอบใด ๆ เปิดขึ้นบนหน้าจอ

    onPause()
  • หลังจากยกเลิกไดอะล็อกหรือปุ่มย้อนกลับจากไดอะล็อก

    onResume()
  • โทรศัพท์ใด ๆ ที่ส่งเสียงเรียกเข้าและผู้ใช้ในแอป

    onPause() --> onResume() 
  • เมื่อผู้ใช้กดปุ่มรับสายของโทรศัพท์

    onPause()
  • หลังจากวางสาย

    onResume()
  • เมื่อปิดหน้าจอโทรศัพท์

    onPaused() --> onStop()
  • เมื่อหน้าจอเปิดขึ้นมาใหม่

    onRestart() --> onStart() --> onResume()

6
'เมื่อกล่องโต้ตอบใด ๆ ที่เปิดบนหน้าจอเรียกว่า onPause ()' ไม่ถือเป็นจริงสำหรับการแจ้งเตือนไดอะลอก มันจะถูกเรียกก็ต่อเมื่อไดอะล็อกนั้นเป็นกิจกรรมโต้ตอบ (มีชุดรูปแบบเป็น @android: style / Theme.Dialog)
gaurav jain

2
คำตอบที่มีค่า ส่งสิ่งนี้ไปที่ google เพื่อเพิ่มไปยังเอกสารของพวกเขา ฉันกำลังบันทึกคำตอบของคุณไปยังเอกสาร Word เพื่อให้!
likejudo

ฉันไม่เข้าใจ "โทรศัพท์ใด ๆ กำลังดังและผู้ใช้ในแอพ" สถานการณ์เป็นอะไรกันแน่? สิ่งแรกที่ฉันทำคือหากผู้ใช้อยู่ในแอพและโทรศัพท์เริ่มส่งเสียงเรียกเข้าก็จะเป็น onPause () -> onStop () ในกรณีที่การโทรแบบเต็มหน้าจอ สำหรับข้อความการโทรเข้าหัวขึ้นอาจเป็นเพียง OnResume -> onPause () แต่ฉันไม่แน่ใจ สถานการณ์ในการเรียกใช้ onPause -> onResume คืออะไร อยู่ที่ท้ายสายหรือไม่
Sotti

นี่คือสิ่งที่ฉันกำลังมองหา แค่อยากรู้ว่าฉันควรจะโทรไปที่ไหน
ไฮเซนเบิร์ก

ฉันชอบคำตอบตามสถานการณ์ของคุณ
kokabi

155

ความสับสนทั้งหมดเกิดขึ้นเนื่องจาก Google เลือกชื่อที่ไม่ใช้ชื่อแทนที่จะเป็นชื่ออะไรดังต่อไปนี้:

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

แผนภาพกิจกรรมสามารถตีความได้ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่


1
ขึ้นอยู่กับ ชื่อที่ยาวจะไม่เจ็บเว้นแต่จะแก้ไขความสับสน ตัวอย่างเช่น: onRoutePresentationDisplayChanged () เป็นฟังก์ชั่นจากภายใน Android SDK เป็นอย่างมาก
Nilesh Pawar

12
โดยส่วนตัวแล้วฉันไม่พบชื่อของคุณที่ใช้งานง่ายกว่านี้มาก ๆ รวมทั้งแฟรกเมนต์มันไม่เกี่ยวข้องกันจริงๆ
Martin Marconcini

9
upvoted มีประโยชน์มากกว่าเอกสารทางการ
bad_keypoints

3
มันเป็นโพสต์ที่ยอดเยี่ยม ปัญหาหนึ่ง เมื่อคุณพิมพ์วิธี Andoid Lifecycle ลงใน google รูปภาพนี้จะปรากฏขึ้นเหนือตัวเลือกการค้นหา (ไม่ได้อยู่ในโหมดค้นหารูปภาพ) เป็นคำตอบสำหรับวิธีการของ Android Life cycle การไม่รู้จัก (หรือขี้เกียจขึ้นอยู่กับว่าคุณมองอย่างไร) อาจทำให้เข้าใจผิดได้ง่ายเว้นแต่พวกเขาจะติดตามลิงก์ StackOverflow แทนที่จะคลิกที่รูปภาพผังงาน (รูปภาพของคุณ)
Andrew S

1
ใช่. นี่คือสิ่งที่ฉันกำลังมองหา ใครบางคนควรเขียนหนังสือ (หรือเอกสาร) ด้วยสิ่งเช่นนี้ onResume ฯลฯ ไม่สมเหตุสมผล
Harsh Kanchina

22

ANDROID LIFE-CYCLE

มีเจ็ดวิธีที่จัดการวงจรชีวิตของแอปพลิเคชัน Android:


คำตอบสำหรับวิธีการเหล่านี้คือ:

ให้เราทำสถานการณ์ง่าย ๆ ที่รู้ว่าลำดับใดที่เรียกว่าวิธีการเหล่านี้จะช่วยให้เราเข้าใจได้อย่างชัดเจนว่าทำไมพวกเขาถึงถูกใช้

  • สมมติว่าคุณกำลังใช้แอพเครื่องคิดเลข มีการเรียกใช้วิธีการสามวิธีอย่างต่อเนื่องเพื่อเริ่มแอป

onCreate() - - - - - - ->onStart() onResume()

  • เมื่อฉันใช้แอพเครื่องคิดเลขทันใดนั้นก็มีสายเข้ามา กิจกรรมเครื่องคิดเลขไปที่พื้นหลังและกิจกรรมอื่นพูด การจัดการกับการโทรมาที่เบื้องหน้าและตอนนี้มีสองวิธีที่ถูกเรียกใช้อย่างต่อเนื่อง

onPause() - - -> onStop()

  • ตอนนี้บอกว่าฉันจบการสนทนาทางโทรศัพท์กิจกรรมเครื่องคิดเลขมาจากเบื้องหน้าเบื้องหลังดังนั้นจึงมีวิธีการสามวิธีที่ต่อเนื่องกัน

onRestart() - - - - - - ->onStart() onResume()

  • สุดท้ายบอกว่าฉันทำงานทั้งหมดเสร็จแล้วในแอพเครื่องคิดเลขและฉันต้องการออกจากแอพ อีกสองวิธีที่เรียกว่าอย่างต่อเนื่อง

onStop() - - -> onDestroy()


มีสี่สถานะที่กิจกรรมอาจมีอยู่:

  • รัฐเริ่มต้น
  • สถานะการทำงาน
  • รัฐหยุดชั่วคราว
  • หยุดสถานะ

สถานะเริ่มต้นเกี่ยวข้องกับ:

สร้างกระบวนการ Linux ใหม่จัดสรรหน่วยความจำใหม่สำหรับวัตถุ UI ใหม่และตั้งค่าทั้งหน้าจอ ดังนั้นงานส่วนใหญ่จึงเกี่ยวข้องที่นี่

สถานะการทำงานเกี่ยวข้องกับ:

เป็นกิจกรรม (สถานะ) ที่อยู่บนหน้าจอในปัจจุบัน สถานะนี้จัดการเพียงอย่างเดียวเช่นการพิมพ์บนหน้าจอและการแตะ & คลิกที่ปุ่ม

สถานะหยุดชั่วคราวเกี่ยวข้องกับ:

เมื่อกิจกรรมไม่ได้อยู่ในเบื้องหน้า แต่เป็นกิจกรรมที่อยู่ในพื้นหลังกิจกรรมจะถูกกล่าวว่าอยู่ในสถานะหยุดชั่วคราว

สถานะหยุดเกี่ยวข้องกับ:

กิจกรรมที่หยุดจะสามารถซื้อได้ในเบื้องหน้าเท่านั้นโดยการเริ่มต้นใหม่และกิจกรรมนั้นสามารถถูกทำลายได้ทุกเวลา

ตัวจัดการกิจกรรมจัดการสถานะทั้งหมดเหล่านี้ในลักษณะที่ประสบการณ์ผู้ใช้และประสิทธิภาพจะดีที่สุดเสมอแม้ในสถานการณ์ที่มีการเพิ่มกิจกรรมใหม่ในกิจกรรมที่มีอยู่


ตัวอย่างใด ๆ สำหรับonPause to onResume ?
zeeali

14

ฉันชอบคำถามนี้และคำตอบกับมัน แต่จนถึงขณะนี้มีไม่น้อยความคุ้มครองของการเรียกกลับที่ใช้บ่อยเช่นonPostCreate ()หรือonPostResume () สตีฟรอยได้พยายามแผนภาพรวมทั้งเหล่านี้และวิธีที่พวกเขาเกี่ยวข้องกับของ Android Fragmentวงจรชีวิตที่https://github.com/xxv/android-lifecycle ฉันแก้ไขแผนภาพขนาดใหญ่ของ Steve เพื่อรวมเฉพาะส่วนของกิจกรรมและจัดรูปแบบสำหรับขนาดตัวอักษรที่พิมพ์ออกมาหนึ่งหน้า ฉันโพสต์เป็นข้อความ PDF ที่https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdfและด้านล่างคือภาพ:

ระยะเวลากิจกรรม Android


8

จากหน้านักพัฒนา Android

onPause ():

เรียกว่าเมื่อระบบกำลังจะเริ่มดำเนินการกิจกรรมก่อนหน้านี้ต่อ โดยทั่วไปจะใช้เพื่อคอมมิตการเปลี่ยนแปลงที่ไม่ได้บันทึกกับข้อมูลถาวรหยุดการเคลื่อนไหวและสิ่งอื่น ๆ ที่อาจใช้งาน CPU ฯลฯ การใช้งานวิธีนี้จะต้องรวดเร็วมากเพราะกิจกรรมต่อไปจะไม่ถูกดำเนินการต่อจนกว่าจะส่งคืนเมธอดนี้ ตามด้วย onResume () หากกิจกรรมกลับสู่ด้านหน้าหรือ onStop () หากผู้ใช้นั้นมองไม่เห็น

onStop ():

เรียกว่าเมื่อผู้ใช้ไม่เห็นกิจกรรมอีกต่อไปเพราะกิจกรรมอื่นได้ดำเนินการต่อแล้วและครอบคลุมกิจกรรมนี้ สิ่งนี้อาจเกิดขึ้นได้เนื่องจากกิจกรรมใหม่กำลังเริ่มต้นกิจกรรมที่มีอยู่กำลังถูกนำหน้ากิจกรรมนี้หรือกิจกรรมนี้กำลังถูกทำลาย ตามด้วย onRestart () หากกิจกรรมนี้กลับมาโต้ตอบกับผู้ใช้หรือ onDestroy () หากกิจกรรมนี้กำลังจะหายไป

ทีนี้สมมติว่ามีสามกิจกรรมและคุณไปจาก A ถึง B จากนั้น OnPause of A จะถูกเรียกตอนนี้จาก B ถึง C จากนั้น onPause ของ B และบน AS ของ A จะถูกเรียก

กิจกรรมที่หยุดชั่วคราวได้รับการดำเนินการต่อและหยุดการทำงานได้รับการเริ่มต้นใหม่

เมื่อคุณโทรมา this.finish() onPause-onStop-onDestroy จะถูกเรียก สิ่งสำคัญที่ต้องจำคือกิจกรรมที่หยุดชั่วคราวรับหยุดและกิจกรรมหยุดรับทำลายเมื่อใดก็ตามที่ Android ต้องการหน่วยความจำสำหรับการดำเนินงานอื่น ๆ

ฉันหวังว่ามันชัดเจนพอ


เราสามารถใช้วิธีการ onPause เป็นระยะกลางระหว่างกิจกรรมที่เริ่มหลวมโฟกัสและในที่สุดมันก็กลายเป็น Invisble ให้กับผู้ใช้และวิธี Onstop ราวกับว่ากิจกรรมได้กลายเป็น Invisble ให้กับผู้ใช้อย่างสมบูรณ์
Nav

ฉันคิดว่ามันควรจะเป็นอย่างนั้น
Masiar

3
@Nav สมมติว่ามี 3 กิจกรรมและคุณไปจาก A ถึง B จากนั้น OnPause of A จะถูกเรียกตอนนี้จาก B ถึง C จากนั้น onPause of B และบน Atop ของ A จะถูกเรียก
MKJParekh

3

การเพิ่มข้อมูลเพิ่มเติมที่ด้านบนของคำตอบที่ได้รับคะแนนสูง (เพิ่มส่วนเพิ่มเติมของ KILLABLE และชุดวิธีถัดไปซึ่งจะถูกเรียกในวงจรชีวิต):

ที่มา: developer.android.com

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ " Killableคอลัมน์ " " ในตารางด้านบน - สำหรับวิธีการเหล่านั้นที่ถูกทำเครื่องหมายว่าสามารถฆ่าได้หลังจากวิธีการนั้นส่งกลับกระบวนการโฮสต์กิจกรรมอาจถูกฆ่าโดยระบบเมื่อใดก็ได้โดยไม่ต้องใช้รหัสบรรทัดอื่น

ด้วยเหตุนี้คุณควรใช้onPause()วิธีการเขียนข้อมูลถาวรใด ๆ (เช่นการแก้ไขผู้ใช้) เพื่อจัดเก็บ นอกจากนี้วิธีการonSaveInstanceState(Bundle)จะถูกเรียกก่อนที่จะวางกิจกรรมในสถานะพื้นหลังดังกล่าวช่วยให้คุณสามารถบันทึกสถานะอินสแตนซ์แบบไดนามิกใด ๆ ในกิจกรรมของคุณลงในที่กำหนดBundleเพื่อที่จะได้รับในภายหลังonCreate(Bundle)หากกิจกรรมจำเป็นต้องสร้างขึ้นใหม่

โปรดทราบว่ามันเป็นสิ่งสำคัญที่จะบันทึกข้อมูลถาวรonPause()แทนonSaveInstanceState(Bundle)เพราะหลังไม่ได้เป็นส่วนหนึ่งของวงจรการเรียกกลับดังนั้นจะไม่ถูกเรียกในทุกสถานการณ์ตามที่อธิบายไว้ในเอกสารประกอบ

ฉันต้องการเพิ่มวิธีการอีกไม่กี่ สิ่งเหล่านี้ไม่ได้ระบุว่าเป็นวิธีวงจรชีวิต แต่จะถูกเรียกในระหว่างวงจรชีวิตขึ้นอยู่กับเงื่อนไขบางประการ คุณอาจต้องใช้วิธีการเหล่านี้ในแอปพลิเคชันของคุณเพื่อการจัดการสถานะที่เหมาะสมทั้งนี้ขึ้นอยู่กับความต้องการของคุณ

onPostCreate(Bundle savedInstanceState)

เรียกว่าเมื่อการเริ่มต้นกิจกรรมเสร็จสมบูรณ์ (หลังจากonStart()และonRestoreInstanceState(Bundle)ถูกเรียก)

onPostResume()

เรียกว่าเมื่อดำเนินการต่อกิจกรรมเสร็จสมบูรณ์ (หลังจากที่onResume()ถูกเรียก)

onSaveInstanceState(Bundle outState)

เรียกให้ดึงสถานะต่ออินสแตนซ์จากกิจกรรมก่อนที่จะถูกฆ่าเพื่อให้สถานะสามารถกู้คืนในonCreate(Bundle)หรือonRestoreInstanceState(Bundle)(Bundle ที่บรรจุด้วยวิธีนี้จะถูกส่งผ่านไปยังทั้งสอง)

onRestoreInstanceState(Bundle savedInstanceState)

วิธีการนี้เรียกว่าหลังจากonStart()ที่กิจกรรมจะถูกเริ่มต้นอีกครั้งจากสถานะที่บันทึกไว้ก่อนหน้านี้ได้รับที่นี่มาsavedInstanceStateมา

รหัสแอปพลิเคชันของฉันใช้วิธีการเหล่านี้ทั้งหมด:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText txtUserName;
    private EditText txtPassword;
    Button  loginButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Ravi","Main OnCreate");
        txtUserName=(EditText) findViewById(R.id.username);
        txtPassword=(EditText) findViewById(R.id.password);
        loginButton =  (Button)  findViewById(R.id.login);
        loginButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        Log.d("Ravi", "Login processing initiated");
        Intent intent = new Intent(this,LoginActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("userName",txtUserName.getText().toString());
        bundle.putString("password",txtPassword.getText().toString());
        intent.putExtras(bundle);
        startActivityForResult(intent,1);
       // IntentFilter
    }
    public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
        Log.d("Ravi back result:", "start");
        String result = resIntent.getStringExtra("result");
        Log.d("Ravi back result:", result);
        TextView txtView = (TextView)findViewById(R.id.txtView);
        txtView.setText(result);

        Intent sendIntent = new Intent();
        //sendIntent.setPackage("com.whatsapp");
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("Ravi","Main Start");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("Ravi","Main ReStart");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d("Ravi","Main Pause");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("Ravi","Main Resume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("Ravi","Main Stop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Ravi","Main OnDestroy");
    }

    @Override
    public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onPostCreate(savedInstanceState, persistentState);
        Log.d("Ravi","Main onPostCreate");
    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.d("Ravi","Main PostResume");
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
}

กิจกรรมเข้าสู่ระบบ:

public class LoginActivity extends AppCompatActivity {

    private TextView txtView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        txtView = (TextView) findViewById(R.id.Result);
        Log.d("Ravi","Login OnCreate");
        Bundle bundle = getIntent().getExtras();
        txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
        //Intent  intent = new Intent(this,MainActivity.class);
        Intent  intent = new Intent();
        intent.putExtra("result","Success");
        setResult(1,intent);
       // finish();
    }
}

ผลลัพธ์: (ก่อนหยุดชั่วคราว)

D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume

เอาท์พุท: (หลังจากดำเนินการต่อจากหยุดชั่วคราว)

D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume

โปรดทราบว่าonPostResume()มีการเรียกใช้แม้ว่าจะไม่ได้ยกมาเป็นวิธีวงจรชีวิต


0

ฉันเรียกใช้บันทึกบางส่วนตามคำตอบข้างต้นและนี่คือผลลัพธ์:

เริ่มต้นกิจกรรม

On Activity Load (First Time)
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

Reload After BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

OnMaximize(Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

OnMaximize(Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart: 
D/IndividualChatActivity: onStart: 
D/IndividualChatActivity: onResume: 
D/IndividualChatActivity: onPostResume: 

หยุดกิจกรรม

On BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop: 
D/IndividualChatActivity: onDestroy: 

OnMinimize (Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause: 
D/IndividualChatActivity: onStop: 

OnMinimize (Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause: 
D/IndividualChatActivity: onStop: 

Going To Another Activity
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop: 

Close The App
————————————————————————————————————————————————
D/IndividualChatActivity: onDestroy: 

ในความเห็นส่วนตัวของฉันมีเพียงสองข้อเท่านั้นที่ต้องมี onStart และ onStop

ดูเหมือนว่า onResume จะอยู่ในทุกตัวอย่างของการกลับมาและ onPause ในทุก ๆ ครั้งของการออก (ยกเว้นการปิดแอป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.