2012-07-30 58 views
14

Có vẻ như nếu một hoạt động ở phía trước trong khi màn hình của điện thoại bị khóa, các sự kiện phát sóng và/hoặc wakelocks sẽ kích hoạt onResume của hoạt động đó, cho dù chúng được dự định cho ứng dụng của bạn hay không. Điều này xảy ra ngay cả khi bạn không tương tác với điện thoại theo bất kỳ cách nào. Không mở khóa, không chạm vào nó, không làm bất cứ điều gì, và onResume của bạn sẽ được gọi là hơn và hơn mà không có một onPause tương ứng.onResume được gọi liên tục trong khi màn hình điện thoại bị khóa

Chúng tôi nhận thấy điều này vì chúng tôi ghi lại sự kiện theo dõi trênResume và chúng tôi nhận thấy rằng một số thiết bị đã nhận được TÔN của các sự kiện onResume này. Chúng tôi đã có thể repro và nhận thấy rằng nó đã xảy ra mỗi khi bất kỳ ứng dụng dường như nhận được một ý định (như SugarSync, Google Voice, hoặc người nghe vị trí thụ động trong ứng dụng riêng của chúng tôi).

Chúng tôi nhận thấy điều này trên Galaxy Nexus và Galaxy S3 đang chạy ICS. Thú vị cần lưu ý, chúng tôi không thể tạo lại vấn đề trên Jelly Bean.

Bất kỳ ai cũng có bất kỳ gợi ý nào về những gì có thể xảy ra ở đây?

+1

Tương tự tại đây. Galaxy Tab ICS. –

+2

Yup, Nexus 5 chạy 4.4.4 gọi 'onResume()' cứ 200ms khi màn hình tắt. –

Trả lời

16

Tôi đã quan sát hành vi tương tự trên một số điện thoại chạy Gingerbread và ICS. Mô tả của bạn khớp với những gì tôi đã thấy. Vì một số lý do, hoạt động có kích hoạt onResume, mặc dù màn hình vẫn bị khóa. Có lẽ hồ sơ của nó làm gì với một số sự kiện cấp hệ điều hành?

Hướng tốt nhất từ ​​các tài liệu android có vẻ là từ đoạn này trong onResume định nghĩa:

Hãy ghi nhớ rằng onResume không phải là chỉ số tốt nhất mà hoạt động của bạn được hiển thị cho người sử dụng; một cửa sổ hệ thống chẳng hạn như bàn phím có thể ở phía trước. Sử dụng onWindowFocusChanged (boolean) để biết chắc chắn rằng hoạt động của bạn hiển thị cho người dùng (ví dụ, để tiếp tục trò chơi).

Khi phát triển Hoạt động của bạn, hãy nhớ rằng onResume có thể được gọi nhiều lần liên tiếp, mà không có bất kỳ tương tác trực tiếp nào của người dùng. Vì vậy, về cơ bản, không đặt bất kỳ mã nào trong onResume chỉ có thể chạy một lần hoặc được thiết kế để kích hoạt phản hồi ngay lập tức từ người dùng. Bạn phải tự quyết định xem liệu onResume hoặc onWindowFocusChanged có hoạt động tốt hơn cho những gì bạn muốn làm hay không.

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