การออกจากแอปพลิเคชันขมวดคิ้วอยู่หรือไม่?


1151

ย้ายที่ในความพยายามของฉันที่จะเรียนรู้ Android ผมก็อ่านต่อไปนี้ :

คำถาม: ผู้ใช้มีตัวเลือกในการฆ่าแอปพลิเคชันหรือไม่ถ้าเราไม่ใส่ตัวเลือกเมนูเพื่อฆ่ามัน? หากไม่มีตัวเลือกดังกล่าวผู้ใช้จะยกเลิกแอปพลิเคชันอย่างไร

คำตอบ: (Romain Guy): ผู้ใช้ไม่ได้ระบบจะจัดการสิ่งนี้โดยอัตโนมัติ นั่นคือสิ่งที่วงจรชีวิตของกิจกรรม (โดยเฉพาะ onPause / onStop / onDestroy) มีไว้สำหรับ ไม่ว่าคุณจะทำอะไรอย่าใส่ปุ่มแอปพลิเคชัน "ออกจาก" หรือ "ออก" มันไม่มีประโยชน์กับแอปพลิเคชันของ Android นี่เป็นสิ่งที่ตรงกันข้ามกับวิธีการทำงานของแอปพลิเคชันหลัก

Hehe สำหรับทุกขั้นตอนที่ฉันทำในโลก Android ฉันพบปัญหาบางอย่าง = (

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

แอปพลิเคชันที่ฉันพยายามสร้างไม่ใช่แอปพลิเคชันสำหรับ Android Market มันไม่ใช่แอปพลิเคชันสำหรับ "การใช้งานทั่วไป" โดยบุคคลทั่วไปมันเป็นแอพทางธุรกิจที่จะใช้ในธุรกิจที่แคบมาก

จริง ๆ แล้วฉันตั้งตาคอยที่จะพัฒนาแพลตฟอร์ม Android เพราะมันจัดการปัญหามากมายที่มีอยู่ใน Windows Mobile และ. NET อย่างไรก็ตามสัปดาห์ที่ผ่านมาเป็นการเปิดตัวสำหรับฉัน ... ฉันหวังว่าฉันจะไม่ต้องละทิ้ง Android แต่ตอนนี้มันดูไม่ดีเลยตอนนี้ = (

มีวิธีที่ฉันจะออกจากแอปพลิเคชันจริง ๆหรือไม่?

คำตอบ:


1285

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

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

ผู้คนนับล้านมีความสุขอย่างสมบูรณ์แบบกับโมเดลที่สภาพแวดล้อมปิดแอปพลิเคชันตามต้องการ ผู้ใช้เหล่านั้นไม่ได้คิดเกี่ยวกับ "ยุติ" แอพ Android มากกว่าที่พวกเขาคิดเกี่ยวกับ "ยกเลิก" หน้าเว็บหรือ "ยุติ" เทอร์โม

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

ดังที่ฉันได้กล่าวไว้ข้างต้นมีหลายสิ่งที่เกิดขึ้นในแอปของฉัน (ข้อมูลถูกผลักดันไปยังอุปกรณ์

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

ผู้ใช้ของเราเข้าสู่ระบบและไม่สามารถทำเช่นนั้นได้ทุกครั้งที่พวกเขาได้รับโทรศัพท์และ Android ตัดสินใจที่จะฆ่าแอพ

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

ตัวอย่างเช่นเราต้องการตรวจสอบการอัปเดตเมื่อออกจากแอปพลิเคชัน

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

ความคิดเห็นบางข้อแนะนำว่าการกดปุ่มย้อนกลับไม่ได้ฆ่าแอพเลย (ดูลิงก์ในคำถามของฉันด้านบน)

การกดปุ่มย้อนกลับไม่ได้ "ฆ่าแอพ" กิจกรรมจะเสร็จสิ้นบนหน้าจอเมื่อผู้ใช้กดปุ่ม BACK

ควรสิ้นสุดเมื่อผู้ใช้ต้องการยกเลิกเท่านั้น - ไม่เคยมีวิธีอื่นใด หากคุณไม่สามารถเขียนแอพที่มีพฤติกรรมเช่นนั้นใน Android ได้ฉันคิดว่า Android ไม่สามารถใช้สำหรับการเขียนแอพจริง = (

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

มีวิธีที่ฉันจะออกจากแอปพลิเคชันจริง ๆ หรือไม่?

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


ไม่มีสองสภาพแวดล้อมของแอปพลิเคชันเหมือนกันตามคำจำกัดความ ซึ่งหมายความว่าคุณสามารถเห็นแนวโน้มในสภาพแวดล้อมเมื่อมีสิ่งใหม่เกิดขึ้นและอื่น ๆ ถูกฝังอยู่

ตัวอย่างเช่นมีการเคลื่อนไหวเพิ่มขึ้นเพื่อพยายามกำจัดความคิดของ "ไฟล์" เว็บแอพพลิเคชั่นส่วนใหญ่ไม่บังคับให้ผู้ใช้นึกถึงไฟล์ต่างๆ โดยทั่วไปแล้วแอพของ iPhone จะไม่บังคับให้ผู้ใช้นึกถึงไฟล์ต่างๆ แอพ Android มักจะไม่บังคับให้ผู้ใช้นึกถึงไฟล์ต่างๆ และอื่น ๆ

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

สิ่งนี้ต้องการความสำคัญในการออกแบบแอปพลิเคชันมากขึ้นโดยมุ่งเน้นไปที่เป้าหมายทางธุรกิจและไม่ยึดติดกับรูปแบบการใช้งานที่เชื่อมโยงกับสภาพแวดล้อมของแอปพลิเคชันก่อนหน้า นักพัฒนาที่ขาดเวลาหรือความชอบในการทำเช่นนี้จะหงุดหงิดกับสภาพแวดล้อมที่ใหม่กว่าซึ่งทำลายโมเดลจิตที่มีอยู่ นี่ไม่ใช่ความผิดของสภาพแวดล้อมใด ๆ เลยยิ่งไปกว่านั้นมันเป็นความผิดของภูเขาสำหรับพายุที่ไหลรอบมันมากกว่าผ่านมัน

ตัวอย่างเช่นสภาพแวดล้อมการพัฒนาบางอย่างเช่นHypercardและ Smalltalk มีแอปพลิเคชันและเครื่องมือในการพัฒนาร่วมกันในการตั้งค่าเดียว แนวคิดนี้ไม่ได้จับอะไรมากนอกส่วนขยายภาษาไปยังแอป (เช่นVBAในExcel , Lisp ใน AutoCAD ) นักพัฒนาซอฟต์แวร์ที่มาพร้อมกับโมเดลจิตที่สันนิษฐานว่ามีเครื่องมือการพัฒนาอยู่ในแอพดังนั้นจึงต้องเปลี่ยนโมเดลหรือ จำกัด ตัวเองให้อยู่ในสภาพแวดล้อมที่โมเดลของพวกเขาจะเป็นจริง

ดังนั้นเมื่อคุณเขียน:

นอกเหนือจากสิ่งยุ่ง ๆ อื่น ๆ ที่ฉันค้นพบแล้วฉันคิดว่าการพัฒนาแอพของเราสำหรับ Android จะไม่เกิดขึ้น

นั่นจะเป็นสิ่งที่ดีที่สุดสำหรับคุณในตอนนี้ ในทำนองเดียวกันฉันจะแนะนำให้คุณพยายามพอร์ตแอปพลิเคชันของคุณไปยังเว็บเนื่องจากปัญหาเดียวกันกับที่คุณรายงานกับ Android คุณจะพบในแอปพลิเคชันบนเว็บเช่นกัน (เช่นไม่มีการ "ยุติ") หรือตรงกันข้ามสักวันหนึ่งถ้าคุณทำพอร์ตแอปของคุณไปยังเว็บที่คุณอาจพบว่าการไหลของแอพลิเคชันเว็บอาจจะเป็นที่การแข่งขันที่ดีกว่าสำหรับ Android, และคุณสามารถทบทวนพอร์ต Android ในช่วงเวลานั้น


21
มีความคิดหนึ่งที่ลอยอยู่ในหัวของฉัน: ถ้าฉันเพิ่งเขียนแอปทั้งหมดเป็นบริการและถือว่าบริการนั้นเป็นแอปพลิเคชันจริง - บางทีมันอาจจะทำงานได้ดีขึ้น? จากนั้นฉันสามารถ "ทำให้เป็น" กิจกรรม (เช่นเดียวกับ Android ที่ต้องการ) เพื่อนำเสนอข้อมูลที่มีอยู่ในบริการ ในกรณีนั้นฉันอาจจะเก็บสถานะการล็อกอินและสิ่งอื่น ๆ การใช้startForeground (int, Notification)ฉันเกือบจะหยุด Android ไม่ให้ฆ่า Service ...
Ted

66
"โปรดทราบว่าผู้ใช้ของฉันเป็นมืออาชีพที่ใช้อุปกรณ์เพื่อจุดประสงค์เดียวในการใช้แอปพลิเคชันที่ฉันพยายามจะเชื่อมต่อกับ Android" ที่จริงแล้วคุณระบุไว้เป็นอย่างอื่น ("ไม่สามารถทำเช่นนั้นได้ทุกครั้งที่ได้รับโทรศัพท์" - "โทรศัพท์สาธารณะ" ไม่ใช่แอปของคุณ) นอกจากนี้หากคุณกำลังสร้างอุปกรณ์ของคุณเองคุณจะไม่สามารถป้องกันไม่ให้ผู้อื่นติดตั้งแอพอื่น ๆ ได้หากพวกเขาเลือก
CommonsWare

25
@SomeCallMeTim: killProcess()ไม่มีที่ไม่ได้เป็นเหตุผลที่ถูกต้องกับการใช้งาน มันเป็นเหตุผลที่ถูกต้องในการเขียนรหัส iOS ที่ดีขึ้น
CommonsWare

24
@CommonsWare: ขออภัย แต่นั่นเป็นคำตอบที่ซ้ำซากที่ไม่มีประโยชน์สำหรับฉัน ฉันกำลังย้ายรหัสที่จ่ายให้กับพอร์ต ฉันควรใช้เวลาสองครั้งในการทำพอร์ตเขียนรหัสใหม่หรือทำในลักษณะที่ช่วยลดค่าใช้จ่ายสำหรับนายจ้างของฉันทำให้พวกเขาสามารถวางเกมบน Android ได้เร็วขึ้น? มันเป็นคำถามเชิงวิชาการทั้งหมด: พวกเขาไม่ต้องการให้ฉันทำการเปลี่ยนแปลงครั้งใหญ่กับเครื่องยนต์ของพวกเขาเนื่องจากฉันไม่สามารถทดสอบการเปลี่ยนแปลงบน iOS ได้ และมันก็ผิดปกติ: ไม่มีอะไร "เลวร้าย" เกี่ยวกับการใช้รูปแบบซิงเกิลสำหรับวัตถุที่เหมาะสม Android เพิ่งเสียแอพ WRT NDK
SomeCallMeTim

10
@Ted สำหรับการเริ่มต้นใหม่ที่เชื่อถือได้มากขึ้นบางทีคุณอาจลดจำนวนสถานะที่เก็บไว้ที่กิจกรรมหรือบริการ ให้ใส่สถานะและรหัสส่วนใหญ่ในชั้นเรียนแยกต่างหากที่คุณสร้าง "ตั้งแต่เริ่มต้น" ทุกครั้งที่กิจกรรมหรือบริการเริ่มต้น
Qwertie

289

ฉันแค่ต้องการเพิ่มการแก้ไขที่นี่สำหรับผู้อ่านในอนาคตของหัวข้อนี้ ความแตกต่างกันนิดหน่อยนี้ทำให้ฉันเข้าใจไม่ได้นานดังนั้นฉันจึงต้องการให้แน่ใจว่าไม่มีใครทำผิดพลาดแบบเดียวกัน:

System.exit()ไม่ฆ่าแอปของคุณหากคุณมีมากกว่าหนึ่งกิจกรรมในกองซ้อน สิ่งที่เกิดขึ้นจริงก็คือกระบวนการถูกฆ่าและเริ่มต้นใหม่ทันทีด้วยกิจกรรมที่น้อยลงหนึ่งรายการบนสแต็ก นี่คือสิ่งที่เกิดขึ้นเมื่อแอปของคุณถูกฆ่าโดยกล่องโต้ตอบบังคับปิดหรือแม้กระทั่งเมื่อคุณพยายามที่จะฆ่ากระบวนการจาก DDMS นี่คือความจริงที่ไม่มีเอกสารทั้งหมดเพื่อความรู้ของฉัน

คำตอบสั้น ๆ คือถ้าคุณต้องการออกจากแอปพลิเคชันของคุณคุณต้องติดตามกิจกรรมทั้งหมดในสแต็กของคุณและfinish()ทั้งหมดของพวกเขาเมื่อผู้ใช้ต้องการออก (และไม่ไม่มีวิธีที่จะวนซ้ำผ่านสแต็กกิจกรรม ดังนั้นคุณต้องจัดการทั้งหมดด้วยตัวเอง) แม้สิ่งนี้จะไม่ได้ฆ่ากระบวนการหรือการอ้างอิงที่เป็นอันตรายใด ๆ ที่คุณอาจมี มันเสร็จสิ้นกิจกรรม นอกจากนี้ฉันไม่แน่ใจว่าProcess.killProcess(Process.myPid())ทำงานได้ดีขึ้นหรือไม่ ฉันยังไม่ได้ทดสอบ

หากในอีกทางหนึ่งมันก็โอเคสำหรับคุณที่จะมีกิจกรรมที่เหลืออยู่ในสแต็คของคุณมีวิธีอื่นที่ทำให้สิ่งที่ง่ายสุดสำหรับคุณ: Activity.moveTaskToBack(true)เพียงแค่พื้นหลังกระบวนการของคุณและแสดงหน้าจอที่บ้าน

คำตอบยาวเกี่ยวข้องกับคำอธิบายของปรัชญาที่อยู่เบื้องหลังพฤติกรรมนี้ ปรัชญาเกิดจากข้อสันนิษฐานหลายประการ:

  1. ก่อนอื่นสิ่งนี้จะเกิดขึ้นเมื่อแอปของคุณอยู่เบื้องหน้าเท่านั้น หากอยู่ในพื้นหลังกระบวนการจะยุติได้ดี อย่างไรก็ตามหากอยู่ในเบื้องหน้า OS จะถือว่าผู้ใช้ต้องการทำสิ่งที่ตนทำอยู่ต่อไป (หากคุณพยายามที่จะฆ่ากระบวนการจาก DDMS คุณควรกดปุ่มโฮมก่อนแล้วจึงฆ่ามัน)
  2. นอกจากนี้ยังอนุมานว่าแต่ละกิจกรรมนั้นเป็นอิสระจากกิจกรรมอื่น ๆ ทั้งหมด สิ่งนี้มักเป็นจริงเช่นในกรณีที่แอปของคุณเปิดใช้งานกิจกรรมเบราว์เซอร์ซึ่งแยกจากกันอย่างสิ้นเชิงและคุณไม่ได้เขียน กิจกรรมเบราว์เซอร์อาจสร้างหรือไม่สร้างขึ้นในงานเดียวกันทั้งนี้ขึ้นอยู่กับคุณสมบัติ
  3. สันนิษฐานว่ากิจกรรมแต่ละอย่างของคุณพึ่งพาตนเองได้อย่างสมบูรณ์และสามารถถูกฆ่า / ฟื้นฟูได้ในเวลาอันสั้น (ฉันค่อนข้างไม่ชอบสมมติฐานนี้เนื่องจากแอพของฉันมีกิจกรรมมากมายที่ต้องอาศัยข้อมูลแคชจำนวนมากใหญ่เกินกว่าที่จะจัดลำดับได้อย่างมีประสิทธิภาพในช่วงonSaveInstanceStateแต่ Whaddya จะต้องทำอย่างไร) สำหรับแอป Android ที่เขียนดีที่สุดนี้ควรเป็นจริง เนื่องจากคุณไม่มีทางรู้ได้เลยว่าแอพของคุณจะถูกฆ่าในพื้นหลังเมื่อใด
  4. ปัจจัยสุดท้ายไม่ได้เป็นข้อสันนิษฐานมากนัก แต่เป็นข้อ จำกัด ของระบบปฏิบัติการ: การ ฆ่าแอพอย่างชัดเจนเหมือนกับแอพที่หยุดทำงานและเช่นเดียวกับ Android ที่ฆ่าแอพเพื่อเรียกคืนหน่วยความจำ สิ่งนี้ถือเป็นจุดสูงสุดในการทำรัฐประหารของเรา: เนื่องจาก Android ไม่สามารถบอกได้ว่าแอพที่ออกมาหรือทำงานผิดพลาดหรือถูกฆ่าในพื้นหลังนั้นจะถือว่าผู้ใช้ต้องการส่งคืนที่ที่พวกเขาออกไปและ ActivityManager รีสตาร์ทกระบวนการ

เมื่อคุณคิดถึงมันสิ่งนี้เหมาะสำหรับแพลตฟอร์ม อย่างแรกนี่คือสิ่งที่เกิดขึ้นเมื่อกระบวนการถูกฆ่าในเบื้องหลังและผู้ใช้กลับมาสู่กระบวนการดังนั้นจึงต้องเริ่มต้นใหม่เมื่อปล่อยทิ้ง ประการที่สองนี่คือสิ่งที่จะเกิดขึ้นเมื่อแอปหยุดทำงานและแสดงกล่องโต้ตอบ Force Close ที่น่ากลัว

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

ดังนั้นคำแนะนำการปิดของฉัน:

  • อย่าพยายามฆ่ากระบวนการ ทั้งโทรในทุกกิจกรรมหรือโทรfinish()moveTaskToBack(true)
  • หากกระบวนการของคุณล้มเหลวหรือถูกฆ่าและเช่นเดียวกับฉันคุณต้องการข้อมูลที่อยู่ในหน่วยความจำซึ่งตอนนี้หายไปคุณจะต้องกลับไปที่กิจกรรมรูท ในการทำเช่นนี้คุณควรโทรหาstartActivity()ด้วยเจตนาที่มีการIntent.FLAG_ACTIVITY_CLEAR_TOPตั้งค่าสถานะ
  • หากคุณต้องการฆ่าแอปของคุณจากเปอร์สเปคทีฟ Eclipse DDMS มันจะดีกว่าถ้าไม่อยู่ในเบื้องหน้าไม่เช่นนั้นจะรีสตาร์ทตัวเอง คุณควรกดปุ่มโฮมก่อนแล้วจึงฆ่ากระบวนการ

8
ที่จริงแล้วตั้งแต่ฉันเริ่มต้นกับ Android อีกครั้งฉันกำลังทำกิจกรรมทั้งหมด (กิจกรรมเดียวเท่านั้นที่ใช้งานได้ตลอดเวลา) จากนั้นฉันเรียก System.exit (0); ในบริการของฉัน - และใช้งานได้ตามที่ฉันต้องการ ฉันรู้ว่าคนส่วนใหญ่พูดว่า "อย่าทำอย่างนั้น" แต่ฉันได้รับพฤติกรรมที่ฉันต้องการอย่างแน่นอนกับการเคลื่อนไหวนั้น ...
เทด

13
การฆ่ากระบวนการมีประโยชน์มากในบางครั้ง - ตัวอย่างเช่นเมื่อเขียนเกมที่ใช้รหัสเนทีฟ การฆ่ากระบวนการหมายถึงการปล่อยหน่วยความจำที่จัดสรรทั้งหมดกลับสู่ระบบทันที
Sulthan

10
สำหรับทุกคนที่ใส่ใจ Process.killProcess แสดงให้เห็นถึงพฤติกรรมเช่นเดียวกับ System.exit ()
PacificSky

6
สืบทอดกิจกรรมทั้งหมดจาก AtivityBase ทั่วไป จากนั้นกดค่าสถานะเพื่อบังคับปิดแอปในการตรวจสอบว่ามีการตั้งค่าสถานะการปิดการบังคับใช้หรือไม่ ถ้าเป็นเช่นนั้นเรียก System.exit (0); สิ่งนี้จะเรียงซ้อนผ่านสแต็กกิจกรรมทั้งหมดและในที่สุดก็ปิดแอปทั้งหมด
Nar Gar

12
ขอบคุณที่ให้คำตอบจริง ( moveTaskToBack()คือสิ่งที่ฉันกำลังมองหา) ผู้คนมากมายพูดว่า "ไม่ใช่คุณเป็นคนงี่เง่าที่ต้องการออกจากแอพ" โดยไม่พิจารณาว่าอาจมีบางกรณีที่คุณต้องการ (เช่นการล็อกอินที่ล้มเหลว)
Timmmm

179

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


15
+1 เนื่องจากโชคไม่ดีที่เวลานี้ (แต่ฉันยังต้องการลองทำสิ่งต่าง ๆ ตามที่ออกแบบมาทำให้ฉันตกตะลึง)
Richard Le Mesurier

25
คุณใช้กลไกอะไรในการออกจากระบบ?
Gary Rudolph

4
@Igor finish () - การทำกิจกรรมไม่ได้ฆ่าแอปพลิเคชัน (ขยายแอปพลิเคชัน) ดังนั้นแม้ว่าจะไม่มีกิจกรรมใดที่ใช้งานอยู่การตั้งค่ายังคงใช้งานได้และเป็นจริงเช่นเมื่อกิจกรรมพยายามเข้าถึงกิจกรรมเหล่านั้นพวกเขาจะเป็นกิจกรรมที่เคยใช้มาก่อน System.exit (0); ในอีกทางหนึ่งฆ่าแอปพลิเคชันเช่นนั้นเมื่อเริ่มต้นอีกครั้งแอปจะต้องเริ่มต้นการตั้งค่าจากใหม่ นั่นคือสิ่งที่ฉันต้องการเมื่ออัปเดตแอปพลิเคชันด้วยตนเองเพราะฉันเปลี่ยนรูปแบบของข้อมูลบ่อยครั้งและฉันต้องการให้พวกเขาเริ่มต้นใหม่ทันที
Nar Gar

1
นั่นเป็นวิธีเดียวที่จะบรรลุสิ่งที่ฉันต้องการในขณะนี้ ฉันใช้ system.exit เมื่อมีการอัปเดตแอป (มิฉะนั้นฉันจะได้รับการทำให้เป็นอนุกรมหรือการยกเว้นคลาสคาสต์ตามการเปลี่ยนแปลงรหัสของฉัน) ฉันควรพูดถึงว่าฉันไม่ได้ให้ UI แก่ผู้ใช้ในการฆ่าแอปผ่านระบบออกจากระบบ - สงวนไว้สำหรับฉันในฐานะวิศวกรของแอปที่จะใช้เฉพาะเมื่อแอปจำเป็นต้องยกเลิกการโหลดอย่างสมบูรณ์ เวลาที่เหลือจะใช้การเสร็จสิ้นอย่างง่าย () (หรือการใช้ปุ่มย้อนกลับเป็นค่าเริ่มต้น)
Nar Gar

13
ใช่ .. ตกนรกด้วย 'ไม่ได้มาตรฐาน Android' .. Android เป็น coz ที่ทรงพลังมันช่วยให้ผู้คนทดลองใช้ .. ถ้ามันมี API ที่จะทำอะไรบางอย่างเราจะพูดได้อย่างไรว่ามันไม่ใช่มาตรฐานของ Android? ฉันไม่สามารถแยกแยะคำตอบ 'ปรัชญา' เหล่านั้นทั้งหมดได้ คุณทำให้แอปคำนึงถึงผู้ใช้ของคุณ หากพวกเขามีความสุขหรือถ้าพวกเขาต้องการที่จะเห็นคุณลักษณะนี้แล้วมันเป็นอย่างดีในการดำเนินการว่าแม้ว่าผู้ที่เรียกว่านักปรัชญามีต่อมัน ..
ราหุล

144

หยุดคิดถึงแอปพลิเคชันของคุณเป็นแอปพลิเคชันแบบเสาหิน เป็นชุดของหน้าจอ UI ที่ผู้ใช้สามารถโต้ตอบกับ "แอปพลิเคชัน" ของคุณและ "ฟังก์ชั่น" ที่จัดให้ผ่านบริการ Android

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

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

นี่คือสำหรับทุกเจตนารมณ์และวัตถุประสงค์ตรงตามที่คุณพูดในสิ่งที่คุณต้องการ ทำตามวิธี Android ดูที่ Google Talk หรือ Google Maps การนำทางตัวอย่างของ "ทางออก" นี้อาจเป็นไปได้ ข้อแตกต่างเพียงอย่างเดียวคือการกดปุ่มย้อนกลับออกจากกิจกรรมของคุณอาจทำให้กระบวนการ UNIX ของคุณอยู่ในสถานะรอในกรณีที่ผู้ใช้ต้องการที่จะฟื้นฟูแอปพลิเคชันของคุณ นี่ไม่ต่างจากระบบปฏิบัติการที่ทันสมัยซึ่งแคชไฟล์ที่เพิ่งเข้าถึงในหน่วยความจำ หลังจากที่คุณออกจากโปรแกรม windows ทรัพยากรที่เป็นไปได้ส่วนใหญ่ที่ต้องการยังคงอยู่ในหน่วยความจำรอให้ถูกแทนที่ด้วยทรัพยากรอื่น ๆ เนื่องจากโหลดในตอนนี้ซึ่งไม่จำเป็นต้องใช้อีกต่อไป Android เป็นสิ่งเดียวกัน

ฉันไม่เห็นปัญหาของคุณจริงๆ


3
@Eric คุณไม่เห็นปัญหาเพราะคุณกำลังวิ่งหนี คุณเพียงแค่ใช้โปรแกรมอื่นที่ทำงานบน "โปรแกรมรุ่นเก่า" เพื่อทำสิ่งที่ไม่สามารถทำได้โดย "รุ่น Android" ในการดูปัญหาเกี่ยวกับ "รุ่น Android" คุณต้องจินตนาการว่าคุณไม่มีความหรูหราในการมอบหมายงานให้กับกล่อง Linux / Windows คุณต้องจินตนาการว่าคุณถูกบังคับให้ทำทุกอย่างตั้งแต่ส่วนหน้าไปจนถึงส่วนหลังโดยใช้เฉพาะกล่องที่เรียกใช้ "รุ่น Android" จากนั้นคุณจะเห็นว่าข้อ จำกัด ของ "รุ่น Android" นั้นใสเหมือนท้องฟ้า
Pacerier

คิดว่าแอปพลิเคชันของคุณเป็นแอปพลิเคชันแบบเสาหิน มันเขียนด้วยภาษาจาวาซึ่งกำลังดำเนินการโดยกระบวนการ JVM (Java Virtual Machine) เดียว System.exit () ออกจาก JVM และยุติหน้าจอ UI ทั้งหมดและทุกอย่างอย่างสมบูรณ์ ข้อยกเว้นนี้คือถ้าโปรแกรมเมอร์ไปที่ปัญหาของการตั้งค่าหลายเธรดที่ทำงานในหลายกระบวนการ - แต่โดยค่าเริ่มต้นไม่ใช่กรณีและตาม Google ไม่ควรทำตามปกติ
Jesse Gordon

@JesseGordon นี่ไม่เป็นความจริงเลย System.exit()ลบกิจกรรมออกจากสแต็กเท่านั้น JVM จะเริ่มต้นใหม่ทันที ดูคำตอบนี้
forresthopkinsa

1
@forresthopkinsa ตกลงฉันได้ทดสอบกับ android 7.0 แล้ว แอพพลิเคชั่นแบบเธรดเดี่ยวที่เรียบง่ายยังคงทำงานในอินสแตนซ์ JVM เฉพาะของตัวเองโดยทำงานเป็น ID ผู้ใช้ที่ไม่ซ้ำกับแอปนั้น ฉันยังไม่ได้ลองแอพแบบมัลติเธรดสำหรับการทดสอบนี้ และ System.exit () STILL จะฆ่า JVM ทั้งหมดสำหรับแอปนั้น หาก System.exit () ถูกเรียกจากกิจกรรมหลักมันจะออกจากการทำงาน หาก System.exit () ถูกเรียกจาก subactivity JVM ยังคงถูกฆ่า แต่ android จะทำการรีสตาร์ทภายใต้ ID กระบวนการใหม่กลับมาที่กิจกรรมหลัก / กิจกรรมแรก android.os.Process.killProcess (android.os.Process.myPid ()); และ kill <pid> ทำงานในลักษณะเดียวกัน
Jesse Gordon

1
ที่น่าสนใจ .. มองหาคำตอบที่คุณเชื่อมโยง @forresthopkinsa ดูเหมือนว่า Android กำลังทำตัวเหมือนเว็บเบราว์เซอร์คืนค่ากิจกรรมหลังจากระบบออกจากระบบดังนั้นผู้ใช้จึงไม่สังเกตเห็นว่ามันออกแล้ว แต่ไม่รวมกิจกรรมที่ทำให้เกิดทางออก .? แปลก. แต่อย่างไรก็ตาม System.exit () จะ ปิดกิจกรรมทั้งหมดและฟรี () ของหน่วยความจำและยุติ JVM สำหรับแอปนั้น แต่ฉันไม่รู้ว่าแอนดรอยด์ประเภทไหนที่ใช้ในการรีสตาร์ท / กู้คืน มันจะขัดขวางแอพนักฆ่าของแอพไหม? ดังนั้นฉันเดาว่าถ้ามีคนต้องการปุ่มออกพวกเขาควรวางไว้ในกิจกรรมหลัก
Jesse Gordon

71

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

ฉันต้องการเพิ่มสองเซ็นต์ของฉันที่นี่

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

ต้องบอกว่าฉันยังเชื่อว่าควรมีQuitปุ่ม ทำไม? ... ไม่ใช่สำหรับฉันหรือ Ted หรือผู้เชี่ยวชาญด้านเทคโนโลยีใด ๆ ที่นี่ แต่เพื่อจุดประสงค์เดียวในการตอบสนองความต้องการของผู้ใช้

แม้ว่าฉันจะไม่ใช่แฟนตัวยงของ Windows แต่พวกเขากลับใช้แนวคิดที่ผู้ใช้ส่วนใหญ่คุ้นเคย (ปุ่ม X) ... "ฉันต้องการเลิกใช้วิดเจ็ตเมื่อ 'ฉัน' ต้องการ

นั่นไม่ได้หมายความว่าใครบางคน (OS, นักพัฒนา?) จะดูแลมันตามดุลยพินิจของเขา / เธอ ... มันหมายถึง "ปุ่ม Red X ของฉันที่ฉันคุ้นเคย" อยู่ที่ไหน การกระทำของฉันควรคล้ายคลึงกับ 'วางสายเมื่อกดปุ่ม', 'ปิดอุปกรณ์โดยการกดปุ่ม' และต่อ ๆ ไปเรื่อย ๆ ... มันเป็นการรับรู้ มันนำมาซึ่งความพึงพอใจต่อการกระทำของฉันที่บรรลุตามวัตถุประสงค์

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


2
ขวา. Good ol 'Windows Mobile เสนอปุ่ม X เดียวกับพีซี Windows ยกเว้นว่ามันไม่ได้ออกจากแอปจริง ๆ มันแค่ "ลดขนาดสมาร์ท" ผู้ใช้หลายคนอาจไม่เคยพบว่าแอพไม่ได้ออกจากระบบจริงๆ (วิธีนี้ใช้งานได้ดีแม้ว่าคุณจะใช้. NET Compact Framework แอปพลิเคชันจะไม่ได้รับแจ้งว่าเกิดเหตุการณ์นี้ขึ้นดังนั้นจึงไม่มีตัวเลือกในการเพิ่มทรัพยากรหรือเลิกใช้จริง ๆ )
Qwertie

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

2
@ จอนอะไรที่คุณแนะนำ? ไม่เสนอตัวเลือก 'ออก' ที่ใดก็ได้ในแอปใช่ไหม
IgorGanapolsky

ดีเมื่อผู้ใช้ร้องขอปุ่มออกฉันจะอธิบายให้พวกเขาทราบว่าสิ่งต่าง ๆ ทำงานอย่างไรบนเดสก์ท็อป (ซึ่งเป็นคำอธิบายเดียวกับที่ฉันให้พวกเขาเมื่อพวกเขาพูดถึงนักฆ่าภารกิจ) ตอนนี้ข้อมูลดูเหมือนจะติดและฉันไม่ได้รับการร้องขอเหล่านั้นอีกต่อไป ดังนั้นฉันขอแนะนำให้คุณอธิบายสองสามครั้ง (อาจเกิดขึ้นกับการตอบกลับสำเร็จรูป) และปล่อยปุ่มทิ้งไว้ หรือวางในปุ่มออกปลอมที่เปิดไดอะล็อกอธิบายว่าทำไมไม่มีปุ่มออกอีก : D (ใน Android 4+ ผู้ใช้สามารถปัดแอป "ปิด" ของหน้าจอมัลติทาสก์เพื่อ "ฆ่า" ได้)
Jon O

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

37

คุณสามารถออกจากการอย่างใดอย่างหนึ่งโดยการกดBackปุ่มหรือโทรในของคุณfinish() Activityเพียงโทรfinish()จาก a MenuItemหากคุณต้องการฆ่ามันอย่างชัดเจน

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


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

2
ดังที่ Romain บอกว่าไม่ใช่แอปพลิเคชันหลักที่ใช้งานได้ ดังนั้นหากผู้ใช้คุ้นเคยกับการกด "ย้อนกลับ" เพื่อออกจากแอปดูเหมือนว่าพวกเขาจะยังคงทำเช่นนั้นกับแอปของคุณแทนที่จะเลือกออกอย่างชัดเจน? คุณสามารถทำการตรวจสอบการอัปเดตเมื่อเริ่มต้นหรือ onDestroy () หรือใช้สัญญาณเตือนซ้ำ .. ดูเหมือนจะไม่เป็นสิ่งที่ผู้ใช้ต้องการ
Christopher Orr

1
Tom: ฉันได้รับการเข้ารหัสสำหรับ Windows Mobile มาเกือบ 5 ปีแล้ว ขอบคุณโทรศัพท์ที่มี "ทรัพยากร จำกัด " ไม่มีพฤติกรรมดังกล่าวที่นั่นและไม่มีปัญหาที่มันไม่ได้ทำใน "พี่ใหญ่" - ทั้งสองอย่าง "แอปจริง" = ที่โปรแกรมเมอร์สามารถควบคุมมันได้มากขึ้นนั่นคือการเลิกใช้เมื่อสิ่งที่ GUI ถูกลบออก ฯลฯ ...
4993 Ted

1
Jay: เพราะถ้ามันยังอยู่ในหน่วยความจำฉันไม่สามารถอัพเดทแอพที่กำลังคิดได้ ไม่สามารถลบไฟล์ที่ใช้งานได้ใช่ไหม ฉันต้องการอัปเดตเมื่อออกเนื่องจากเราไม่สามารถบังคับให้ผู้ใช้อัปเดตเมื่อเริ่มต้น ที่เกี่ยวข้องกับวิธีการทำงานและสิ่งที่ต้องการ ไม่เป็นไรสำหรับพวกเขาที่จะถูกบังคับให้อัปเดตเมื่อเริ่มต้นการเปลี่ยนแปลงด้วยเหตุผลที่แตกต่างกัน มันค่อนข้างซับซ้อน
Ted

1
Jay: ไม่อย่างที่ฉันบอกไปแล้วว่ามันไม่ใช่แอพ Market และมันก็ไม่ได้เป็นเช่นนั้น มันเป็นแอพที่พิเศษมากไม่ใช่เพื่อการใช้งานทั่วไป
Ted

31

การถกเถียงครั้งนี้ทำให้เกิดคำถามที่ว่าผู้พัฒนารู้จักดีที่สุดหรือผู้ใช้รู้ดีที่สุดหรือไม่ นักออกแบบมืออาชีพในทุกด้านของปัจจัยมนุษย์ต่อสู้กับสิ่งนี้ทุกวัน

Ted ได้ชี้ให้เห็นว่าหนึ่งในแอพที่ดาวน์โหลดมากที่สุดใน Market คือ 'App Killer' ผู้คนจะได้รับเซโรโทนินเพิ่มขึ้นเล็กน้อยเมื่อพวกเขาออกจากแอปพลิเคชัน พวกมันคุ้นเคยกับเดสก์ท็อป / แล็ปท็อป มันทำให้สิ่งต่าง ๆ เคลื่อนไหวเร็ว มันทำให้โปรเซสเซอร์เย็นและเปิดพัดลม มันใช้พลังงานน้อยลง

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

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


8
ใช่การมีปุ่ม 'Quit' นั้นใช้ง่ายมาก ผู้ใช้จะออกจากแอปได้อย่างไรถ้าเขามีกิจกรรม 5 อย่างในนั้น แน่ใจว่าพวกเขาสามารถกดกลับได้หลายครั้ง แต่ฉันไม่คิดว่าพวกเขาจะชอบมัน
IgorGanapolsky

4
เพียง 5 เว็บเบราว์เซอร์ Android 2.2 ทำให้ฉันใช้เวลาไม่กี่นาทีในการแตะปุ่มย้อนกลับจนกว่าฉันจะออกในที่สุด
Joe Plante

3
ฉันจะเริ่มฟังนักพัฒนาของ android เมื่อพวกเขาพัฒนาตัวจัดการหน่วยความจำที่ทำงานได้ ในฐานะของ Froyo มันทำงานได้แย่มากฆ่าแอพแบบสุ่มเริ่มต้นแอพใหม่ที่ไม่จำเป็นต้อง (และไม่มีเจตนาที่จะเริ่มต้นอย่างถูกต้องตามกฎหมาย) และ OTOH ชะลอการรวบรวมข้อมูล COMPLETE เมื่อหน่วยความจำว่าง 50MB
DVK

10
เมื่อศาสนาของคุณบอกว่า Android Task Killer นั้น "ไม่จำเป็น" แต่ใช้ ATK เพื่อกำจัดงานที่ไม่ทำงานที่ไม่มีการเปลี่ยนแปลงระบบปฏิบัติการจากการคลานที่ความเร็วปกติ 1-5% จากความเร็วปกติเป็น 100% ( วัด) 100% ของเวลาในการใช้งาน ATK มากกว่า 1,000 ครั้งทุก 2 ปีทุกครั้งที่ระบบใช้งานฟรีต่ำสุด 50MB ศาสนาของคุณผิดปกติ
DVK

@ JoePlante คุณสามารถปิดแท็บและหน้าต่างที่เปิดอยู่ทั้งหมดก่อนจากนั้นเพียงกดปุ่มย้อนกลับหนึ่งครั้งเพื่อออก :) อย่างน้อยใน GS2 ของฉันนั่นคือ
ldam

29

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

ฉันแนะนำให้คุณอ่านข้อมูลเกี่ยวกับกิจกรรมและบริการ หยุดใช้คำว่า "แอพ" และเริ่มอ้างถึงส่วนประกอบเช่นกิจกรรมบริการ ฉันคิดว่าคุณต้องเรียนรู้เพิ่มเติมเกี่ยวกับแพลตฟอร์ม Android; เป็นการเปลี่ยนความคิดจากแอปพีซีมาตรฐาน ความจริงที่ว่าไม่มีการโพสต์ของคุณมีคำว่า "กิจกรรม" (สั้นจากใบเสนอราคาคำถามที่พบบ่อยไม่ใช่คำพูดของคุณ) ในพวกเขาบอกฉันว่าคุณต้องอ่านเพิ่มเติม


ฉันได้อ่านเนื้อหาส่วนใหญ่ใน android.com =) และฉันสามารถเชื่อมโยงไปยังคำถามที่ฉันพูดคุยเกี่ยวกับกิจกรรมเพื่อที่จะไม่เป็นความจริง (เช่น: stackoverflow.com/questions/2032335/หรือstackoverflow.com/questions/) 2032335 / ...ฯลฯ ... ) แต่ผมอาจจะให้มันเป็นหนึ่งในการเดินทางที่ผ่านมาและพยายามที่จะสร้างที่ "แอป" เป็น Servce แล้ว ...
เท็ด

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

23

บล็อกโพสต์เมื่อจะรวมปุ่มออกใน Android Apps (คำแนะนำ: ไม่เคย)อธิบายว่ามันไกลไกลดีกว่าที่ฉันสามารถทำได้ ฉันหวังว่านักพัฒนา Android ทุกคนจะอ่านมันแล้ว

ข้อความที่ตัดตอนมา:

จากประสบการณ์ของฉันสิ่งที่ [ผู้ใช้] ต้องการคือ: วิธีการที่ชัดเจนในการรับประกันว่าแอปจะหยุดการใช้ทรัพยากร (แบตเตอรี่, รอบการทำงานของ CPU, การถ่ายโอนข้อมูล ฯลฯ )

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

  • Activity.finish()ในกรณีส่วนใหญ่ปุ่มออกก็เรียก นี่คือว่าเทียบเท่ากับการกดปุ่มปุ่มย้อนกลับ เผง บริการยังคงทำงานต่อไปและการสำรวจยังคงเกิดขึ้น ผู้ใช้อาจคิดว่าพวกเขาฆ่าแอพแล้วแต่พวกเขาไม่ได้และในไม่ช้าพวกเขาก็จะยิ่งรำคาญมากขึ้น
  • พฤติกรรมการออกตอนนี้ไม่ชัดเจน ปุ่มออกของคุณควรปิดกิจกรรมหรือควรหยุดบริการที่เกี่ยวข้องผู้รับและสัญญาณเตือนทั้งหมดด้วยหรือไม่ ควรBackทำอย่างไร? จะเกิดอะไรขึ้นถ้าพวกเขาตีHomeแทน? จะเกิดอะไรขึ้นถ้าแอปของคุณมีวิดเจ็ต ปุ่มออกควรหยุดการอัปเดตนั้นด้วยหรือไม่

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

ไปข้างหน้าและอ่านบทความทั้งหมด


3
Exit และ Back ไม่ได้ถูกใช้เพื่อจุดประสงค์เดียวกันเสมอไป ยกตัวอย่างเช่น Pandora เมื่อคุณกดเพื่อออกจากแอพนี้มันจะไม่ออกจากแอพ (ให้มันเล่นในพื้นหลังเป็นบริการ)
IgorGanapolsky

@IgorG แอปเครื่องเล่นเพลงต้องใช้ปุ่ม "หยุด" เพื่อหยุดเล่นเพลงไม่ใช่ปุ่ม "ออก" เพื่อออกจากแอป
Dheeraj Vepakomma

คุณเคยใช้ Pandora, iHeartRadio, Spotify, Jango และแอพสตรีมเพลงอื่น ๆ หรือไม่? พวกเขาทั้งหมดมีปุ่มเลิก การหยุดเล่นเพลงไม่ใช่สิ่งที่เหมือนเป็นการออกจากแอพ โดยเฉพาะอย่างยิ่งถ้าคุณมีบริการที่ทำงานอยู่ในแถบการแจ้งเตือน
IgorGanapolsky

2
เป็นตำนานหรือไม่ผู้ใช้ดั้งเดิมหรือไม่ แต่เกือบทุกซอฟต์แวร์ UI ที่เคยเขียน - บนแพลตฟอร์มและระบบปฏิบัติการใด ๆ - ใช้ปุ่มออก / ปิด / ออก คุณจะใช้มันอย่างไร
IgorGanapolsky

3
@ DheerajV.S. เพียงหยุดการใช้ทรัพยากรเมื่อใดก็ตามที่แอปไม่สามารถมองเห็นได้ คำแนะนำที่ไม่ดี มาก. มาก x99 เมื่อใดก็ตามที่ฉันพยายามส่งภาพถ่ายด้วยตัวเองฉันจะต้องทำให้แอพนั้นปรากฏต่อเนื่องเป็นเวลา 5 นาทีเพราะถ้าฉันย่อให้เล็กสุดมันก็หยุดส่งอีเมลรูปถ่าย ถูกต้องฉันไม่สามารถใช้โทรศัพท์เป็นเวลา 5 นาทีเต็มเพราะนักพัฒนาบางคนที่คิดว่าแอพควรทำงานเฉพาะเมื่อมองเห็นได้ ลองจินตนาการว่าการส่งไฟล์ขนาดใหญ่เช่นวิดีโอ .....
Pacerier

21

คำตอบ: (Romain Guy): ผู้ใช้ไม่ได้ระบบจะจัดการสิ่งนี้โดยอัตโนมัติ นั่นคือสิ่งที่วงจรชีวิตของกิจกรรม (โดยเฉพาะ onPause / onStop / onDestroy) มีไว้สำหรับ ไม่ว่าคุณจะทำอะไรอย่าใส่ปุ่มแอปพลิเคชัน "ออกจาก" หรือ "ออก" มันไม่มีประโยชน์กับแอปพลิเคชันของ Android นี่เป็นสิ่งที่ตรงกันข้ามกับวิธีการทำงานของแอปพลิเคชันหลัก

1: การออกจากแอปพลิเคชันทั้งหมดโดยทั่วไปอาจไม่มีการควบคุม แต่มันก็ไม่ไร้ประโยชน์ ถ้า windows ไม่มีตัวเลือก exit ระบบจะด็อกกี้ช้าเนื่องจากหน่วยความจำเต็มและระบบปฏิบัติการต้องเดาว่าคุณใช้โปรแกรมใด ฉันไม่สนใจสิ่งที่ Romain Guy หรือ Larry Page และ Sergey Brin พูด - นี่เป็นข้อเท็จจริงที่ไม่อาจปฏิเสธได้: ระบบทำงานช้าลงเมื่อพวกเขาต้องฆ่างานเพื่อให้ได้หน่วยความจำก่อนที่จะเปิดตัวแอปใหม่ คุณแค่บอกฉันไม่ได้ว่ามันใช้เวลาไม่นานในการฆ่าแอพ! แม้แต่แสงจากดวงดาวไกลใช้เวลาในการ ... มีคือการใช้งานบางอย่างในการช่วยให้ผู้ใช้แอพพลิเคใกล้ได้อย่างเต็มที่

2: ตรงกันข้ามกับวิธีการทำงานของแอปพลิเคชันหลัก นั่นหมายความว่าไง? เมื่อตอนนี้ฉันใช้แอพเสร็จแล้วมันไม่ทำงานอีกต่อไป ... มันกำลังรอที่จะถูกระบบปฏิบัติการฆ่าเมื่อจำเป็นต้องใช้หน่วยความจำ

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

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

มันขมวดคิ้วหรือเปล่า? นั่นเป็นมุมมองของ Android - พวกเขาขมวดคิ้วอยู่กับมัน และนักพัฒนามือใหม่ Android หลายคนก็ขมวดคิ้วในเรื่องนี้

แต่เมื่อมันลงมามีการเข้ารหัสที่ดีและการเข้ารหัสที่ไม่ดี มีโมเดลโฟลว์ของโปรแกรมที่ดีและมีโมเดลโฟลว์ของโปรแกรมที่ไม่ดี

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

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

ในทำนองเดียวกันถ้าคุณกำลังเล่นเกมและโทรศัพท์ดังขึ้นใช่ หยุดเกมชั่วคราวและเล่นต่อไป แต่ถ้าผู้ใช้เล่นเกมเป็นระยะเวลาหนึ่งให้ปล่อยให้พวกเขาออกไป

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

การระงับและออกจากงานเป็นภารกิจที่สำคัญสองประการและไม่ได้ทำหน้าที่ของอีกฝ่ายให้สำเร็จ


2
"หากผู้ใช้ต้องการย่อขนาดแอปสิ่งที่ดีที่สุดคือการย่อให้เล็กสุดหากผู้ใช้ต้องการออกจากแอปหมายความว่าเป็นการดีที่สุดที่จะออก" - มีสิ่งหนึ่ง (จากประสบการณ์มากกว่าทศวรรษ): ผู้ใช้ไม่ค่อยรู้สิ่งที่พวกเขาต้องการ หากคุณไม่ช่วยพวกเขาคุณจะต้องเปลี่ยนมัน เกี่ยวกับตัวอย่างด้านบน: ขอผมยกตัวอย่างอื่น ๆ ให้คุณ: คุณกำลังทำงานบนรถและมีโต๊ะสำหรับทำของ คุณมักจะเก็บเครื่องมือที่จำเป็นทั้งหมดไว้ในตู้หรือเก็บเครื่องมือที่ใช้มากที่สุดไว้ในมือเสมอหรือไม่? และเอาสายใหญ่มาใช้เพื่อให้มีสถานที่ใหม่หรือไม่
HoGo

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

ระบบรู้ว่าเมื่อคุณเริ่มแอปหนึ่งและไม่มีหน่วยความจำมันควรจะฆ่าแอปสุดท้าย ผู้ใช้ไม่ควรรู้สิ่งนั้น คุณต้องการเพียงเพราะคุณเป็นมนุษย์ที่ชอบการควบคุมการอยู่ในความทรงจำของกล้ามเนื้องี่เง่าเพียงแค่การควบคุมที่ไม่มีจุดหมายแม้จะต้องปิดโปรแกรม คอมพิวเตอร์ถูกคิดค้นขึ้นมาโดยอัตโนมัติฉันต้องการให้ Windows ทำงานมากกว่า Android และเพิ่งปิดโดยอัตโนมัติสำหรับฉัน แต่ฉันต้องจำไว้ว่าให้บันทึกและเลิกใช้งานนั่นเป็นเรื่องงี่เง่าทำไมฉันผู้ใช้ต้องทำเช่นนั้น? คอมพิวเตอร์ควรจัดการหน่วยความจำของพวกเขาฉันมีสิ่งอื่น ๆ ที่จะจัดการ
Luiz Felipe

ที่จริงฉันไม่ได้ปิดโปรแกรมในเครื่อง Windows ของฉันฉันมี RAM 32GB ฉันเพิ่งปล่อยให้ทุกอย่างทำงานฉันปิดพวกเขาเมื่อฉันเสร็จงานของฉัน เหตุใดจึงปิดโปรแกรมเพื่อเปิดอีกครั้งในภายหลัง 5 นาทีสิ่งนี้ไม่สมเหตุสมผล คิดว่าโครงการ C ++ ขนาดใหญ่ที่ใช้เวลา 2 นาทีในการตอบสนองฉันเพิ่งเปิด Visual Studio ตลอดไป และฉันคาดหวังว่ามันจะไม่ผิดพลาดจากการเปิด 15 วัน (และใช่ฉันใช้หน่วยความจำ ECC สำหรับเรื่องนั้น)
Luiz Felipe

การเปรียบเทียบกับร้านขายเครื่องจักรเป็นสิ่งที่ดีฉันยังวางเครื่องมือที่ใช้มากที่สุดไว้บนโต๊ะฉันไม่เลือกเครื่องมือใช้และนำกลับมาใช้ใหม่ทุกครั้ง นอกจากนี้ฉันไม่เริ่มวันเปิดคอมพิวเตอร์รอให้เริ่มต้นเปิด IDE อะไรก็ได้ ฉันเพิ่งปล่อยให้มันทำงานคอมพิวเตอร์ที่ทันสมัยสามารถใช้งานที่ 40w ทำไมต้องปิด มันยังใส่ส่วนประกอบน้อยลง (ไม่มีกระแสไฟไหลเข้า EEs รู้ :))
Luiz Felipe

