2015-11-17 17 views
15

Ai đó có thể xác nhận những điều sau đây liên quan đến vòng đời ứng dụng Android không?Làm rõ vòng đời của ứng dụng Android

1) Khi ứng dụng ở phía trước bộ nhớ sẽ chứa thể hiện của đối tượng Application, các cá thể của tất cả các hoạt động (không bị giết) và tất cả các tham chiếu đối tượng được tham chiếu từ một trong các gốc (chưa được thu thập rác)

2) Khi ứng dụng chuyển sang nền, tại một thời điểm nào đó, Khung công tác Android có thể: a) Giết toàn bộ quá trình cho mục đích của ứng dụng sẽ xóa tất cả các đối tượng khỏi bộ nhớ b) Giết CHỈ (vì vậy cần thiết không có tham chiếu đối tượng khác sẽ bị xóa) các hoạt động (bằng cách hoàn thành chúng và trong bản chất bất kỳ mảnh) cũng tiết kiệm trạng thái của chúng và tạo Stack hoạt động và để lại bất cứ điều gì khác (Application objec t, bất kỳ đối tượng tĩnh nào khác, tham chiếu có thể truy cập từ bất kỳ gốc nào).

Tôi chủ yếu quan tâm đến 2b, nhưng tôi sẽ đánh giá cao xác nhận về tất cả các điểm này vì tôi đang cố gắng nắm bắt toàn bộ khái niệm từ đầu đến cuối.

+0

Nếu bạn hỏi câu lệnh trong 2a & 2b có chính xác hay không.Đối với 2b, hệ điều hành chỉ có thể gọi các phương thức vòng đời thích hợp và vô hiệu hóa các tham chiếu của nó đến các Hoạt động mà nó muốn được giải phóng, và để cho bộ thu gom rác làm việc của nó. Tuy nhiên, nếu một phần khác của quá trình (tức là chương trình người dùng) vẫn giữ tham chiếu đến các đối tượng này thì không có gì sẽ được GC và quá trình có thể bị giết để giải phóng bộ nhớ cần thiết. – Kai

+0

Cảm ơn bạn đã nhập. Bạn có thể đọc nó ở đâu đó trong kênh chính thức hoặc nó dựa trên expierience nhà phát triển cá nhân của bạn? – Lucas

+0

đó là cách Java hoạt động, Activites chỉ là các đối tượng Java chuẩn, và máy ảo không giải quyết một đối tượng trong khi nó vẫn đang được sử dụng. Đây là lý do tại sao Drawables không nên được lưu trữ (nó có tham chiếu đến bối cảnh chủ sở hữu/Hoạt động) và tại sao có một kiểm tra lint để đảm bảo lớp con Handler là một lớp tĩnh (để ngăn chặn tất cả các hoạt động quá dễ bị rò rỉ) – Kai

Trả lời

0

Ok, trong nhiệm vụ tìm kiếm của tôi trong những tuần gần đây tôi đã có thể để có được một số thông tin và bây giờ tôi có thể trả lời câu hỏi của riêng tôi (và hy vọng cho những người khác):

1) Đúng

2a) Đúng

2b) Sai. Các khung android, nếu cần bộ nhớ hoặc nếu do một số lý do khác nó phải "giết/giảm" các ứng dụng nó có thể làm như vậy chỉ bằng cách giết chết toàn bộ quá trình đó là dành riêng cho ứng dụng đó. Khung android có thể giết chết tất cả các hoạt động nhưng để lại tất cả các đối tượng khác (như đối tượng Application, singletons…)

4

Nếu bạn đang tìm kiếm xác nhận chính thức thì chỉ nên yêu cầu Google :).

nhưng tôi cảm thấy sau khi đọc điều này, bạn sẽ hiểu rõ hơn về khái niệm này.

Android memory management

android process lifecycle

trả lời cho câu hỏi 1: có xác nhận sử dụng DDMS.

