Alasan Intent yang diteruskan adalah NULL di onStartCommand


100

Apakah ada alasan lain bahwa Intent yang diteruskan onStartCommand(Intent, int, int)adalah NULL selain sistem yang memulai ulang layanan melalui tanda seperti START_STICKY?

Juga, ketika layanan di-restart oleh sistem, Intent.getAction()metode mengembalikan NULL ... kadang-kadang. Maksudnya bukan hanya NULLgetAction()

Saya bertanya di sini juga tetapi belum menerima jawaban.

PEMBARUAN : Setelah mengobrol dengan Mark Murphy, dia menyarankan agar saya kembali START_REDELIVER_INTENTdalam onStartCommand()panggilan balik dalam layanan saya alih-alih START_STICKYsehingga seluruh maksud dikirim setelah restart.

Saya tidak melakukan ini pada awalnya karena saya khawatir jika layanan mencoba melakukan sesuatu, lalu di tengah-tengah itu sesuatu layanan dimulai ulang ... akankah ia mengenali bahwa ia mulai melakukan sesuatu itu? Saya rasa itu logika yang harus saya tanggung :)


16
Daripada mengedit pertanyaan Anda dengan jawaban, harap tambahkan jawaban dan terima sehingga pertanyaan Anda akan berhenti muncul di kumpulan pertanyaan yang belum terjawab - terima kasih.
Dale Wilson

2
Sekadar catatan untuk seseorang dengan masalah serupa. Saya menemukan bahwa biasanya ketika saya mendapatkan error yang intentadalah nullpada onStartCommand(), hal itu disebabkan oleh beberapa kesalahan lain yang terlihat di LogCat sebelum ini. Saya tidak tahu mengapa, tapi inilah yang saya amati dan cukup mudah untuk mengabaikannya.
Piotr Chojnacki

2
@DaleWilson Saya mau, tetapi pertanyaan ini belum benar-benar terselesaikan. Sampai saya menerima jawaban pasti tentang mengapa sebuah Intent adalah nol atau bagaimana menghindari maksud nol tanpa menggunakan START_REDELIVER_INTENT (yang, kemudian saya pelajari, bukanlah yang saya butuhkan tetapi masih akan menyelesaikan masalah beberapa orang sehingga saya meninggalkan suntingan saya) Saya tidak bisa menerima jawaban.
rf43

@ Nyamuk Apakah Anda kebetulan memperhatikan apa, khususnya, yang membuat kesalahan?
rf43

1
@DDoSAttack Tidak terlalu penting. Dalam kasus saya, itu misalnya NullPointerExceptiondi suatu tempat di salah satu Aktivitas. Kemudian terjadi kesalahan lainnya. Tetapi dalam kedua kasus jejak stack saya menunjukkan bahwa layanan saya - yang berjalan saat kesalahan ini terjadi - memiliki intentyang nullseperti dalam kasus Anda. Saya berpikir cukup lama apa yang salah, ketika saya memutuskan untuk menggulir jejak tumpukan dan ternyata di suatu tempat di atas saya memiliki kesalahan saya yang sebenarnya. Setelah menyelesaikan yang satu ini, juga yang null intentmenghilang.
Piotr Chojnacki

Jawaban:


50

Saya terkejut tidak ada diskusi tentang bendera yang masuk. Saya akan memantau ini di log dengan yang berikut:

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;
}

Pembaruan: Bendera 0 jadi tidak ada yang bisa ditindaklanjuti di sana. Saya telah meninggalkan cek nol di sana tanpa kehilangan fungsi.

Sunting: Oke, saya menemukannya di dokumentasi START_STICKY di semua tempat! "jika tidak ada perintah start yang tertunda untuk dikirim ke layanan, itu akan dipanggil dengan objek maksud null, jadi Anda harus berhati-hati untuk memeriksanya."

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


6
di kotlin, maksudnya ditandai sebagai tidak-null, dan itu membuat aplikasi crashoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi

@MuhammadNaderi Anda bisa membuat niat untuk Intent?. Bekerja untuk saya. Tapi tentu saja Anda perlu menangani maksud null dengan benar.
Patrick Boos

@Bayu_joo But then of course you need to correctly handle null intent; Maksud kamu apa?! Bagaimana? Terima kasih.
Dr.jacky

Maksud saya, hanya di kode Anda membuatnya onStartCommand(intent: Intent?, ...)harus berfungsi. Dan kemudian jangan lakukan intent!!tetapi periksa dengan benar apakah maksudnya null.
Patrick Boos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.