2013-07-06 34 views
8

Nếu một hoạt động đang được hiển thị trên màn hình và có nút có trình nghe nhấp được đính kèm, nút được gắn vào nút trong phương thức onCreate và sau đó thiết bị sẽ chuyển sang chế độ ngủ chế độ (hoặc người dùng chạm vào nút nguồn để tắt màn hình), khi màn hình trở lại hoạt động vẫn hiển thị như trước khi chuyển sang chế độ ngủ.Vòng đời hoạt động của Android sau khi ra khỏi chế độ ngủ

OnResume được gọi, được ghi nhận là một phần của vòng đời cho một hoạt động. Những gì tôi không hiểu là tại sao onCreate không được gọi lại. Làm cách nào để trình nghe nhấp của nút có thể hoạt động sau khi thoát khỏi chế độ ngủ? Bạn sẽ nghĩ rằng Android đã phá hủy tất cả các tiến trình đang chạy kèm theo hoạt động bao gồm trình nghe nhấp chuột của nút.

+0

cuối cùng những gì bạn muốn! –

+1

Chắc chắn, đó là những gì tôi muốn nhưng câu hỏi của tôi là những gì đang xảy ra. Nếu các trình xử lý và chủ đề không bị phá hủy, tôi chỉ có thể giả định rằng Android (hoặc phần cứng) có khả năng "tạm dừng" trạng thái của tất cả các quy trình (ngoại trừ một người như AlarmManager) và sau đó "bỏ tạm dừng" trạng thái này khi thiết bị đến ra khỏi chế độ ngủ. Tôi cho rằng điều này chỉ có thể là do kiến ​​trúc của thiết bị để tiết kiệm pin. Điều thực sự thú vị là nếu điều này là đúng, tại sao các dịch vụ nền vẫn còn sống khi ra khỏi chế độ ngủ. Họ có thể và làm trong thực tế bị giết trong chế độ ngủ. – AndroidDev

Trả lời

1

Ý của bạn là gì, tại sao không gọi lại số onCreate()?

Câu trả lời đơn giản: hoạt động của bạn không bị hủy khi màn hình tắt, vì vậy không có lý do gì để gọi lại số onCreate().

Khi màn hình của điện thoại tắt, hoạt động gọi lại là onPause() của hoạt động, sau đó là onStop(). Tuy nhiên, chỉ vì nó đạt đến onStop() không có nghĩa là nó sẽ luôn đạt được onDestroy(). Ít nhất là với sự hiểu biết của tôi, HĐH Android cố gắng giữ càng nhiều bộ nhớ của nó càng tốt để các ứng dụng tải lại nhanh hơn, vv (đây là một sự đơn giản hóa thực sự, nhưng tôi tin đó là ý tưởng chung). Điều đó có nghĩa là hoạt động của bạn vẫn tồn tại trong bộ nhớ khi màn hình tắt (ít nhất là lúc đầu). Chỉ khi hệ thống thực sự cần các tài nguyên mà hoạt động của bạn nắm giữ, nó sẽ gọi hoạt động của bạn là onDestroy(). Đó là lý do tại sao trình nghe nhấp nút của bạn vẫn hoạt động khi bạn tắt màn hình. Hoạt động của bạn vẫn tồn tại trong bộ nhớ, điều đó có nghĩa là trình nghe nút của bạn cũng vẫn được đăng ký.

Tôi nghĩ điều quan trọng là chỉ ra rằng chế độ ngủ và tắt màn hình không giống nhau. Khi bạn tắt màn hình, có thể hoặc không thể chuyển sang chế độ ngủ ngay lập tức. Khi màn hình tắt nhưng nó không đi vào chế độ ngủ, CPU vẫn hoạt động và dịch vụ vẫn đang chạy. Khi điện thoại chuyển sang chế độ ngủ, nó sẽ tắt nguồn CPU, về cơ bản là "đóng băng" tất cả các quá trình, và kết quả là tất cả các services cũng vậy. Sử dụng wakelocks ngăn điện thoại chuyển sang chế độ ngủ, đó là lý do tại sao các dịch vụ vẫn chạy trong khi màn hình của điện thoại tắt trong một khoảng thời gian dài. Nếu bạn chưa đọc nó, thì Service reference có một số thông tin khá tốt. Nó cũng thảo luận về vòng đời của nó và cách Android ưu tiên sử dụng bộ nhớ của nó.

+0

Giải thích của bạn không giải thích tại sao các dịch vụ bị giết khi màn hình tắt trong một khoảng thời gian đủ dài. Quên về wakelock vì không có gì liên quan đến giải thích là tại sao quá trình của một hoạt động vẫn còn nguyên vẹn và được phục hồi khi màn hình trở lại. – AndroidDev

+0