19

ฉันคิดว่าประเด็นคือไม่จำเป็นต้องออกจากแอพเว้นแต่คุณจะมีซอฟต์แวร์บั๊ก Android ออกจากแอปเมื่อผู้ใช้ไม่ได้ใช้งานและอุปกรณ์ต้องการหน่วยความจำเพิ่มเติม หากคุณมีแอพที่จำเป็นต้องเปิดใช้งานบริการในเบื้องหลังคุณอาจต้องการวิธีปิดบริการ

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

หากคุณจำเป็นต้องมีรหัสที่ทำงานเมื่อออกคุณสามารถแทนที่ onPause (), onStop () หรือ onDestroy () ตามความเหมาะสม http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


5
นอกเหนือจากสิ่งยุ่ง ๆ อื่น ๆ ที่ฉันค้นพบแล้วฉันคิดว่าการพัฒนาแอพของเราสำหรับ Android จะไม่เกิดขึ้น "พี่ใหญ่" มันมากเกินไป - เกิดอะไรขึ้นที่ Android บอกฉันว่าแอพใดที่ควรใช้งานหรือไม่ ฉันในฐานะโปรแกรมเมอร์ควรมีตัวเลือกไม่ใช่ google หรือ android = (
Ted

3
กิจกรรมของคุณ - อินเทอร์เฟซผู้ใช้ที่ใช้งานอยู่ - หายไปเมื่อแอปพลิเคชันอื่นอยู่ด้านบนหรือคุณกดย้อนกลับหรืออะไรก็ตาม ผู้ใช้ไม่ได้โต้ตอบกับพวกเขาดังนั้นจึงปลอดภัยที่สุดที่จะบันทึกสถานะในกรณีที่ผู้ใช้ไม่ได้กลับมาเป็นเวลานานและอย่างที่คุณรู้ ไม่มีอะไรหยุดยั้งคุณไม่ให้เขียนServiceแม้ว่าจะทำงานต่อเนื่องที่เกิดขึ้นในพื้นหลังเช่นการรับข้อมูลดันหรืออะไรก็ตาม Google Talk ไม่หยุดทำงานเมื่อคุณใช้แอพอื่น เช่นเดียวกันกับเครื่องเล่นเพลง ดูแอพอื่น ๆ ที่นั่นและวิธีการทำงาน
Christopher Orr

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

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

1
คำถามนี้ยังมีชีวิตอยู่ฉันเห็น 4 ปีหลังจากที่ฉันนำมันขึ้นมา =) ฉันใช้มันเป็นบริการในพื้นหลัง แต่ฉันได้เพิ่มปุ่มเลิกใช้เนื่องจากฉันยังรู้สึกว่า - 4 ปีต่อมา - มันจำเป็น และที่สำคัญ และฉันก็เห็นแอพมากขึ้นเรื่อย ๆ เช่นกัน (เช่น Skype)
Ted