câu trả lời cho câu hỏi 2a: có hệ điều hành có thể giết bất kỳ thời điểm nào khi cần bộ nhớ cho quá trình khác sẽ dẫn đến giết chết tất cả đối tượng liên quan đến quy trình.

câu trả lời cho 2b questiong:

Từ tài liệu chính thức

Process Vòng đời 3. Một hoạt động nền (một hoạt động mà không được hiển thị cho người sử dụng và đã được tạm dừng) không còn quan trọng, vì vậy hệ thống một cách an toàn có thể giết chết quá trình của nó để đòi lại bộ nhớ cho các quy trình tiền cảnh hoặc hiển thị khác. Nếu quá trình của nó cần phải bị giết, khi người dùng điều hướng trở lại hoạt động (làm cho nó hiển thị trên màn hình một lần nữa), phương thức onCreate (Bundle) của nó sẽ được gọi với savedInstanceState mà nó đã cung cấp trước đó trong onSaveInstanceState (Bundle) để nó có thể tự khởi động lại trong cùng trạng thái khi người dùng cuối cùng còn lại nó.

+0

Cảm ơn bạn đã liên kết! Đó là một cái nhìn tổng quan tốt đẹp, nhưng vấn đề là nó không thực sự trả lời cho 2b như câu hỏi của tôi đã được hỏi về các hoạt động một mình (và không phải toàn bộ quá trình). ps. Cảm ơn các anser đến các điểm khác. – Lucas

+0

Mặc dù tôi không nhận được câu trả lời chính xác cho câu hỏi 2b của tôi (điều này là hệ thống sẽ không giết chết các hoạt động có chọn lọc như đã giải thích bởi Dianne Hackborn, nhưng sẽ giết tất cả hoặc không), bất kỳ ai khác, tôi phải công bằng và vì câu trả lời của bạn là hữu ích nhất đối với tôi, tiền thưởng sẽ đến với bạn. Cảm ơn. – Lucas

+0

cảm ơn Lucas vì tiền thưởng – CodingRat

4

Có bạn chủ yếu là chính xác về 2b).

Nếu một hoạt động bị tạm dừng hoặc dừng lại, hệ thống có thể thả các hoạt động từ bộ nhớ bằng cách hoặc là yêu cầu nó để kết thúc, hoặc đơn giản là giết chết quá trình của nó.

Tuy nhiên có những trường hợp mà onSaveInstantSate không được gọi:

Lưu ý rằng điều quan trọng là để lưu dữ liệu liên tục trong onPause() thay vì của onSaveInstanceState (Bundle) vì sau này không phải là một phần của các cuộc gọi lại vòng đời , do đó sẽ không được gọi trong mọi tình huống như được mô tả trong tài liệu của nó.

Android Docs Source

Bạn có thể yêu cầu android luôn luôn phá hủy các hoạt động trên nền bằng cách cho phép tùy chọn nhà phát triển tiếp theo. Nếu bạn đang gỡ lỗi ứng dụng của bạn, bạn sẽ có thể bước qua các phương pháp vòng đời và xem những gì đang xảy ra.

Cài đặt -> Tùy chọn nhà phát triển -> Ứng dụng -> Không giữ hoạt động

4

Không có chu kỳ sống điển hình cho ứng dụng. Đối tượng ứng dụng tồn tại trong bộ nhớ cho đến khi nó không bị giết bởi chính Android hoặc bằng tay bởi người dùng.

Đối với các điểm trên, dưới đây là câu trả lời của bạn:

1) Điều này đúng.

2) a) Điều đó cũng đúng. 2) b) Khi ứng dụng chạy nền, bạn chỉ có thể lưu dữ liệu của hoạt động hiện tại ở nền trước. Ngoài ra, khi bạn tự xóa ứng dụng (bằng cách xóa nó khỏi danh sách gần đây), tất cả các hoạt động trong ngăn xếp ứng dụng và dữ liệu đã lưu của chúng (không phải dữ liệu liên tục) đã bị giết vì ứng dụng là cơ sở cho tất cả các hoạt động.

