2011-03-22 37 views
9

Tôi gặp sự cố khi khởi động lại dịch vụ Android. Tôi đang xây dựng dựa trên API phiên bản 7 và chạy trên thiết bị chạy Android 2.3.3.Không gọi đến onStartCommand() sau khi khởi động lại dịch vụ bị lỗi trong Android 2.3

Vấn đề là, khi dịch vụ của tôi bị hệ thống giết và sau đó được khởi động lại, chỉ có onCreate() dịch vụ của tôi được gọi. mã số trong onStartCommand() không được thực hiện. Nếu tôi bắt đầu ứng dụng của mình lần đầu tiên, mã trong onStartCommand() thường được thực thi và tất cả đều hoạt động tốt, cho đến khi hệ thống giết dịch vụ của tôi, khi đó dịch vụ sẽ không khởi động lại chính xác.

Documentation says that onStartCommand() is always called when a service is restarted. Trong trường hợp khởi động lại dịch vụ, onStartCommand() phải được gọi với mục đích không có. Đây không phải là trường hợp của tôi.

Bất kỳ ý tưởng nào tại sao điều này có thể xảy ra?

Trả lời

11

Bạn có thể gặp lỗi trong Gingerbread. Đã có một chuỗi trong nhóm nhà phát triển android về nó: onStartCommand bug thread

Xem bài đăng số 26 của Dianne Hackborn để biết chi tiết.

+1

cảm ơn bạn. vì vậy tôi phải lặp lại mã khởi tạo trong onCreate và trong onCommandStart, bởi vì nó là một widget ... – shelll

+0

Có thể nào đây vẫn là lỗi trong 4.2.2? – powder366

+0

Nó phải được sửa trong 4.2.2 theo bộ theo dõi vấn đề (https://code.google.com/p/android/issues/detail?id=12117&can=1&q=onstartcommand&colspec=ID%20Type%20Status%20Owner%20Summary % 20Stars) –

2

Đây là một lỗi trong Android 2.3 (cấp API 9), mà đã cố định ở mức API 10

Từ Dianne Hackborns post regarding this issue:

Được rồi, điều này đã thực sự phá vỡ trong 3.3. [sic!] Thay đổi là từ tháng 8 năm năm ngoái. Đây là sự thay đổi đó đã phá vỡ nó:
https://android.googlesource.com/platform/frameworks/base/+/5474b0f8603ee66413c3e44600ca46f162f3089e

Lưu ý rằng git commit liên kết trước đó đã không làm việc. Click here for a working mirror link to the commit and line that is causing the bug.

Ngoài ra, cô ấy có nghĩa là 2,3, nhưng đã viết 3,3. She later corrected it and provided a suggestion for a workaround:

Rất tiếc, có nghĩa là 2.3.

Điều này đã được đưa ra trong cơ sở mã kể từ khi mã GB được phát hành, do đó, sẽ có ai biết thiết bị nào đi kèm với nó.

Vấn đề là không rằng các dịch vụ không được khởi động lại, chỉ là onStartCommand của họ() không được gọi với null lúc bấy giờ. Phương thức on2reat16() của phương thức vẫn được gọi. Là một công việc xung quanh, bạn có thể có thể chỉ cần đăng một tin nhắn trong onCreate() và đặt cờ trong onStartCommand(); nếu bạn chưa nhận được thông báo onStartCommand() vào thời điểm thì thông báo được xử lý, thì có thể bạn sẽ không nhận được cuộc gọi Intent rỗng. (Nếu bạn cần phải làm điều này ở tất cả ... nói chung cho những việc như đăng ký nhận, bạn thực sự thực sự muốn làm này trong onCreate(), vì phương pháp mà chỉ được gọi một lần.)

also wrote hành vi này sẽ được sửa trong bản cập nhật nền tảng tiếp theo (sau-3.0):

Tôi sẽ sửa lỗi này trong bản cập nhật nền tảng tiếp theo (sau Android 3.0); không may mã này đã được xuất hiện trong cây nguồn trong một thời gian, và trong một vài bản phát hành ngay bây giờ, vì vậy chúng tôi cần phải sống với hành vi bị hỏng trên các phiên bản đó. Dịch vụ sẽ vẫn có onCreate() được gọi để bạn có thể làm việc ở đó.

tôi giả sử mức API cô có nghĩa là 10, và tôi có thể xác nhận rằng onStartCommand() được gọi với ý đồ rỗng sau khi khởi động lại dịch vụ khi bạn chuyển từ mức API 9 đến 10

+0

Tôi đã quan sát thấy rằng điều này cũng có thể tái tạo ở cấp API 10 (2.3.6). Tuy nhiên, không thể tái sản xuất ở cấp API 14. – Pawan

Các vấn đề liên quan