19

หากคุณไม่สามารถเข้าใจวิธีที่จะทำให้ข้อมูล / การเชื่อมต่อของคุณ (และ "แอปพลิเคชัน" ของคุณ) ขัดขืนคุณจะไม่สามารถทำสิ่งที่คุณต้องการใน Android ได้

ผู้ที่ดาวน์โหลด App Killers ตัวน้อยเหล่านี้มักจะพบว่าพวกเขาไม่ได้ช่วยยืดอายุการใช้งานแบตเตอรีหรือการใช้หน่วยความจำ แต่ขัดขวางระบบปฏิบัติการจากการจัดการหน่วยความจำอย่างมีประสิทธิภาพ ...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


ในขณะที่เรากำลังพูดถึง task killer, โพสต์ enlightening มากปรากฏบน Android reddit สองสามวันที่ผ่านมา สรุปสาระสำคัญคือใช้ task killer อย่างระมัดระวังหรือคุณอาจจบลงด้วยการทำร้ายแบตเตอรี่ของคุณ: reddit.com/r/Android/comments/cwhm6/…
Neil Traft

@ Neil Traft ฉันพบความคิดเห็นในโพสต์ที่ให้ความกระจ่างมาก พนักงานขายในร้านค้าที่มีการแนะนำและติดตั้ง killers งานสำหรับลูกค้าของพวกเขา :)
Dipu

