2012-07-15 35 views
13

Tôi có thể dựa vào tuyên bố của ứng dụng Context không thay đổi trong suốt vòng đời của ứng dụng không? Điều gì sẽ xảy ra nếu tôi lưu trữ một số context ở đâu đó bằng mẫu đơn và sau đó sử dụng bất cứ nơi nào tôi cần?Có thể thay đổi bối cảnh ứng dụng trong suốt vòng đời của ứng dụng không?

+0

Có thể điều này có thể hữu ích: http://stackoverflow.com/questions/708012/android-how-to-declare- global-variables/4642069 # 4642069 –

+1

Tại sao bạn cần lưu trữ ngữ cảnh? Bạn luôn có thể nhận được nó bằng cách gọi getApplicationContext() – Yury

+0

@Yury: Không phải từ lớp Không hoạt động hoặc Ứng dụng. –

Trả lời

14

Để trả lời câu hỏi thứ hai của bạn đầu tiên: Nếu bạn cần lưu trữ một số trạng thái trong một singleton, sau đó bạn có thể sử dụng lớp Android Application và bạn Application trở thành singleton của bạn (nó cũng là một Context). Sẽ không cần phải lưu trữ nó.

Để câu hỏi đầu tiên, về việc liệu Context có thể được thay đổi trong thời gian chạy: loại liên quan đến your other question, tôi nghĩ rằng chúng ta có thể con số đó ra bằng cách nhìn vào ContextWrapper.attachBaseContext:

protected void attachBaseContext(Context base) { 
    if (mBase != null) { 
     throw new IllegalStateException("Base context already set"); 
    } 
    mBase = base; 
} 

Vì vậy, có, bạn có thể dựa vào nó; nó không thể thay đổi, và nếu bạn thử, nó sẽ ném một IllegalStateException.

+0

Điều gì sẽ xảy ra nếu ứng dụng sẽ bị giết vì một số lý do? – Eugene

+0

Nếu ứng dụng bị giết, bạn không thể làm gì vì nó cũng bị giết. Bạn có cần phải duy trì dữ liệu trên ứng dụng đang bị dừng và khởi động lại không? Bạn muốn sử dụng Tùy chọn được chia sẻ cho điều đó. –

0

Trong lớp ứng dụng là một lớp cấp ứng dụng đơn cho ứng dụng android. Câu trả lời của tôi là không, bạn không thể thay đổi đối tượng ngữ cảnh ứng dụng.

1

Có một số tranh cãi xung quanh chủ đề này. Ngay cả một số người trong số những người từ Google. Tôi giữ cho tôi tin rằng đó là cách tiếp cận đúng đắn về cơ bản cố gắng để có được bối cảnh hoạt động nhiều lần nhất có thể. Lý do là, quan điểm của bối cảnh là cung cấp một số tài nguyên/phần của ứng dụng của bạn môi trường mà từ đó đang làm việc. Thông tin bạn cung cấp cho hệ thống chính xác hơn, hành vi ít xảy ra bất ngờ hơn (ví dụ: Bạn chỉ có quyền truy cập vào một số tài nguyên trong phạm vi ngữ cảnh hoạt động và cách vòng từ ngữ cảnh ứng dụng.

Hãy nhớ rằng hoạt động là một bối cảnh, để thông qua "điều này" sẽ làm cho công việc nếu bạn đang ở trong một hoạt động, hoặc "getActivity()" nếu mã của bạn hoạt động từ bên trong một đoạn. Nó khá hữu ích khi sử dụng lớp Ứng dụng của riêng bạn như là một Singleton, vì bạn có thể dễ dàng quản lý vòng đời của ứng dụng và sử dụng nó như là một điểm trung bình thích hợp Một lần nữa, để có được appContext nó đủ để gọi getApplicationContext hoặc thậm chí ví dụ về lớp đơn ứng dụng của bạn.

1

Có, bạn có thể dựa vào ngữ cảnh đó không thay đổi trong suốt vòng đời của ứng dụng!

Google nói như vậy trong tổng quan về lớp học Application.

Tôi nghĩ nó sẽ hoàn hảo cho trường hợp của bạn.

1

Ứng dụng là một singleton và tôi không biết cách nào để bỏ qua điều đó mà không thay đổi lõi.

Tuy nhiên, có khả năng xảy ra 2 trường hợp đối tượng Ứng dụng nếu mã của bạn bắt đầu quá trình khác. Một ví dụ sẽ bắt đầu một dịch vụ từ xa; điều này sẽ tạo ra một tiến trình khác, nó sẽ tạo ra cá thể riêng của nó đối tượng ứng dụng.

http://developer.android.com/reference/android/app/Service.html#RemoteMessengerServiceSample

Để tránh nhầm lẫn, bạn phải giao tiếp giữa các dịch vụ từ xa và phần còn lại của ứng dụng bằng một trong những tùy chọn android Parcelable hoặc Serializable:

nhắn - Handler Bundle Ý định Ý định putExtra

hoặc tạo một trong số

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