2012-02-02 41 views
18

Tôi có thể sử dụng ApplicationContext để làm việc với SharedPreferences và bắt đầu, ví dụ: RemoteService?Ngữ cảnh ứng dụng cho SharedPreferences?

Về mặt logic, tôi nghĩ rằng tôi có thể. Có bất kỳ sắc thái nào trong cách tiếp cận như vậy không?

+3

Có gì sai với câu hỏi này? Có quá giả không? – user1074896

+0

Hãy nghĩ rằng không có người nào nhìn thấy câu hỏi có thể đưa ra câu trả lời: ( –

+0

Nhìn vào điều này, nó có thể giúp: http://stackoverflow.com/questions/987072/using-application-context-everywhere –

Trả lời

1

Có, bạn có thể sử dụng getApplicationContext() cho điều đó. Bạn có thể sử dụng getApplicationContext() ở bất kỳ nơi nào bạn sử dụng getBaseContext() hoặc từ khóa this khi ở trong một Hoạt động hoặc Dịch vụ, ngoại trừ các trường hợp rất cụ thể như khi thêm Chế độ xem hoặc Hộp thoại vào giao diện người dùng.

Here là một bài viết tuyệt vời về Nội dung và ngữ cảnh là gì, điều mà tôi chắc chắn khuyên bạn nên thực hiện.

10

Bạn nên sử dụng Activity hoặc ServiceContext, tức là 'this', trừ khi bạn có lý do rõ ràng và mạnh mẽ không. Chỉ sử dụng ApplicationContext nếu bạn rõ ràng cần tham chiếu đến trạng thái toàn cầu của đơn đăng ký của bạn.

Từ phát triển Android docs API trên ContextWrapper'sgetApplicationContext() phương pháp:

này thường chỉ nên được sử dụng nếu bạn cần một bối cảnh có vòng đời là tách rời khỏi bối cảnh hiện nay, đó là gắn liền với cuộc đời của quá trình chứ không phải là thành phần hiện tại.

sử dụng ApplicationContext (...) [như trái ngược với ví dụ một Activity hay Service bối cảnh] có thể dễ dàng dẫn đến rò rỉ nghiêm trọng nếu bạn quên unregister, unbind vv

Ví dụ, để lấy SharedPreferences trong một Activity để ví dụ thay đổi dữ liệu được hiển thị cho người dùng, sử dụng this.getSharedPreferences(...) vì không có lý do rõ ràng tại sao bạn cần phải khai thác vòng đời của ứng dụng. Tương tự, trong một Service, sử dụng this.getSharedPreferences(...). (Lưu ý rằng hoạt động và dịch vụ bối cảnh Họ gián tiếp mở rộng android.content.Context.)

CommonsWare đã viết một sâu câu trả lời: When to call activity context OR application context? nơi ông làm cho các trường hợp đó gọi getApplicationContext() "is almost always wrong" và vạch ra vài trường hợp ngoại lệ khi sử dụng nó :

  • liên kết với Dịch vụ từ hoạt động.
  • điều gì đó cần phải được gắn với một Ngữ cảnh với phạm vi toàn cầu.

CommonsWare cũng liên kết tới một answer bởi Android Khung Engineer Dianne Hackborn:

Nguyên tắc đầu tiên tôi sẽ cung cấp cho bạn: nếu bạn không biết lý do tại sao bạn cần [Application Context], có lẽ bạn don không cần nó (...) Thời gian duy nhất bạn muốn sử dụng getApplicationContext() là khi bạn cần một Context tồn tại bên ngoài vòng đời của lớp Activity (hoặc thành phần khác).

Nhiều câu trả lời về vấn đề tương tự với các cuộc thảo luận về các vấn đề liên quan đến ApplicationContext:

10

như Gunnar Karlsson đề cập sử dụng getApplicationContext() ContextWrapper của nó khá rõ ràng rằng bạn chỉ nên sử dụng Activity hoặc ServiceBối cảnh để đăng ký/hủy đăng ký người nhận, ràng buộc/hủy liên kết dịch vụ của bạn (trừ khi nó thực sự bắt buộc phải đăng ký với dữ liệu tĩnh, không phải thành phần cụ thể) để tránh rò rỉ bộ nhớ không chắc chắn và an toàn ngay cả khi bạn quên đôi khi để hủy đăng ký, hệ thống sẽ xóa nó cho bạn với cảnh báo.

Nhưng, đối với getSharedPreferences(...) bạn luôn có thể sử dụng bất kỳ ApplicationContext hoặc Context nào mà không bị cản trở. Các reason là, nó đã được đề cập rõ ràng

Đối với bất kỳ tập hợp các sở thích (ở đây SharedPreferences), có một trường hợp duy nhất của lớp này mà tất cả các khách hàng cổ phiếu.

Chỉ nhận tham chiếu qua ngữ cảnh ứng dụng sẽ không giữ tham chiếu vĩnh viễn. Nó chỉ là một tham chiếu đến các sở thích thông qua ngữ cảnh ứng dụng như bất kỳ ngữ cảnh nào khác. Vì vậy, nó sẽ được xóa ngay sau khi người dùng được thực hiện với nó.

Xin lưu ý, việc đăng ký người nhận thông qua ngữ cảnh ứng dụng sẽ được duy trì là trạng thái toàn cầu được liên kết với đơn đăng ký của bạn. Vì vậy, nó sẽ không bao giờ được xóa cho bạn.

Vui lòng ai đó sửa tôi nếu tôi sai.

Hy vọng điều này sẽ giúp bạn.

+2

Tôi muốn tin điều này, hy vọng nó là chính xác –

+0

@Toro, Xin vui lòng thêm các phát hiện của bạn để hỗ trợ bình luận. Cuối cùng, tất cả người dùng nên biết tại sao bạn nghĩ câu trả lời ở trên là đúng. –

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