3
@Dan, มันเป็นไปได้ยังไงที่ฉันออกจากแอพที่ฉันทำมาเป็นเวลาหนึ่งสัปดาห์เพื่อขัดขวาง Android OS จากงานของมัน? ดังนั้นจึงมีหน่วยความจำว่างมากกว่า นั่นอาจเป็นอุปสรรคต่อ Android! แน่นอนว่ามันสามารถเร่งความเร็วในภายหลังได้! ถ้าฉันรู้ว่าฉันทำแอพนี้มาระยะหนึ่งแล้วมันไม่ได้มีจุดประสงค์อะไรเลย ใช้เวลาเพียงหน่วยความจำและไม่ช้าก็เร็วฉันจะเปิดตัวแอพใหม่และระบบปฏิบัติการจะมีความล่าช้าเพิ่มขึ้นเพราะมันจะต้องไปฆ่าแอพบางตัวที่ฉันรู้ว่า WEEKS เมื่อก่อนฉันทำไปแล้ว
Jesse Gordon

@Jesse Gordon, คุณเคยดูกระบวนการจริงหลังจากที่คุณฆ่าแอพหรือไม่? พวกเขาเริ่มระบบใหม่สมมติว่ามีปัญหา ... ระบบปฏิบัติการจะฆ่าแอปเมื่อต้องการหน่วยความจำ คุณเคยอ่านอะไรที่โพสต์ในบทความที่กล่าวถึงที่นี่บ้างไหม?
ด่าน

