Xin chào, tôi đang tự hỏi cách Android quản lý bộ nhớ và tôi không thể tìm thấy câu trả lời chính xác ở bất kỳ đâu. Giả sử tôi có một ứng dụng có 5 hoạt động trên ngăn xếp hoạt động hiện tại (4 bị dừng và 1 được tiếp tục lại), không có dịch vụ nào được kết nối. Tôi nhấn nút HOME để tất cả các hoạt động của tôi bị dừng lại. Tôi bắt đầu một số ứng dụng tiêu tốn bộ nhớ khác và bộ nhớ thiết bị tổng thể đang bắt đầu thấp. Và câu hỏi là
... Điều gì sẽ xảy ra với ứng dụng của tôi?
- Hệ thống có thể chỉ phá hủy một hoặc một số hoạt động của tôi để khôi phục bộ nhớ không?
- Hệ thống có giết toàn bộ quá trình ứng dụng của tôi không? Tất cả các hoạt động sẽ bị phá hủy một cách độc đáo?
- Điều gì sẽ xảy ra khi tôi quay lại ứng dụng của mình khi nó đã hoàn toàn bị hủy? Nó sẽ bắt đầu từ việc ăn xin (như lần bắt đầu đầu tiên) hay nó sẽ cố gắng khôi phục các hoạt động về trạng thái trước đó / nếu có - nó chỉ là hoạt động ở trên cùng của ngăn xếp hay tất cả chúng?
CẬP NHẬT:
Trước khi hỏi câu hỏi này, tôi đã xem Vòng đời hoạt động một vài lần nhưng nó không có câu trả lời cho câu hỏi của tôi. Tôi đã thực hiện một số bài kiểm tra và tôi có một số câu trả lời. "Quá trình dừng" trong DDMS là một manh mối để kiểm tra.
Tôi chưa kiểm tra câu trả lời cho câu hỏi 1, nhưng như hướng dẫn cho biết:
Nếu một hoạt động bị tạm dừng hoặc dừng, hệ thống có thể loại bỏ hoạt động đó khỏi bộ nhớ bằng cách yêu cầu nó kết thúc hoặc đơn giản là giết quá trình của nó.
Có vẻ như một hoặc nhiều hoạt động có thể bị phá hủy nhẹ nhàng (với phương pháp onDestroy) mà không giết chết quá trình. Bạn sẽ chỉ nhận được (onCreate + gói) khi quay lại với chúng.
Câu trả lời câu hỏi 2:
ĐÚNG. Nói chung hệ thống giết toàn bộ quá trình, điều này có nghĩa là tất cả dữ liệu bao gồm các hoạt động và trường tĩnh đều bị phá hủy. Điều này KHÔNG được thực hiện tốt - bạn sẽ không nhận được onDestroy hoặc finialize () cho bất kỳ hoạt động bị tạm dừng / dừng nào của mình. Đây là lý do tại sao saveInstanceState () được gọi ngay trước phương thức onPause. onPause về cơ bản là phương pháp cuối cùng mà bạn nên lưu một cái gì đó vì sau phương pháp này, bạn sẽ không bao giờ thấy onStop hoặc onDestroy. Hệ thống chỉ có thể giết quá trình phá hủy tất cả các đối tượng của bạn bất cứ thứ gì chúng giữ và bất cứ điều gì chúng đang làm.
Câu trả lời câu hỏi 3:
Điều gì sẽ xảy ra khi bạn quay lại một ứng dụng đã bị hủy?
- Trước Android 2.2 - ứng dụng sẽ bắt đầu từ khi bắt đầu, với hoạt động của trình khởi chạy.
- Bắt đầu từ 2.2 - hệ thống sẽ khôi phục trạng thái ứng dụng trước đó. Nó có nghĩa là gì? Có nghĩa là hoạt động hiển thị gần đây nhất sẽ được tạo lại (onCreate + gói). Điều gì sẽ xảy ra với ngăn xếp hoạt động? Stack vẫn ổn nhưng mọi hoạt động trên đó đã chết. Mỗi người trong số họ sẽ được tạo lại (onCreate + gói) khi bạn quay lại nó bằng nút quay lại. Còn một điều nữa về điều đó:
Thông thường, hệ thống sẽ xóa một tác vụ (xóa tất cả các hoạt động khỏi ngăn xếp phía trên hoạt động gốc) trong một số tình huống nhất định khi người dùng chọn lại tác vụ đó từ màn hình chính. Thông thường, điều này được thực hiện nếu người dùng không truy cập tác vụ trong một khoảng thời gian nhất định, chẳng hạn như 30 phút.
Phần kết luận?
- Đừng nghĩ rằng việc xử lý các vấn đề xoay vòng hoạt động có thể được giải quyết bằng android: configChanges = "direction". Khi bạn làm điều đó, bạn sẽ gặp phải nhiều vấn đề khác mà bạn thậm chí không nhận thức được.
- Kiểm tra ứng dụng của bạn với DDMS - Nút dừng quá trình. Xem này
- Hãy cẩn thận khi sử dụng các biến tĩnh. Đừng nghĩ rằng khi bạn khởi tạo chúng trong hoạt động 1 - bạn sẽ khởi tạo chúng trong hoạt động 2. Nơi an toàn duy nhất để khởi tạo tĩnh toàn cục sẽ là lớp Ứng dụng.
- Hãy nhớ rằng bạn có thể không bao giờ thấy onStop hoặc onDestroy. Đóng tệp / cơ sở dữ liệu, dừng trình tải xuống trong Tạm dừng. Khi bạn muốn ứng dụng làm điều gì đó trong BG - hãy sử dụng Dịch vụ nền trước.
Đó sẽ là nó ... Hy vọng tôi đã giúp với bài luận của tôi :)