มีวิธีบังคับให้แอปยังคงทำงานในพื้นหลังไม่ว่าจะเกิดอะไรขึ้น


12

บน Ice Cream Sandwich (ICS) ระบบปฏิบัติการจะจัดหมวดหมู่แอปของคุณและแต่ละหมวดหมู่มีเกณฑ์ของตัวเองที่ระบบปฏิบัติการใช้สำหรับการพิจารณาว่าแอปใดจะปิดก่อนเมื่อหน่วยความจำหมด

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

มีวิธีบังคับให้แอปยังคงทำงานในพื้นหลังไม่ว่าแม้ OS จะมีหน่วยความจำไม่เพียงพอหรือไม่?


7
นั่นคือการลงนามรหัสที่ไม่ดีโดยแอพ ผู้ใช้ไม่ควรกังวลกับสิ่งนี้และ Android ให้วิธีการเพื่อให้แอปสามารถบันทึกสถานะของพวกเขาและเรียกคืนได้ในภายหลัง (ตั้งแต่ Android เวอร์ชันต้น) คุณควรส่งรายงานข้อผิดพลาดไปยังผู้พัฒนาแอพ
Flow

คำตอบ:


8

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

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

ควรใช้ความระมัดระวังอย่างระมัดระวังเมื่อเล่นกับแอพที่เปลี่ยนพฤติกรรมในระดับต่ำเช่นนั้น


สิ่งหนึ่งที่ควรทราบคือต้องมีการรูทและเป็นการติดตั้งการดัดแปลง Android OS อย่างหนัก
sweisgerber.dev

5

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

คิดเกี่ยวกับสถานการณ์นี้: คุณได้ดาวน์โหลดแอพที่มีโค้ดไม่ดีซึ่งทำงานในการบูตทำให้บัฟเฟอร์ล้นและทำให้หน่วยความจำของคุณหมด โดยปกติแล้วแอพนี้จะถูกฆ่า แต่ถ้าเปิดไว้มันจะเปิดขึ้นอย่างมีประสิทธิภาพอิฐโทรศัพท์ของคุณจนกว่าจะรีบูตและหลังจากนั้นเริ่มอีกครั้งและอีกครั้ง ฯลฯ

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


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

1
@ onik บัฟเฟอร์ล้นไม่เกี่ยวข้องกับหน่วยความจำ hogging คุณรู้หรือไม่บัฟเฟอร์ล้นคืออะไร?

3
@onik ดังนั้นคำตอบคือไม่คุณไม่ทราบว่าบัฟเฟอร์ล้นคืออะไร เข้าใจแล้ว

1
@onik ยังวนซ้ำไม่สิ้นสุดในรายการที่เชื่อมโยงอย่างแน่นอนสามารถนำคุณเข้าสู่ OOM นานก่อนที่คุณจะวนรอบInteger.MAX_VALUEเวลา ทำไมคุณคิดว่าสิ่งต่าง ๆ ถูก จำกัด ด้วยInteger.MAX_VALUEล่ะ?

1
@onik ที่ถูกต้อง: ตามคำนิยามบัฟเฟอร์ล้นไม่สามารถขยายขนาดหน่วยความจำที่จัดสรร ถ้ามันขยายขนาดหน่วยความจำที่จัดสรรมันจะไม่เป็นบัฟเฟอร์มากเกินไป คุณกำลังคิดวนรอบไม่สิ้นสุดฉันคิดว่า
Mooing Duck

1

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


1
การเรียกใช้แอพที่ไม่มีเหตุผลพร้อมกับลำดับความสำคัญเบื้องหน้า (นั่นเป็นเหตุผลที่จำเป็นต้องมีการแจ้งเตือน) ถือเป็นการปฏิบัติที่ไม่ดี ดังที่ได้กล่าวไว้ก่อนหน้านี้: Android นำเสนอ Api ที่ดีที่สามารถใช้ตัวนับ / ตัวนับที่ไม่ได้รับผลกระทบจาก OOM killer มีการโพสต์ที่ดีโดย Dianne Hackborn เกี่ยวกับหัวข้อนี้
Flow

ฉันไม่สงสัยเลยว่ามี API ดังกล่าว แต่ในที่นี้มีการพูดถึงเรื่องนี้มาจากไหน
Erik

1
นอกจากนี้ยังเห็นได้ชัดว่ามีเหตุผลที่ทำให้แอปพลิเคชันทำงานต่อไปได้ในกรณีนี้ซึ่งแตกต่างจากตัวอย่างเกมที่คุณโพสต์
Erik

4
ไม่มีเหตุผลที่จะทำให้แอปทำงานต่อเนื่องเพราะตัวจับเวลา เพียงใช้onSaveInstanceStateและonRestoreInstanceStateเพื่อความปลอดภัยสถานะแอปรวมถึงข้อมูลตัวจับเวลา ไม่จำเป็นต้องเรียกใช้ใน Foreground แม้ว่ามันจะเป็นสัญญาณเตือนคุณสามารถใช้AlarmManagerเพื่อให้แน่ใจว่ามันจะถูกดำเนินการในภายหลัง เหตุผลเดียวที่ควรใช้ Foreground คือ: 1. คุณมีกิจกรรมเบื้องหน้าที่เกิดขึ้นจริงเช่นเล่นเพลงหรือแสดงวิดีโอ 2. คุณต้องการให้การเชื่อมต่อข้อมูลเปิดอยู่ (เช่น IMAP IDLE (push))
Flow

0

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

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

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

*** ขออภัยสำหรับ TYPO .. เครื่องตรวจสอบการสะกดคำไม่พร้อมใช้งาน หวังว่าคุณจะบรรลุสิ่งที่คุณตั้งใจจะได้รับ


ยินดีต้อนรับสู่ Android Enthusiast ไซต์ถามตอบสำหรับผู้ใช้งาน Android เท่าที่ฉันสามารถเข้าใจได้ 2 วิธีที่คุณระบุสามารถทำได้จากนักพัฒนาซอฟต์แวร์เท่านั้นคือผู้ที่มีซอร์สโค้ดของแอป น่าเสียดายที่นี่อาจไม่เป็นประโยชน์สำหรับผู้อ่านส่วนใหญ่ที่นี่เพราะพวกเขาไม่ได้พัฒนาแอพ ถ้านี้อาจจะมีผลบังคับใช้สำหรับผู้ที่ไม่ใช่นักพัฒนาพิจารณาแก้ไข ing คำตอบที่จะทำให้มันชัดเจนเกี่ยวกับวิธีการที่จะทำสิ่งเหล่านี้โดยไม่ต้องสัมผัสรหัสที่มาของแอป ขอบคุณ
Andrew T.

-1

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

ตัวเลือกการล็อคไม่สามารถใช้ได้ในระบบปฏิบัติการของตัวเองโดยใช้แอพบุคคลที่สามเช่นGO Task Managerฯลฯ สามารถช่วยได้


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