@ แดนคิดว่า Android จะทำอะไรแบบนี้ .... มันต้องมีการศึกษาซักผ้าสีขาวที่จริงจัง
Pacerier

18

ฉันจะพิจารณาอ่าน"การพัฒนาแอปพลิเคชั่นไร้สาย Android"เผยแพร่โดย Addison-Wesley ฉันเพิ่งทำเสร็จแล้วและมันก็ละเอียดมาก

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

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

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


2
ขอบคุณสำหรับเคล็ดลับหนังสือ ฉันจะดูถ้าฉันสามารถและถ้าฉันตัดสินใจที่จะย้ายบนพอร์ต Android เพียงเพื่อกล่าวอีกครั้งว่าผู้ใช้ของเราไม่ทันสมัยเมื่อมาถึงคอมพิวเตอร์ ฉันจะเป็นเรื่องยากสำหรับพวกเขาที่จะใช้ตัวอย่างเช่น NotificationBar ใน Android เล็กเกินไป (พวกเขามีนิ้วใหญ่ฮิฮิ) เป็นโลกที่แตกต่างสำหรับพวกเขาดังนั้นเราต้องทำให้มันง่ายและไม่มีตัวเลือกสำหรับผู้ใช้ เราสร้างโซลูชัน. NET ของเราโดยคำนึงถึงสิ่งนั้น - อย่าให้ทางเลือกแก่พวกเขา =)
30414 Ted

