2009-12-22 37 views
88

Tôi đang tạo ứng dụng tìm kiếm sự kiện, chúng tôi đặt tiêu chí tìm kiếm từ một màn hình trong một màn hình khác, sau đó người dùng có thể chỉnh sửa tiêu chí tìm kiếm từ màn hình thứ 3 và chuyển sang màn hình thứ 4.Vòng đời đối tượng tĩnh của Android

Để đạt được công việc trên, tôi đang sử dụng đối tượng tĩnh nhớ các giá trị xung quanh ứng dụng và tôi không cần thực hiện thêm bất kỳ điều gì.

Nhưng tôi sợ nếu về vòng đời đối tượng tĩnh trong android nếu bộ nhớ thấp tìm thấy android xóa các đối tượng tĩnh ???

Vì Android hỗ trợ đa tác vụ, nếu người dùng chuyển sang ứng dụng khác và khi người dùng quay trở lại ứng dụng bắt đầu hành động điên, đối tượng tĩnh có bị xóa khi có nhiều tác vụ không ??? bất kỳ ý tưởng ?? và cũng đề nghị giữ đối tượng tĩnh thông qua phương pháp singleton là cách tiếp cận tốt hơn?

Trả lời

215

Cho phép bắt đầu với một chút nền: Điều gì sẽ xảy ra khi bạn khởi động ứng dụng?
Hệ điều hành bắt đầu một quá trình và gán cho nó một id tiến trình duy nhất và phân bổ một bảng xử lý. Quá trình bắt đầu một cá thể của DVM (Dalvik VM); Mỗi ứng dụng chạy bên trong một DVM.
Một DVM quản lý lớp bốc dỡ, ví dụ vòng đời, GC, vv

Lifetime của một biến tĩnh: Một biến tĩnh đi vào sự tồn tại khi một lớp được nạp bởi JVM và chết khi lớp được bốc dỡ.

Vì vậy, nếu bạn tạo một ứng dụng Android và khởi tạo một biến tĩnh, nó sẽ ở lại trong JVM cho đến khi một trong những điều sau đây sẽ xảy ra:
1. lớp được bốc dỡ
2. JVM tắt
3. quá trình chết

Lưu ý rằng giá trị của biến tĩnh sẽ vẫn tồn tại khi bạn chuyển sang hoạt động khác của ứng dụng khác và không có trường hợp nào trong số ba biến trên xảy ra. Nếu bất kỳ điều nào trong ba điều trên xảy ra thì tĩnh sẽ mất giá trị của nó.

Bạn có thể kiểm tra điều này với một vài dòng mã:

  1. in các uninitialized tĩnh trong onCreate hoạt động của bạn -> nên in rỗng
  2. khởi tạo tĩnh. in nó -> giá trị sẽ không rỗng
  3. Nhấn nút quay lại và chuyển đến màn hình chính. Lưu ý: Màn hình chính là một hoạt động khác.
  4. Khởi động lại hoạt động của bạn -> biến tĩnh sẽ không rỗng
  5. Giết quy trình đăng ký của bạn từ DDMS (nút dừng trong cửa sổ thiết bị).
  6. Khởi động lại hoạt động của bạn -> giá trị tĩnh sẽ có giá trị null.

Hy vọng điều đó sẽ hữu ích.

+11

Đây là giải thích tuyệt vời và cần được đọc cho bất kỳ nhà phát triển Android nào. –

+1

Tôi muốn biết tại sao tôi mất giá trị trường của mình trong đối tượng ứng dụng nếu nó không tĩnh khi tôi bắt đầu hoạt động mới ví dụ: Tôi khai báo biến trang hiện tại trong đối tượng ứng dụng và giá trị của nó luôn quay về 0 khi mở hoạt động mới –

+0

khi tôi gọi super.onRestoreInstanceState (savedInstanceState); Tôi mất biến của mình ngay cả khi chúng tĩnh, vấn đề là gì? –

