PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

การหยุด activity และการเริ่มต้นทำงานใหม่ ใน activity lifecycle

20 April 2015 By


การหยุดและการเริ่มต้นทำงานใหม่ของ activity อย่างถูกวิธีเป็นสิ่งสำคัญของกระบวนการ
ทำงานในวัฏจักร activity ซึ่งจะทำให้เรามั่นใจได้ว่าผู้ใช้รับรู้ได้ว่า app ยังคงอยู่และกำลังทำงาน
มีหลักในการกำหนดว่าเมื่อใด activity จะหยุดและเริ่มต้นทำงานใหม่ ดังต่อไปนี้
 
        1. เมื่อผู้ใช้เปิดหน้าต่าง app ปัจจุบันอยู่แล้วสลับไปใช้งาน app อื่น    activity ที่ทำงานอยู่ด้านหน้าสุด
            ก็จะหยุด และถ้าผู้ใช้กลับมาใช้งานต่อ ทั้งจากการกดเปิด app จาก icon home screen หรือ กลับจาก
            หน้า app อื่นนั้น    activity ก็จะเริ่มทำงานใหม่
 
        2. เมื่อผู้ใช้ทำการเรียกใช้งาน activity อื่นภายใน app    activity ปัจจุบันที่เปิดอยู่ก็จะหยุดลง เมื่อ activity
            ที่สองถูกสร้างขึ้นมา และถ้าเมื่อใดก็ตามที่ผู้ใช้กดปุ่ม Back แล้ว activity แรกก็จะเริ่มต้นการทำงานใหม่อีกครั้ง
 
        3. เมื่อมีสายเรียกเข้าขณะใช้งาน app อยู่ activity ปัจจุบันที่กำลังทำงานก็จะหยุดลง
 
 
ในวัฏจักรของ activity จะมี method ที่ชื่อ onStop() และ onRestart() ที่ใช้สำหรับกำหนดการทำงานให้ activity 
ในขณะที่กำลังจะหยุดหรือเริ่มต้นทำงานใหม่ ซึ่งจะไม่เหมือนกรณีของ Paused state ที่ซึ่ง UI (ส่วนติดต่อกับผู้ใช้ หรือย่อ
มาจาก User Interface) จะถูกบดบังบางส่วน  แต่ใน Stopped state นั่น UI จะไม่แสดงให้เห็นเลย และผู้ใช้ก็กำลังใช้งาน
activity อื่นอยู่ (หรือใช้งาน app อื่น)
 
ข้อสังเกต:: เพราะระบบยังคง activity instance ไว้ในหน่วยความจำ โดยเมื่อ activity หยุดลง อาจจะเป็นไปได้ที่จะไม่มีการ
เรียกใช้งาน onStop() และ onRestart() (หรือแม้แต่ onStart()) เสมอไป     activity ส่วนใหญ่ซึ่งสัมพันธ์กันอย่างง่าย
activity จะไม่หยุดและเริ่มต้นใหม่ อาจจะมีบ้างที่ activity จะหยุดและเริ่มต้นใหม่ บางทีเราจะใช้เพียงแค่ onPause() เพื่อ
หยุดการทำงานที่กำลังต่อเนื่องและเลิกการเชื่อมต่อกับทรัพยากรของระบบแทน
 


 
จากรูป เมื่อผู้ใช้ออกจาก activity ระบบจะเรียกใช้งาน onStrop() เพื่อหยุด activity (หมายเลข 1)  และถ้าผู้ใช้
กลับมาใช้งานอีกในขณะที่ activity หยุดอยู่  ระบบจะเรียก onRestart() (หมายเลข 2) และตามด้วย onStart() 
(หมายเลข 3) , onResume() (หมายเลข 4) ตามลำดับในทันที  จะสังเกตว่า ไม่วาอะไรจะทำให้ activity หยุดลง
ก็ตาม ระบบก็จะมีการเรียกใช้งาน onPause() ก่อน onStop() เสมอ
 


 
การหยุดของ Activity
 