ฉันได้ยินสิ่งนั้น คุณต้องสมมติว่าผู้ใช้ส่วนใหญ่ไม่ได้ฉลาดมากเทคโนโลยี
Andy

8
ฉันเบื่อกับมนต์ของอุปกรณ์มือถือที่มี "ทรัพยากร" เพียงเล็กน้อย ตื่นขึ้นมาพวกเขาทำงานด้วยความเร็วสูงกว่า 500MHz และมีหน่วยความจำมากมาย Dell Axim รุ่นเก่าของฉันมี RAM ขนาด 128MB อุปกรณ์ในปัจจุบันมักจะมีมากกว่า 512RAM และทำงานบน 1GHZ! นั่นคือมากกว่า Pentium 90Mhz เก่าของฉัน 10 เท่าและฉันก็ไม่ได้ยิน ppl ที่พูดว่า "ทรัพยากรที่ จำกัด " และนี่ ถึงเวลาตื่นขึ้นมาแล้วได้กลิ่นกาแฟ - เราอยู่ในปี 2010 ตอนนี้ไม่ใช่ยุค 80
Ted

16

เกือบ 99% ของเวลาไม่จำเป็นสำหรับแอปพลิเคชัน Android ที่จะควบคุมวงจรชีวิตของตัวเอง ใช้เวลาส่วนใหญ่ในการวางแผนหรือออกแบบแอพพลิเคชั่นให้ดีขึ้น ตัวอย่างเช่นแทนที่จะสร้างบริการภายใน (ไม่ส่งออก) เพื่อจัดการการดาวน์โหลด ฯลฯ หรือออกแบบการกระทำและงานรอบเวิร์กโฟลว์ผู้ใช้

แต่ที่ถูกกล่าวว่ามีที่ไหนจะมีวิธี Android จัดเตรียม - ผ่านคลาส android.os.Process ซึ่งเป็น API ที่ดีกว่า Java เพื่อควบคุมกระบวนการพื้นฐาน และแตกต่างจาก Java มันไม่ได้ปฏิบัติต่อนักพัฒนาเช่นปัญญาอ่อนโดยซ่อนมันไว้ข้างหลังโทร java.lang.System.exit () ง่าย ๆ

ดังนั้นคุณจะขอให้แอปพลิเคชันของคุณฆ่าตัวตายใน Android ได้อย่างไร? เคล็ดลับง่าย ๆ :

สร้างคลาสแอปพลิเคชัน Android ของคุณเองโดยสืบทอดจากคลาส android.app.Application มาตรฐาน (อย่าลืมประกาศในไฟล์ AndroidManifest.xml)

แทนที่เมธอด onCreate () และเก็บ ID กระบวนการที่เริ่มต้นแอปพลิเคชันของคุณ:

this.pid = android.os.Process.myPid(); // Save for later use.

ตอนนี้เพื่อฆ่าแอปพลิเคชันของคุณให้ใช้วิธีการ kill ():

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

ตอนนี้เมื่อใดก็ตามที่คุณต้องการให้แอปของคุณฆ่าตัวตายให้พิมพ์บริบทของแอปพลิเคชันแล้วโทรหาวิธีการฆ่าของคุณ!

((MySuicidalApp) context.getApplicationContext()).kill()

เพียงจำไว้ว่าเนื่องจากนโยบายการจัดการกระบวนการใน Android ที่เกี่ยวข้องกับบริการโดยเฉพาะ Android อาจเลือกที่จะรีสตาร์ทบริการของคุณ (ดูที่คุณไม่ควรใช้ task killer บน Android )


ใช่ฉันมาที่นี่เพียงเพราะฉันต้องการปิดแอปของฉันในสถานการณ์เดียวมันสมเหตุสมผลแคชข้อมูล OBB ของฉันเสียหายและฉันต้องรีสตาร์ทแอปทั้งหมด
Luiz Felipe

14

เมื่อฉันคิดแอปพลิเคชันใน Android ฉันเห็นด้วยวิธีนี้:

  • คุณกำลังทำงานกับแอปพลิเคชันของคุณ
  • โทรศัพท์ดัง
  • คุณรับสาย
  • เมื่อสิ้นสุดการโทรคุณจะกลับมาที่แอปพลิเคชันของคุณในที่เดียวกับที่คุณอยู่

ในการทำเช่นนั้นคุณจะต้องใช้Backปุ่มหรือHomeปุ่มในโทรศัพท์ของคุณเท่านั้น (โดยการกดสั้นหรือยาว) และแถบการแจ้งเตือน

เมื่อฉันออกจากแอปพลิเคชันของฉันฉันจะใช้Backปุ่มจนกว่าฉันจะออกจากมันหรือHomeปุ่ม

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

บนพีซีคุณมีเดสก์ท็อปหลาย GUI และบน Android คุณเห็นได้ชัดว่ามีหลายงาน แต่คุณจะแสดงแอพได้ครั้งละหนึ่งแอปเท่านั้น (ฉันไม่ได้พิจารณาวิดเจ็ตที่นี่ ^^) และบนโทรศัพท์มือถือคุณสามารถมีการแจ้งเตือนบางสิ่งที่สำคัญกว่าสิ่งที่คุณทำ

ดังนั้นแนวคิดทั้งหมดของแอปพลิเคชันจึงขึ้นอยู่กับสิ่งที่แตกต่างกันที่ "เข้าสู่แอปพลิเคชัน - งาน - ออกจากแอปพลิเคชัน"


12

Hmmmm ...

ฉันคิดว่าคุณไม่เห็นแอพ Android ที่ถูกต้อง คุณสามารถทำสิ่งที่ต้องการได้อย่างง่ายดาย:

  • ทำกิจกรรมแอพบันทึก / กู้คืนสถานะเหมือนได้รับการสนับสนุนในเอกสารนักพัฒนา livecycle

  • หากจำเป็นต้องเข้าสู่ระบบบางอย่างในขั้นตอนการกู้คืน (ไม่มีข้อมูลการเข้าสู่ระบบ / เซสชัน) ให้ทำ

  • ในที่สุดก็เพิ่มปุ่ม / เมนู / หมดเวลาในกรณีที่คุณจะทำfinish()โดยไม่ต้องบันทึกการเข้าสู่ระบบและข้อมูลเซสชั่นอื่น ๆ ทำให้สิ้นเซสชั่นแอปโดยปริยาย: ดังนั้นหากแอปเริ่ม / นำไปข้างหน้าอีกครั้งก็จะเริ่มเซสชั่นใหม่