4

1) Khi ứng dụng trong foreground bộ nhớ sẽ chứa dụ của đối tượng ứng dụng, trường hợp của tất cả các hoạt động (không giết) và tất cả các tài liệu tham khảo đối tượng được tham chiếu từ một trong những gốc rễ của (chưa được thu gom rác)

> There will only ever be a few such processes in the system, and these 
> will only be killed as a last resort if memory is so low that not even 
> these processes can continue to run. Generally, at this point, the 
> device has reached a memory paging state, so this action is required 
> in order to keep the user interface responsive. 

2) Khi ứng dụng đi vào nền, tại một số thời điểm Android Framework có thể:

.

a) Giết toàn bộ quá trình trao cho các mục đích của ứng dụng mà essentialy sẽ xóa tất cả các đối tượng từ bộ nhớ

> These processes have no direct impact on the user experience. Provided 
> they implement their Activity life-cycle correctly (see Activity for 
> more details), the system can kill such processes at any time to 
> reclaim memory for one of the three previous processes types. Usually 
> there are many of these processes running, so they are kept in an LRU 
> list to ensure the process that was most recently seen by the user is 
> the last to be killed when running low on memory. 

b) Kill CHỈ (vì vậy cần thiết không có tham chiếu đối tượng khác sẽ bị xóa) các hoạt động (bằng cách hoàn thành chúng và về bản chất bất kỳ mảnh nào là cũng) người thừa kế và tạo ngăn xếp hoạt động và để lại bất kỳ thứ gì khác (đối tượng ứng dụng, bất kỳ đối tượng tĩnh nào khác, tham chiếu có thể truy cập từ bất kỳ gốc nào).

một phần như trong lời giải thích điểm 2.a. của

> Usually there are many of these processes running, so they are kept in an LRU 
> list to ensure the process that was most recently seen by the user is 
> the last to be killed when running low on memory. 

Source - developer.android.com

0

Vâng điều này phụ thuộc vào cách hệ điều hành Android hoạt động. Thiết bị Android là một Hệ thống được nhúng nhưng hoạt động gần giống như PC và khi tôi nói Android là một hệ điều hành, nó chắc chắn sẽ có tất cả các tính năng của một hệ điều hành. Điều mà bạn đang chỉ đến là tính năng Quản lý và Lập lịch bộ nhớ của hệ điều hành Android. MMU (Bộ phận quản lý bộ nhớ) một cách hợp lý ưu tiên cho tác vụ hiện đang thực thi, tức là trình khởi chạy ur hoặc bất kỳ Ứng dụng nào khác mà bạn đang làm việc. Hai điều tôi muốn trả lời có thể giúp bạn nhiều hơn một chút:

  1. Chế độ xem (cho dù xml được tạo hoặc tạo Javacode, chúng được tạo động).
  2. Hệ điều hành Android chạy tất cả các ứng dụng dưới dạng quá trình với các quy trình phụ (Hoạt động) trên Máy ảo Dalvik.
  3. Tất cả các hoạt động của bạn trước khi chúng được tạo ra là rỗng, khi chúng được tạo sau đó cá thể của chúng được tạo ra. Sau khi mở chúng một lần nữa dụ đã lưu của họ là một lần nữa viewd (Khái niệm về mẫu thiết kế Singleton).

Vì vậy, hãy để tôi cho bạn biết rằng tôi không nghĩ rằng cả hai tùy chọn đều đúng. Điều tôi tin là: 1. Chế độ xem sẽ luôn được tạo động. 2. Ví dụ sẽ được lưu trong Bộ nhớ. 3. Trên nền đi của ứng dụng toàn bộ quá trình với các trường hợp có sẵn sẽ được của họ trong bộ nhớ.

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