Tìm hiểu về Context và cách sử dụng tối ưu trong Android

Context là gì?

Context có thể được dịch là ngữ cảnh, nó thể hiện cho ngữ cảnh hiện tại của ứng dụng, đối tượng. Ví dụ như đang ở ngữ cảnh Activity, Service...Context cho phép bạn tạo ra những đối tượng mới mà có liên quan đến một ngữ cảnh cụ thể nào đó. Thông thường bạn gọi nó để lấy thông tin có liên quan đến một phần của phần mềm của bạn (Activity, package, application)

Ngoài ra Context dùng để xử lí công việc liên quan đến hệ thống, nó cung cấp các dịch vụ như resource, truy cập database, preferences và nhiều thứ khác nữa. Ứng dụng Android có các activity , chúng được kế thừa từ Context, nên cũng có thể truy cập được resource, class và các thông tin liên quan đến ứng dụng.

Context bạn có thể thấy được sử dụng mọi nơi trong ứng dụng Android và nó rất quan trọng trong phát triển Android, bắt buộc chúng ta phải có hiểu biết về chúng để có thể sử dụng một cách chính xác.

Nếu sử dụng sai cách thì có thể khiến cho ứng dụng của bạn bị leak memory. Có rất nhiều kiểu Context vậy đó là những kiểu nào, và cách sử dụng chúng như thế nào. Hãy cũng theo dõi nhưng gì tôi sắp viết dưới đây nhé!

Application Context

Application Context là một singleton, bạn có thể truy cập nó trong activity thông qua getApplicationContext(). Context này gắn liền với vòng đời của ứng dụng. Application Context được sử dụng khi bạn cần context cho những công việc tách biệt với ngữ cảnh hiện tại hay context không bị phụ thuộc vào phạm vi activity

Ví dụ: Nếu bạn có một đối tượng Singleton bạn cần truyền vào đó context thì bạn cần phải dùng Application Context

Ở ví dụ trên, nếu bạn truyền vào Activity Context thì nó sẽ khiến ứng dụng của bạn bị leak memory vì Context activity nó sẽ giữ tham chiếu đến activity nên khi activity không sử dụng sẽ không được thu hồi lại bộ nhớ.

Ngoài ra nếu bạn sử dụng thư viện ngoài, khi khởi tạo bạn phải truyền Application Context thay vì Activity Context.

Bạn chỉ được phép sử dụng getApplicationContext() khi bạn biết Context cho việc gì mà có thể cần đến việc sử dụng lâu.

Activity Context

Loại context này ở trong Activity và nó cũng gắn liền với vòng đời của Activity, nên sử dụng loại context này khi bạn truyền nó sử dụng trong phạm vi activity hoặc bạn cần context cho công việc mà gắn liền với vòng đời hiện tại của activity

Ví dụ: Nếu bạn phải tạo ra một đối tượng mà vòng đời của đối tượng đó gắn liền với activity thì bạn nên sử dụng Activity Context.

getContext() trong ContentProvider

Context ở đây chính là Application Context nên việc sử dụng nó tương tự với Application Context. Context này được gọi qua hàm getContext()

Ta không nên sử dụng getApplicationContext() khi nào?

  • Nó không hoàn toàn là Context mà có thể support mọi thứ như Activity context. Một số công việc sử dụng Context liên quan đến GUI nếu sử dụng Application Context sẽ không được mà thay vào đó phải dùng Activity Context
  • Có thể gây ra leak memory nếu bạn sử dụng không đúng cách, những sử dụng đúng với phạm vi của nó. Sử dụng application context đồng nghĩa là nó sẽ sống với vòng đời của ứng dụng.

Tóm lại

Phần lớn,bạn thường sử dụng những context sẵn có từ những thành phần bạn đang làm việc bên trong. Bạn có thể giữ một tham chiếu một cách an toàn miễn là nó không vượt quá phạm vi của thành phần đó. Nếu bạn muốn lưu một tham chiếu của một đối tượng vượt qua ngoài phạm vi của Service, Activity thì bạn nên sử dụng Application Context