ด้วยวิธีนี้คุณไม่สนใจว่าแอพนั้นจะถูกลบออกจากหน่วยความจำจริงหรือไม่

หากคุณต้องการที่จะลบมันออกจากหน่วยความจำ (นี่คือกำลังใจและ BTW สำหรับวัตถุประสงค์อะไร?) คุณสามารถฆ่ามันตามเงื่อนไขในตอนท้ายของonDestroy()ด้วยjava.lang.System.exit(0)(หรืออาจrestartPackage(..)?) แน่นอนว่าทำได้เฉพาะในกรณีที่คุณต้องการ "จบแอปจริงๆ" เพราะonDestroy()เป็นส่วนหนึ่งของวงจรชีวิตปกติของกิจกรรมและไม่ใช่แอปที่สิ้นสุดเลย


11

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


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

3
@JesseGordon พูดอะไรและอีกแง่มุมหนึ่งว่าทำไมการเลิกใช้เหตุผล: ถ้าฉันไม่ออกจากแอพที่ใช้ทรัพยากรจำนวนมากฉันรู้ว่าฉันจะไม่ใช้อีกต่อไปเป็นเวลาหนึ่งเดือนระบบปฏิบัติการอาจฆ่าแอปอื่น ๆเมื่อทรัพยากรมีน้อยในขณะที่ปล่อยให้แอปพลิเคชันหมูทรัพยากรที่ไร้ประโยชน์นี้กำลังทำงานอยู่ ... ทำให้แอปอื่นใช้เวลาในการดำเนินการนานกว่าที่ควรจะเป็น
Don Hatch

10

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

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

  2. หากแอปพลิเคชันของคุณมีแคชข้อมูลที่ละเอียดอ่อนในหน่วยความจำคุณอาจต้องการฆ่าแอปเพื่อให้แอปไวรัส / เวิร์ม / โกงไม่สามารถเข้าถึงได้ ฉันรู้ว่ารูปแบบความปลอดภัยควรจะป้องกันสิ่งนั้น แต่ในกรณี ...

  3. หากแอปพลิเคชันของคุณใช้ทรัพยากร (เช่นเครือข่าย, CPU, เซ็นเซอร์ ฯลฯ ) ที่อาจส่งผลเสียต่อโทรศัพท์วิธีหนึ่งที่จะทำให้แน่ใจว่าทรัพยากรเหล่านั้นว่างแล้วคือออกจากแอปพลิเคชัน ฉันเข้าใจว่าแอพที่ทำงานได้ดีควรเพิ่มทรัพยากรเมื่อไม่จำเป็น แต่อีกครั้งการออกจากแอปพลิเคชันดูเหมือนจะเป็นวิธีที่สมเหตุสมผลในการรับรองว่า


6
คุณคิดอย่างไรกับ "แอปพลิเคชัน"? ถ้าฉันเปิดแอพ Facebook และตั้งค่ารูปโปรไฟล์ใหม่ - แอพ Camera หรือ Gallery ของฉันเริ่มต้นขึ้น ในฐานะผู้ใช้ฉันยังคงทำงานเดิมอยู่ (โดยใช้ Facebook) หากฉันตัดสินใจปิด Facebook แอพกล้องถ่ายรูปและแกลเลอรีของฉันก็ต้องปิดเช่นกัน (เนื่องจากเป็นกิจกรรมที่เปิดตัวจาก Facebook) ... จะเกิดอะไรขึ้นถ้าฉันอยู่ระหว่างการแก้ไขภาพอื่น ๆ ของฉันและตั้งใจจะปิด Facebook เท่านั้น ? คุณจะเปลี่ยนปัญหาเป็นการสูญเสียข้อมูลที่อาจเกิดขึ้น
seanhodges

ฉันไม่คิดว่ามันจะไปไกลเท่าที่ข้อมูลสูญหาย หากคุณมีกิจกรรมของบุคคลที่สามที่ทำงานในกิจกรรมเดียวกับกิจกรรมของคุณและกิจกรรมของคุณเป็นกิจกรรมที่มีปุ่มออกจากนั้นผู้ใช้จะต้องไปfinish()ที่กิจกรรมของบุคคลที่สามก่อนที่เขาจะสามารถกดปุ่มออก และกิจกรรมของบุคคลที่สามควรบันทึกข้อมูลใด ๆ ที่ยังไม่ได้บันทึกในเวลานั้น ฉันไม่คิดว่าคุณสามารถใช้ตัวสลับแอปเพื่อกลับไปที่กิจกรรมปุ่มออกยกเว้นว่ามันกำลังทำงานแยกกันอยู่ และถ้าเป็นงานแยกต่างหากมันเป็นกระบวนการที่แยกต่างหากดังนั้นจะไม่ถูกฆ่าด้วยปุ่มออก
Neil Traft

2
1. ฉันคิดว่า 99.99% ของผู้ใช้ Android ไม่ควรกังวลเกี่ยวกับวิธีที่ระบบปฏิบัติการจัดการแอปพลิเคชั่นที่อยู่หลังม่าน ที่เหลือเป็น geeks และจะพบเครื่องมือขั้นสูงที่ทำให้ระบบทำงานได้อย่างที่พวกเขาต้องการ 2. คุณสามารถยกเลิกการโหลดข้อมูลที่สำคัญใด ๆ เมื่อกิจกรรมหยุดชั่วคราวหรือหยุด 3. เช่นเดียวกับข้างต้นทรัพยากรสามารถเป็นอิสระในวิธีการเรียกกลับวงจรชีวิต เมื่อกิจกรรมดำเนินการต่อทรัพยากรสามารถจัดสรรได้อีกครั้ง
Zsolt Török

4
ฉันคิดว่ามันค่อนข้างน่าสนใจที่ผู้ใช้ Android จำนวนมากกำลังติดตั้ง "Advanced Task Killer" แอปที่ปิดแอพอื่น ๆ เนื่องจากคุณไม่สามารถทำมันเองได้ ฉันใช้มันตลอดเวลาเอง การเลิกใช้แอพไม่ใช่สิ่งที่ฉันรู้สึกว่าคุณทำได้
Ted

2
@ ZsoltTörökผู้คน 99.99% จัดการกับคอมพิวเตอร์ / โทรศัพท์ช้าและถูกบังคับให้เลือกที่จะกังวลเกี่ยวกับวิธีที่ระบบปฏิบัติการจัดการแอปพลิเคชันที่อยู่เบื้องหลังม่าน
Pacerier

10

เคอร์เนล Linux มีคุณสมบัติที่ชื่อว่าOut-of-memory killer (ดังกล่าวข้างต้นนโยบายสามารถกำหนดค่าได้ในระดับ userspace และ kernel ไม่เหมาะสมที่สุด แต่ไม่จำเป็นเลย)

และมันถูกใช้อย่างหนักโดย Android:

แอพ userspace บางตัวพร้อมให้ความช่วยเหลือกับแอพ kill เหล่านี้ตัวอย่างเช่น


9

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

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

หากมีการกระทำพิเศษที่ควรเกิดขึ้นเมื่อ "ออก" เช่นบันทึกงานของผู้ใช้หรืออะไรก็ตามคุณสามารถดำเนินการได้ก่อนส่วนการเริ่มต้นใหม่ของรูทีนด้านบนอีกครั้ง

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

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

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

เกี่ยวกับ system.exit (0):

หากคุณตัดสินใจที่จะใช้ system.exit (0) เพื่อปิดแอปของคุณด้วยความหยาบคายขั้นสุดท้าย (เช่นจากการกดปุ่มย้อนกลับสุดท้าย) ฉันจะเตือนคุณว่าแม้จะใช้งานได้ "" และในบางครั้ง เคสเป็นวิธีเดียวที่ฉันสามารถปิดแอพได้โดยไม่มีร่องรอยเหลืออยู่มีข้อผิดพลาดเล็กน้อยที่เกิดขึ้นใน Jelly Bean เมื่อคุณใช้วิธีนี้

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

ฉันสงสัยว่าสาเหตุของปัญหานี้คือรายการแอปล่าสุดอ้างอิงถึงแอปของคุณที่ไม่สามารถใช้งานได้เนื่องจากคุณปิดแอปโดยใช้ system.exit (0) การปิดแอปของคุณอย่างมีอารยธรรมมากขึ้นโดยใช้ finish () อาจแจ้งให้ OS ทราบในลักษณะที่อนุญาตให้รีเฟรชรายการแอพล่าสุด แต่ system.exit (0) ไม่ได้ทำเช่นนี้

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


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

9

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


ฉันรู้ว่า. ผลิตภัณฑ์ของ Apple นั้นดีสำหรับผู้บริโภคบางคน พวกเขาไม่ดีสำหรับนักพัฒนา Android OS มีศักยภาพเต็มที่ที่จะเป็นเหมือน "Windows OS ของพีซีโลก" สำหรับโทรศัพท์มือถือ อาจจะดียิ่งขึ้น มันเปิดกว้างกว่า windows ในโลก PC อยู่แล้วยกเว้นว่าจะไม่อนุญาตให้เราเขียนตัวจัดการงาน
dipu

7

มีการออกแบบเรียบง่าย (ค่อนข้าง) ซึ่งจะช่วยให้คุณได้รับรอบ "ปริศนา" ทางออก ทำให้แอปของคุณมีสถานะ "ฐาน" (กิจกรรม) ซึ่งเป็นเพียงหน้าจอว่าง ในวันแรกของการสร้างกิจกรรมคุณสามารถเปิดกิจกรรมอื่นที่มีฟังก์ชั่นหลักของแอปของคุณอยู่ได้ "exit" สามารถทำได้โดยเสร็จสิ้น () ในกิจกรรมที่สองนี้และกลับไปที่ฐานของหน้าจอว่างเปล่า ระบบปฏิบัติการสามารถเก็บหน้าจอว่างนี้ไว้ในหน่วยความจำได้นานเท่าที่ต้องการ ...

ในสาระสำคัญเนื่องจากคุณไม่สามารถออกจากระบบปฏิบัติการคุณเพียงแปลงร่างเป็นความว่างเปล่าที่สร้างขึ้นเอง


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

2
... และทำให้ System.exit (0) ช่วยออก =)
เท็ด

7

หากไม่มีฟังก์ชั่น exit สำหรับผู้พัฒนาแอพพลิเคชั่นที่จะฆ่าแอพพลิเคชั่นของตัวเองมันเป็นการออกแบบที่แย่มาก

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


9
โมฆะสาธารณะ appRestart () {เจตนา i = เจตนาใหม่ (getBaseContext (), MyActivity.class); i.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); }
androidworkz

2
รหัสความคิดเห็นด้านบนนี้ใช้งานได้ดีจริง ๆ อย่างน้อยคุณสามารถย้ายไปที่กิจกรรมแรกแทนการออกจาก App อย่างสมบูรณ์ :)
Harpreet

7

สำหรับการปิดแอพเมื่อใดก็ตามให้ใช้การFLAG_ACTIVITY_CLEAR_TOPตั้งค่าสถานะในเจตนาแล้วsystem.exit();

