เหตุผลที่ Intent ที่ส่งผ่านจะเป็น NULL ใน onStartCommand


100

มีเหตุผลอื่นใดที่ Intent ที่ถูกส่งไปonStartCommand(Intent, int, int)จะเป็น NULL นอกจากระบบจะเริ่มบริการใหม่ผ่านแฟล็กเช่นSTART_STICKY?

นอกจากนี้เมื่อบริการเริ่มต้นใหม่โดยระบบIntent.getAction()เมธอดจะคืนค่า NULL ... เจตนาไม่ได้เป็นเพียงโมฆะgetAction()

ฉันถามที่นี่ด้วย แต่ยังไม่ได้รับคำตอบ

UPDATE : หลังจากคุยกับ Mark Murphy เขาแนะนำให้ฉันกลับมาSTART_REDELIVER_INTENTในการonStartCommand()ติดต่อกลับในบริการของฉันแทนที่จะSTART_STICKYส่งเจตนาทั้งหมดหลังจากเริ่มต้นใหม่

ฉันไม่ได้ทำสิ่งนี้ในตอนแรกเพราะฉันกังวลว่าหากบริการกำลังพยายามทำอะไรบางอย่างระหว่างนั้นมีการเริ่มบริการใหม่ ... ฉันเดาว่านั่นเป็นตรรกะที่ฉันจะต้องรับผิดชอบ :)


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

2
เพียงบันทึกสำหรับผู้ที่มีปัญหาคล้ายกัน ฉันพบว่าโดยปกติเมื่อฉันได้รับข้อผิดพลาดที่intentเป็นnullบนonStartCommand()มันจะเกิดจากข้อผิดพลาดบางอื่น ๆ ที่ปรากฏอยู่ใน LogCat ก่อนหน้านี้ ฉันไม่รู้ว่าทำไม แต่นี่คือสิ่งที่ฉันสังเกตเห็นและมันค่อนข้างง่ายที่จะมองข้ามมันไป
Piotr Chojnacki

2
@DaleWilson ฉันต้องการ แต่คำถามนี้ไม่ได้รับการแก้ไขอย่างแท้จริง จนกว่าฉันจะได้รับคำตอบที่ชัดเจนว่าเหตุใด Intent จึงเป็นโมฆะหรือวิธีหลีกเลี่ยงเจตนาว่างโดยไม่ต้องใช้ ฉันไม่สามารถยอมรับคำตอบได้
rf43

@Mosquito คุณสังเกตเห็นสิ่งที่เกิดข้อผิดพลาดโดยเฉพาะหรือไม่?
rf43

1
@DoSAttack ไม่สำคัญจริงๆ ในกรณีของฉันมันเป็นตัวอย่างNullPointerExceptionหนึ่งในกิจกรรม ต่อมาเป็นข้อผิดพลาดอื่น ๆ แต่ในทั้งสองกรณีการติดตามสแต็กของฉันแสดงให้เห็นว่าบริการของฉันซึ่งกำลังทำงานในขณะที่เกิดข้อผิดพลาดintentนี้nullเป็นเช่นนั้นในกรณีของคุณ ฉันคิดอยู่นานว่ามีอะไรผิดพลาดเมื่อฉันตัดสินใจเลื่อนการติดตามสแต็กขึ้นและปรากฏว่ามีข้อผิดพลาดที่แท้จริงอยู่ด้านบน หลังจากแก้ปัญหานี้แล้วก็null intentหายไปด้วย
Piotr Chojnacki

คำตอบ:


51

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

if (null == intent || null == intent.getAction ()) {
        String source = null == intent ? "intent" : "action";
        Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
        return START_STICKY;
}

อัปเดต: ค่าสถานะเป็น 0 ดังนั้นจึงไม่มีสิ่งใดที่สามารถดำเนินการได้ ฉันได้ออกจากการเช็คอินที่นั่นโดยไม่มีการสูญเสียฟังก์ชัน

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

http://developer.android.com/reference/android/app/Service.html


7
ใน kotlin เจตนาถูกทำเครื่องหมายว่าไม่เป็นโมฆะและทำให้แอปหยุดทำงานoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi

@MuhammadNaderi Intent?คุณก็สามารถทำกับเจตนา ทำงานให้ฉัน แต่แน่นอนว่าคุณต้องจัดการกับเจตนาว่างอย่างถูกต้อง
Patrick Boos

@PatrickBoos But then of course you need to correctly handle null intent; หมายความว่าไง?! อย่างไร? ขอบคุณ.
Dr.jacky

ฉันหมายถึงเพียงแค่ในรหัสของคุณทำให้onStartCommand(intent: Intent?, ...)มันควรใช้งานได้ จากนั้นอย่าทำintent!!แต่ตรวจสอบให้ถูกต้องว่าเจตนาเป็นโมฆะหรือไม่
Patrick Boos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.