14

Vâng, mẫu Singleton cũng dựa trên việc sử dụng các biến tĩnh để bạn có thể ở cùng vị trí. Mặc dù phương pháp tiếp cận tĩnh có thể hoạt động hầu hết các lần, nhưng trong một số trường hợp khi bộ nhớ đầy và một hoạt động khác có tiền cảnh trước khi ứng dụng của bạn chuyển sang màn hình tiếp theo, quá trình hoạt động của bạn có thể bị giết và bạn mất các giá trị tĩnh. Tuy nhiên Android cung cấp một vài lựa chọn của sự bền bỉ giá trị giữa các quốc gia hoặc truyền chúng như:

  • sử dụng Intent, bạn có thể vượt qua cùng tiêu chí tìm kiếm của bạn từ hoạt động để hoạt động (tương tự như một http web theo yêu cầu)
  • sử dụng ưu đãi về ứng dụng, bạn có thể tiết kiệm các giá trị và lấy chúng trong các hoạt động mà cần họ
  • sử dụng cơ sở dữ liệu SQLite, bạn có thể kiên trì chúng trong một bảng và lấy chúng sau
  • nếu bạn cần chỉ cần lưu hoạt động nhà nước để khởi động lại, các lĩnh vực được lấp đầy với giá trị trước đó chọn của họ, bạn có thể thực hiện phương pháp onSaveInstanceState() hoạt động - lưu ý rằng đây không phải là được đề xuất cho các hoạt động giữa các trạng thái là .

Bạn có thể lấy một số ví dụ về cách sử dụng tùy chọn, ý định và cơ sở dữ liệu sqlite bằng cách xem aegis-shield source code tree trong mã google hoặc trong các ứng dụng Android mã nguồn mở khác.

3

Sau khi một số nghiên cứu, nó quay ra rằng việc sử dụng ứng dụng để lưu trữ độc thân không phải là những gì tuyệt vời của một ý tưởng, trừ khi bạn đã sẵn sàng để tái tạo nó:

Don't store data in the application object

như vậy trong khi the accepted answer là đúng về mặt kỹ thuật, nó không cung cấp tất cả thông tin.

Khi liên kết ở trên gợi ý, nếu bạn thực sự muốn gắn bó với mô hình đó, bạn cần sẵn sàng kiểm tra và tạo lại dữ liệu nếu có thể.

1

@ r1k0 nằm ngay tại đây. Lưu trữ dữ liệu trong các trường tĩnh của một lớp sẽ không tự tồn tại trên toàn bộ quá trình ứng dụng sẽ giết chết và khởi động lại. Android thường xuyên giết chết các quy trình (chạy các ứng dụng) khi nó cần bộ nhớ.

mỗi doc Android: Activity state and ejection from memory,

Hệ thống này không bao giờ giết một hoạt động trực tiếp. Thay vào đó, nó giết chết quy trình trong đó hoạt động chạy, phá hủy không chỉ hoạt động mà mọi thứ khác cũng đang chạy trong quá trình này.

Bạn có thể lưu và khôi phục trạng thái nguyên thủy cũng như các đối tượng Nối tiếp và Ghim theo các phương pháp bên dưới. Chúng được gọi tự động trong vòng đời hoạt động bình thường.

protected void onSaveInstanceState(Bundle state) {} 
protected void onRestoreInstanceState(Bundle savedInstanceState){} 

Vì vậy, nếu bạn có một lớp học mà chỉ có các biến tĩnh, bạn có thể lưu trạng thái của từng lĩnh vực trong onSaveInstanceState() và khôi phục chúng trong onRestoreInstanceState(). Khi Android giết chết quá trình mà ứng dụng của bạn đang chạy, trạng thái biến của bạn sẽ được lưu và khi Android khôi phục ứng dụng của bạn, các giá trị sẽ được khôi phục trong bộ nhớ trong cùng trạng thái như trước đây.

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