เมื่อมีสายเรียกเข้า activity จะเรียก onStop() method  และเมื่อ activity ไม่แสดงเป็นเวลานานแล้วและ
ก็ควรที่จะยกเลิกการใช้งานทรัพยากรระบบเกือบทั้งหมด ซึ่งไม่จำเป็นเมื่อไม่ได้ใช้งาน    ครั้งแรกที่ activity หยุดลง
ระบบอาจจะทำลาย instance ถ้าจำเป็นต้องเรียกคืนเพื่อใช้งานหน่วยความจำ   โดยที่สุดแล้วระบอาจจะปิดการทำงาน
app แบบไม่เรียกใช้งาน onDestroy() ซึ่งเป็น method สุดท้ายในวัฏจักรของ activity ก็เป็นได้  ดังนั้นสิ่งสำคัญที่เราใช้
onStop() ก็เพื่อยกเลิกการใช้งานทรัพยากรของระบบที่ไม่จำเป็นและอาจส่งผลต่อหน่ายความจำที่สูญเปล่า
 
ถึงแม้ว่า onPause() method จะถูกเรียกใช้งานก่อน onStop()  แต่เราก็ยังควรที่จะใช้ onStop() เพื่อจัดการกับการทำงาน
ที่ต้องใช้งาน CPU อย่างหนักในการะบวนการ อย่างเช่น การเขียนข้อมูลลงฐานข้อมูล
 
ยกตัวอย่าง นี่คือวิธีการใช้งาน onStop() method ทำการบันทึกเนื้อหาของแบบร่างข้อความลงในที่จัดเก็บข้อมูล
 
@Override
protected void onStop() {
    super.onStop();  // เรียกใช้งาน superclass ก่อนทุกครั้งเสมอ    

    // บันทึกแบบร่างข้อความ, เพราะ activity กำลังจะหยุดลง
    // และเพื่อที่เราจะมั่นใจได้ว่า ข้อความปัจจุบ้นจะไม่หายไปในกระบวนการ
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // url ของ note ที่ต้องการบันทึก.
            values,  // ค่าข้อข้อมูลแบบ key และ value ที่ต้องการเก็บ.
            null,    // ไม่มีการ SELECT ข้อมูล.
            null     // ไม่มีการกำหนดเงื่อนไข WHERE ที่ต้องใช้.
            );
}
 
เมื่อ activity หยุดลง     Activity object (หมายถึง instance) ก็จะยังคงอยู่ในหน่วยความจำ และจะถูกเรียกใช้งาน
เมื่อ activity กลับมาทำงานต่อ    เราไม่จำเป็นที่จะต้องกำหนดการตั้งค่าเริ่มต้นขององค์ประกอบต่างๆ ที่ถูกสร้าง
ในขั้นตอนที่มีการเรียกใช้งาน callback method อื่นๆ เพื่อกลับไปที่ Resumed state อีก  เพราะระบบจะทำการจดจำ 
ค่าของ state ปัจจุบันสำหรับทุก view ที่อยู่ใน layout ดังนั้นถ้าผู้ใช้กรอกข้อมูลใดๆ ลงไปในช่อง รับค่าข้อมูลอย่าง 
เช่น EditText ข้อมูลนั้นก็จะยังคงอยู่ เราไม่จำเป็นต้องบันทึกค่านั้นไว้
 
 
ข้อสังเกต:: ถึงแม้ถ้าระบบทำลาย activity ลง ขณะที่หยุด  แต่ state ของ View object (เช่น ข้อความใน EditText)
ก็จะยังคงอยู่ในลักษณะ Bundle (ชุดค่าข้อมูลที่มี key-value) และจะคืนค่าถ้าผู้ใช้กลับมาเรียกใช้งาน activity เดิมอีก
(ในตอนหน้าเราจะมีพูกถึงเกี่ยวกับการใช้งาน Bundle สำหรับบันทึกข้อมูของ state ในกรณี activity ถูกทำลายและสร้าง
ขึ้นมาใหม่)
 

 
 
การเริ่มทำงาน / การเริ่มทำงาานใหม่ของ activity
 
เมื่อ activity กลับมาทำงานอยู่ด้านหน้าสุด หลังจากกลับมาจาก Stopped state  แล้วมีการเรียกใช้งาน
onRestart() ระบบก็จะเรียก onStart() method ซึ่งเป็นเป็น method ที่เกิดขึ้นทุกๆครั้ง ก่อนที่จะแสดง activity เสมอ
(ไม่ว่าจะเริ่มต้นใหม่หรือถูกสร้างขึ้นมาครั้งแรกก็ตาม)  อย่างไรก็ตาม onRestart() method จะถูกเรียกก็ต่อเมื่อ activity
มาจาก Stopped state เท่านั้น ดังนั้นเราสามารถที่จะใช้ method นี้ในการที่จะทำการคืนค่าการทำงานที่อาจจะมีความ
จำเป็นในกรณี activity หยุดอยู่และยังไม่ถูกทำลาย
 