หรือมีวิธีคล้ายกัน แต่ไม่มีsystem.exit()เมื่อคุณต้องการออกจากการโทรวิธีนี้:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

ในHomeActivity.onCreate()รหัสต่อไปนี้ของคุณเพิ่ม

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

สิ่งนี้จะทำงานโดยไม่ทำลายวงจรชีวิตของ Android


7

ประการแรกไม่เคยไม่เคยใช้ System.exit (0) มันเหมือนกับการทำให้คนหลับต่อยเขาบนหัว!

ประการที่สอง: ฉันประสบปัญหานี้ ก่อนที่จะแบ่งปันโซลูชันของฉันฉันต้องการแบ่งปันความคิดของฉัน

ฉันคิดว่า "ปุ่มออก" นั้นโง่ โง่จริงๆจริงๆ และฉันคิดว่าผู้ใช้ (ผู้บริโภค) ที่ขอปุ่มออกสำหรับแอปพลิเคชันของคุณก็โง่เช่นกัน พวกเขาไม่เข้าใจว่าระบบปฏิบัติการทำงานอย่างไรและมีการจัดการทรัพยากรอย่างไร (และทำงานได้ยอดเยี่ยม)

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

แต่คุณต้องศึกษาและเรียนรู้วิธีการทำงานของ Android อย่างไรก็ตามนี่เป็นวิธีแก้ปัญหาของฉันที่จะมอบ "ปุ่มออก" ให้กับผู้ใช้

ฉันสร้างเมนูตัวเลือกที่สามารถมองเห็นได้ในแต่ละกิจกรรม (ฉันเป็นกิจกรรมที่ยอดเยี่ยม)

เมื่อผู้ใช้คลิกที่ปุ่มนี่คือสิ่งที่เกิดขึ้น:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

ดังนั้นฉันบันทึกใน SharedPreferences ที่ฉันต้องการจะฆ่าแอพของฉันและฉันเริ่มเจตนา โปรดดูที่ธงเหล่านั้น สิ่งเหล่านั้นจะล้าง backstack ทั้งหมดของฉันที่เรียกกิจกรรม DashBoard ของฉันซึ่งเป็นกิจกรรม "บ้าน" ของฉัน

ดังนั้นในกิจกรรมแดชบอร์ดของฉันฉันใช้วิธีนี้ใน onResume:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

และมันจะทำงานได้ค่อนข้างดี

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

ดูเหมือนว่าเจตนาล่าสุด (ที่เริ่มต้น DashboardActivity) ยังคงอยู่ในระบบ

ฉันขุดมากขึ้นเพื่อที่จะลบมันออกไป


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

4
"ฉันคิดว่า" ปุ่มออก "โง่" แอปพลิเคชันซอฟต์แวร์ส่วนใหญ่มีปุ่มออก
IgorGanapolsky

คุณพูดว่า "// HERE หยุดการให้บริการทั้งหมดของคุณ" แล้วใช้เสร็จสิ้น () บริการ Android ไม่มีวิธีเสร็จสิ้น () พวกเขามี unbindService (mConnection)
IgorGanapolsky

@ Squiggles หากคุณมีห้องที่ปิดไฟอัตโนมัติทั้งหมดและล็อคประตูของคุณเมื่อคุณออกไปคุณไม่จำเป็นต้องใส่ใจกับมัน
Seshu Vinay

7

วงจรชีวิตแอปพลิเคชัน Android ออกแบบมาสำหรับผู้ใช้โทรศัพท์มือถือไม่ใช่ผู้ใช้คอมพิวเตอร์

วงจรชีวิตของแอพเป็นกระบวนทัศน์ที่เรียบง่ายอย่างไร้ความปราณีที่ต้องการเปลี่ยนเซิร์ฟเวอร์ Linux ให้กลายเป็นอุปกรณ์สำหรับผู้บริโภค

Android เป็น Java ผ่าน Linux ซึ่งเป็นระบบปฏิบัติการเซิร์ฟเวอร์ข้ามแพลตฟอร์มที่แท้จริง นั่นคือวิธีที่มันแพร่กระจายอย่างรวดเร็ว วงจรชีวิตของแอปนั้นสรุปความเป็นจริงพื้นฐานของระบบปฏิบัติการ

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

เนื่องจากนี่คือ Stack Overflow ทุกคนที่อ่านข้อความนี้เป็นผู้ใช้คอมพิวเตอร์และต้องปิดความรู้ 90% เพื่อทำความเข้าใจวงจรชีวิตของแอปมือถือ


ฉันไม่ปฏิบัติตามการกระโดดของคุณเพื่อ "ผู้ใช้คอมพิวเตอร์ต้องปิด 90% ของความรู้" ใช่นั่นคือสิ่งที่ Romain Guy พูด แต่นั่นไม่ได้ทำให้เป็นจริง ดูเหมือนว่าฉันเป็นส่วน "ตัวเลือกขั้นสูงสำหรับผู้ใช้คอมพิวเตอร์" ด้วยปุ่ม "ออก" จะตอบสนองความต้องการของทุกคน
Don Hatch

ฉันไม่รู้ว่า "Romain Guy" คนนี้คือใครหรือทำไมเขาถึงอ้างถึงฉัน การปิดงานล่าสุดจะออกจากแอพเช่นเดียวกับการหยุดจากข้อมูลแอพ ADB อนุญาตการเข้าถึงเชลล์สำหรับผู้ใช้ขั้นสูง
Dominic Cerisano

6

ฉันใช้เวลาอ่านคำถามและคำตอบนี้นานกว่าการใช้งานแอปพลิเคชัน Android แบบกึ่งกึ่งกลาง

มันเป็นแอพ GPS ที่โพลคะแนนและส่งตำแหน่งปัจจุบันไปยัง webservice ทุก ๆ สองสามวินาทีโดยใช้เธรด ... ซึ่งสามารถสำรวจทุก 5 นาทีในกรณีของ Ted เพื่ออัปเดตจากนั้น onStop ก็สามารถเริ่มกิจกรรมอัปเดต Ted ได้เลย ความกังวลเกี่ยวกับหากพบว่า (asynchronous Ted, ไม่รหัสเช่นโปรแกรมเมอร์ Windows หรือโปรแกรมของคุณจะทำงานเหมือนโปรแกรม Windows ... eww มันไม่ยากเลย)

ฉันได้รหัสเริ่มต้นใน onCreate เพื่อตั้งค่าสิ่งต่าง ๆ สำหรับอายุการใช้งานของกิจกรรมรวมถึงcheckUpdate.start();:

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

รหัสนี้อาจผิดทั้งหมด แต่ใช้งานได้ นี่เป็นหนึ่งในแอปพลิเคชัน Android เครื่องแรกของฉัน

แอปพลิเคชันที่ไม่กิน CPU เมื่ออยู่ในพื้นหลัง แต่พร้อมที่จะเปิดใหม่ทันทีเนื่องจากอยู่ใน RAM (แม้ว่าจะไม่ถือ RAM เหมือนวงจรชีวิตของ Android) ... แอปพร้อมเสมอโทรศัพท์ , ผู้ชาย / gals หากแอปใช้ RAM ทั้งหมดและไม่สามารถปิดได้โดยระบบปฏิบัติการสิ่งนั้นอาจหยุดดัง = P นั่นเป็นสาเหตุที่ระบบปฏิบัติการต้องปิดแอปของคุณเมื่ออยู่ในพื้นหลัง (หากแอปพลิเคชันของคุณไม่อยู่ ทรัพยากรมันจะไม่ถูกปิด BTW) ดังนั้นลองเขียนแอปพลิเคชันที่ดีกว่า


คุณไม่ควรเรียก super.onStop จากวิธีการ onPause .. ดูเหมือนว่ามันจะทำให้เรื่องใหญ่ขึ้น
Matt Wolfe

1
หลังจากอ่านคำตอบเชิงปรัชญา 20 ข้อเพื่อที่จะหลบคำถาม ... +1 เมื่อมีรหัส
Pacerier

6

ทุกครั้งที่คุณย้ายไปยังหน้าถัดไปด้วยเจตนาใช้:

`YourActivityname.this.finish()`;

ตัวอย่าง:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

เพื่อไม่ให้กิจกรรมใดทำงานบนพื้นหลังและเมื่อคุณต้องการออกจากแอปให้ใช้:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

การออกจากนี้ได้ผลเหมือนเป็นเสน่ห์สำหรับฉัน :)


1
มันไม่ได้ออกจากแอพแทนมาที่ Mainactivity
Sharath

1
แต่ระวัง - onPause () จะไม่ถูกเรียกในกรณีของ killProcess และ System.exit เรามีปัญหากับสิ่งนั้น
Pavel Biryukov

4

ในกรณีใด ๆ System.exit(0);ถ้าคุณต้องการที่จะยุติการใช้งานของคุณคุณสามารถเรียก


5
System.exit()ไม่ฆ่าแอปของคุณหากคุณมีมากกว่าหนึ่งกิจกรรมในกองซ้อน นักพัฒนา Android ที่ใช้มันไม่เข้าใจวงจรชีวิตของแอพ Android ขั้นพื้นฐาน อ่านคำตอบนี้
Dheeraj Vepakomma

โซลูชันแบบเต็มพร้อมกับSystem.exit(0); stackoverflow.com/questions/2033914/ …
Sohail Zahid

2
ที่จริงแล้ว System.exit () จะฆ่าแอปของคุณ อย่างไรก็ตามหากมีการเรียกใช้ System.exit () จากที่อื่นนอกเหนือจากกิจกรรมหลัก Android จะรีสตาร์ทแอปด้วยกิจกรรมที่น้อยลงหนึ่งรายการในสแต็ก สำหรับฉันที่ดูเหมือนว่าเป็นการตอบสนองที่ไร้สาระต่อ System.exit ที่ตั้งใจทำ ฉันหมายความว่าถ้ามันเป็น div0 หรือเกิดความผิดพลาดโดยไม่ตั้งใจบางทีมันอาจจะเป็นความสุภาพในการรีสตาร์ท แต่สิ่งเหล่านั้นไม่ได้ทำให้เกิดการเปิดตัวอัตโนมัติอีกครั้งในขณะที่ฉันจำได้ แต่ไม่ว่าในกรณีใดแอปนั้นจะถูกฆ่า มันอาจถูกรีสตาร์ท แต่นั่นไม่ได้หมายความว่ามันจะไม่ถูกฆ่า
Jesse Gordon

3

หากคุณมี 10,20 .. กิจกรรมหลายอย่างกำลังทำงานอยู่และคุณต้องการที่จะทำกิจกรรมทั้งหมดให้เสร็จสิ้นและออกจากระบบ

สร้างอาร์เรย์แบบคงที่ในapplication classหรือconstants class.

ค่าคงที่

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity เพิ่มการอ้างอิงกิจกรรมปัจจุบันในอาร์เรย์นี้

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}

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