Các lý do mà Intent được thông qua sẽ là NULL trong onStartCommand


100

Có lý do nào khác khiến Intent được chuyển tới onStartCommand(Intent, int, int)sẽ là NULL ngoài việc hệ thống khởi động lại dịch vụ thông qua một cờ chẳng hạn START_STICKY?

Ngoài ra, khi dịch vụ được khởi động lại bởi hệ thống, Intent.getAction()phương thức trả về NULL ... đôi khi. Ý định không chỉ là NULLgetAction()

Tôi cũng hỏi ở đây nhưng vẫn chưa nhận được câu trả lời.

CẬP NHẬT : Sau khi trò chuyện với Mark Murphy, anh ấy gợi ý rằng tôi nên quay lại START_REDELIVER_INTENTtrong cuộc onStartCommand()gọi lại trong dịch vụ của mình thay vì START_STICKYđể toàn bộ ý định được gửi sau khi khởi động lại.

Tôi đã không làm điều này ban đầu vì tôi lo ngại rằng nếu dịch vụ đang cố gắng thực hiện điều gì đó, sau đó dịch vụ được khởi động lại giữa chừng ... nó có nhận ra rằng nó đã bắt đầu làm điều gì đó không? Tôi đoán đó là logic mà tôi sẽ cần phải chịu trách nhiệm :)


16
Thay vì chỉnh sửa câu hỏi của bạn với câu trả lời, vui lòng thêm câu trả lời và chấp nhận nó để câu hỏi của bạn sẽ ngừng hiển thị trong tập hợp các câu hỏi chưa được trả lời - cảm ơn.
Dale Wilson

2
Chỉ là một lưu ý cho những người có vấn đề tương tự. Tôi thấy rằng thường khi tôi nhận được lỗi đó intentnulltrên onStartCommand(), nó được gây ra bởi một số lỗi khác mà có thể nhìn thấy trong LogCat trước này. Tôi không biết tại sao, nhưng đây là những gì tôi quan sát được và khá dễ dàng để bỏ qua nó.
Piotr Chojnacki

2
@DaleWilson Tôi sẽ nhưng câu hỏi này không thực sự được giải quyết. Cho đến khi tôi nhận được câu trả lời dứt khoát về lý do tại sao Ý định trống hoặc cách tránh ý định vô hiệu mà không cần sử dụng START_REDELIVER_INTENT (mà sau này tôi biết được, không phải là thứ tôi cần nhưng vẫn sẽ giải quyết được vấn đề của một số người, do đó tôi đã rời khỏi bản chỉnh sửa của mình) Tôi không thể chấp nhận một câu trả lời.
rf43

@Mosquito Bạn có tình cờ nhận thấy điều gì, cụ thể là đang gặp lỗi không?
rf43

1
@DDoSAttack Không thực sự quan trọng. Trong trường hợp của tôi, đó là ví dụ NullPointerExceptionở đâu đó trong một trong các Hoạt động. Sau đó là một số lỗi khác. Tuy nhiên, trong cả hai trường hợp vết đống của tôi cho thấy dịch vụ của tôi - được chạy trong khi lỗi này xảy ra - có intentđó là nullnhư trong trường hợp của bạn. Tôi đã suy nghĩ khá lâu có gì không ổn, khi tôi quyết định cuộn lên dấu vết ngăn xếp và có vẻ như ở đâu đó trên cùng tôi đã mắc lỗi thực sự. Sau khi giải quyết xong cái này, cái này cũng null intentbiến mất.
Piotr Chojnacki

Câu trả lời:


50

Tôi ngạc nhiên là không có cuộc thảo luận nào về các lá cờ đến. Tôi sẽ theo dõi điều này trong nhật ký với những điều sau:

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

Cập nhật: Cờ là 0 nên không có gì có thể hành động ở đó. Tôi đã để trống kiểm tra ở đó mà không bị mất chức năng.

Chỉnh sửa: Ok, tôi đã tìm thấy nó trong tài liệu về START_STICKY của tất cả các nơi! "nếu không có bất kỳ lệnh bắt đầu nào đang chờ xử lý được gửi đến dịch vụ, nó sẽ được gọi với một đối tượng không có ý định, vì vậy bạn phải cẩn thận để kiểm tra điều này."

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


6
trong Kotlin, mục đích được đánh dấu là không rỗng, và nó bị treo ứng dụngoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi

@MuhammadNaderi bạn chỉ cần có ý định Intent?. Đã làm cho tôi. Nhưng tất nhiên sau đó bạn cần xử lý chính xác ý định null.
Patrick Boos

@PatrickBoos But then of course you need to correctly handle null intent; Ý anh là gì?! Làm sao? Cảm ơn.
Dr.jacky

Ý tôi là chỉ trong mã của bạn làm cho onStartCommand(intent: Intent?, ...)nó hoạt động. Và sau đó chỉ cần không làm intent!!nhưng kiểm tra chính xác xem ý định có rỗng hay không.
Patrick Boos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.