Khi thiết bị của bạn cần bộ nhớ, thiết bị có thể giết toàn bộ quá trình của bạn. Điều này bao gồm hoạt động và dịch vụ của bạn. Như đã nói trong câu trả lời này, điều này không đảm bảo xảy ra mọi lúc thiết bị sẽ ngủ. Ngược lại với những gì được nói trong câu trả lời này, onDestroy() có thể không được gọi khi quá trình này bị giết. – AsafK

0

Vòng đời hoạt động của Android cực kỳ phức tạp và thậm chí là Romain Guy states he doesn't understand it fully sau nhiều năm phát triển cốt lõi trên Android. Bạn có thể giả định rằng hệ điều hành Android có thể ảnh hưởng đến vòng đời hoạt động của bạn như thế nào nó có vẻ phù hợp khi nó ở chế độ nền. Các activity lifecycle đại diện cho hành vi thực tế chỉ rất gần, chủ yếu là tôi đã hiểu biết của tôi thông qua kinh nghiệm và đường mòn và lỗi.

Trong trường hợp của bạn nếu bạn gửi hoạt động của bạn ở chế độ nền, nếu Android có RAM, nó có thể lưu giữ hoạt động của bạn trong RAM, vì vậy nó sẽ thông qua onPause và onStop. Bây giờ trạng thái này có thể tồn tại cho đến khi bạn quay trở lại ứng dụng của bạn, sau đó nó sẽ đi qua onStart và onResume, vì tất cả các tham chiếu của bạn/các trường bạn đã tạo onCreate vẫn tồn tại và có thể được "tái sử dụng". Mặt khác, nếu hệ điều hành quyết định nó cần nhiều bộ nhớ hơn, nó có thể phá hủy hoạt động của bạn và sẽ mở để thu gom rác và cũng sẽ trải qua vòng đời onDestroy(). Lần sau khi bạn mở lại ứng dụng của mình, một hoạt động mới sẽ được tạo với trạng thái được lưu trênSaveInstanceState() và toàn bộ vòng đời từ onCreate() sẽ được chạy qua

Với các dịch vụ giống nhau.Dịch vụ thông thường NÊN không được chạy trong thời gian dài, họ cũng nên dừng lại ngay lập tức sau khi chúng được thực hiện. Vì vậy, nếu hệ điều hành tìm thấy một dịch vụ chạy trong thời gian dài ở chế độ nền, nó sẽ thoát khỏi nó để tiết kiệm pin/ram sau một khoảng thời gian nhất định (và có lẽ các thông số khác được đưa vào quyết định này). Mặt khác NẾU bạn cần một dịch vụ chạy dài, bạn cần phải tự giữ một wakelock để sginal hệ điều hành "Tôi cần điều này được thực hiện không có vấn đề gì".

+0

Mọi cập nhật cho liên kết đó đến câu lệnh của Romain phải không? Sẽ là một viên đá quý để đọc, nhưng than ôi, chúng ta không thể! – user3175580

0

Khi bạn nhấn nút nguồn hoặc nút trang chủ, hệ điều hành Android đặt hoạt động hiện tại của bạn lên ngăn xếp, Lý do tại sao onCreate không được gọi lại, nó được tạo đặc biệt để tạo chế độ xem và thực hiện thao tác bộ nhớ một lần như tải xml bố trí vào activity.The hệ thống hoạt động như bạn không cần phải phân bổ kỷ niệm mỗi khi bạn đến trên trang đó thay vì chỉ khi bạn tạo page.onResume được gọi bởi vì bạn đang nối lại cho cùng một hoạt động. Quản lý Memroy rất quan trọng trong Android vì nó là một hệ điều hành di động.

+0

Vui lòng yêu cầu làm rõ thêm nếu bạn cần, hoặc nếu bạn nghĩ câu trả lời này không nhắm đến sự nghi ngờ của bạn. –

+0

Tôi không nghĩ rằng việc nhấn nhà hoặc nhấn nút nguồn sẽ đặt hoạt động hiện tại trên ngăn xếp lại. – for3st

+0

Nếu phương thức onPause được gọi trong khi thực hiện việc này, có nghĩa là DVM là đặt Hoạt động hiện tại ở hậu trường. Có thể liên kết này giải quyết được sự nghi ngờ của bạn, http://stackoverflow.com/questions/5001682/android-memory-management-in-activity-lifecycle xem câu trả lời của Michael liên quan đến vòng đời hoạt động và quản lý bộ nhớ. –

0

câu trả lời ngắn: onCreate() được gọi khi số Activity được tạo. hành vi của thiết bị chuyển sang chế độ ngủ và quay lại được xác định là cuộc gọi onPause()onResume(). thiết bị ngủ sẽ không giết các ứng dụng hoặc hoạt động - nhà nước giữ (gần) như nhau.

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