app ที่จำเป็นต้องใช้งาน onRestart() ในการคืนค่า activity state จะพบได้ไม่บ่อยนัก    ดังนั้นจึงไม่ค่อยมีแนวทางใดๆ
สำหรับ method นี้ที่จะสามารถนำไปประยุกต์ใช้งานกับ app ที่วไป  อย่างไรก็ตาม ด้วยเพราะว่า onStop() method
โดยพื้นฐานแล้วจะทำการล้างค่าการใช้งานทรัพยากรระบบของ activity  เราจึงควรที่จะสร้างค่าเริ่มต้นขึ้นมาใหม่ในกรณี
activity เริ่มทำงานใหม่ และเราก็จำเป็นจะต้องสร้างหรือกำหนดค่าเริ่มต้นเมื่อ activity ถูกเสร้างขึ้นมาครั้งแรกด้วย (กรณี
ที่ไม่มีค่า instance ของ activity อยู่ก่อน)  ด้วยเหตุผลนี้ เราจึงควรที่จะใช้ onStart() method คล้ายกับการใช้งานใน 
onStop() method ทั้งนี้ก็เพราะทั้งสองกรณีไม่ว่ากรณีสร้าง activity ขึ้นมาใหม่หรือกรณีกลับมาจาก Stopped state
ระบบก็จะเรียกใช้งาน onStart() method เสมอ
 
ยกตัวอย่าง เป็นไปได้ที่ผู้ใช้ได้ออกจาก app เป็นเวลานานแล้ว กลับเข้ามาใช้งานใหม่
onStart() method เป็นส่วนที่จะใช้สำหรับยืนยันได้ว่าระบบได้เปิดคุณสมบัติที่ต้องการใช้ ให้ทำงานแล้วหรือไม่
 
@Override
protected void onStart() {
    super.onStart();  // เรียกใช้งาน superclass ก่อนทุกครั้งเสมอ    
    
    // activity เริ่มทำงานครั้งแรก หรือกลับมาเริ่มทำงานใหม่อีกครั้ง
    // ดังนั้นเพื่อให้มั่นใจว่าระบบ GPS ได้ถูกเปิดใช้งานอยู่
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) { // ถ้าไม่ถูกเปิดใช้งาน
        // สร้าง dialog ร้องขอให้ผู้ใช้ เปิดใช้งาน GPS และเรียกใช้งาน intent
        // เรียกการทำงาน android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS 
        // ให้ผู้ใช้ทำการเปิดไปหน้าตั้งค่าใช้งาน GPS เมื่อคลิก "OK"
    }
}

@Override
protected void onRestart() {
    super.onRestart();  // เรียกใช้งาน superclass ก่อนทุกครั้งเสมอ    
    
    // Activity เริ่มทำงานใหม่เมื่อกลับมาจาก Stopped state 
}
 
 
เมื่อระบบทำลาย activity แล้วก็จะเรียกใช้งาน onDestroy() method ใน activity
ที่จริงแล้วเราควรต้องยกเลิกการใช้งานทรัพยากรของระบบทั้งหมดใน onStop() method
โดยที่ในขณะที่ onDestroy() ถูกเรียกใช้งาน app ส่วนใหญ่แล้วจะไม่มีอะไรให้จัดการแล้วในการเรียกใช้งาน method นี้
(หมายถึงส่วนใหญ่จะไม่ค่อยกำหนดการทำงานใดๆ ใน onDestroy())
เป้น method สุดท้ายสำหรับการยกเลิกการใช้งานทรัพยากรระบบทั้งหมดและคืนค่าหน่ายความจำ ดังนั้นเราต้อง
ตรวจสอบให้มั่นใจว่ามีการทำงานเพิ่มเติมอื่นๆ เช่นการทำงานใน background ได้ถูกทำลายไปหมดแล้วหรือเปล่าด้วย



เนื้อหาที่เกี่ยวข้อง



Tags:: activity lifecycle android android studio

เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





URL สำหรับอ้างอิง