2011-12-07 5 views
77

Có lý do nào khác mà Intent được chuyển đến onStartCommand(Intent, int, int) sẽ là NULL bên cạnh hệ thống khởi động lại dịch vụ thông qua cờ chẳng hạn như START_STICKY?Lý do mà Mục đích đã qua sẽ là NULL trong onStartCommand

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

Tôi đã hỏi here quá nhưng chưa nhận được câu trả lời.

CẬP NHẬT: Sau khi trò chuyện với Mark Murphy, ông đề nghị tôi trở START_REDELIVER_INTENT trong onStartCommand() gọi lại phục vụ của tôi thay vì START_STICKY để toàn bộ ý định sẽ được gửi sau khi khởi động lại. Tôi đã không làm điều này ban đầu bởi vì tôi lo ngại rằng nếu dịch vụ đang cố gắng làm điều gì đó, thì ở giữa đó một cái gì đó dịch vụ đã được khởi động lại ... liệu nó có nhận ra rằng nó bắt đầu làm điều gì đó? Tôi đoán đó là logic tôi sẽ cần phải chịu trách nhiệm cho :)

+12

Thay vì chỉnh sửa câu hỏi của bạn với câu trả lời, hãy thêm một câu trả lời và chấp nhận nó vì vậy 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 trả lời - nhờ. –

+1

Chỉ cần ghi chú cho người có vấn đề tương tự. Tôi thấy rằng thường khi tôi nhận được lỗi rằng 'intent' là' null' trê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 và nó khá dễ dàng để bỏ qua nó. –

+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 cuối cùng về lý do tại sao Intent là null hoặc cách tránh mục đích rỗng mà không phải sử dụng START_REDELIVER_INTENT (mà sau này tôi đã học được, không phải là những gì tôi cần nhưng vẫn giải quyết được một số vấn đề của mọi người. Tôi không thể chấp nhận câu trả lời. – rf43

Trả lời

37

Tôi ngạc nhiên không có thảo luận về các lá cờ đến. Tôi sẽ theo dõi điều này trong nhật ký với các thông tin 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ể thực hiện được ở đó. Tôi đã để trống việc kiểm tra không có mất chức năng.

Chỉnh sửa: Ok, tôi tìm thấy nó trong tài liệu START_STICKY của tất cả các địa điểm! "nếu không có bất kỳ lệnh bắt đầu nào đang chờ xử lý được gửi tới dịch vụ, nó sẽ được gọi với một đối tượng có mục đích rỗng, 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

+1

Kiểm tra giá trị rỗng. –