Context la gi

Context la gi

Đã đăng vào thg 5 26, 2017 2:21 SA 4 phút đọc

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

All rights reserved

Context la gi

Đã đăng vào thg 7 7, 2018 3:55 CH 4 phút đọc

I. Khái quát về Context

  • Context là thành phần trong ứng dụng android cung cấp quyền truy cập thông tin về các trạng thái của ứng dụng đó. Nó cung cấp các Activities, Fragments và Services truy cập tới các file tài nguyên, hình ảnh, theme, style và các file nằm ngoài ứng dụng. Nó cũng cho phép truy cập vào các thành phần chính của Android như layout, keyboard và tìm kiếm các content providers.
  • Trong nhiều trường hợp, khi bắt buộc phải sử dụng Context chúng ta đơn giản truyền vào instance của activity hiện tại. Trong tình huống chúng ta ở trong các object được tạo bởi activity như adapter của fragments, chúng ta cần truyền activity instance vào trong object đó. Còn trong trường hợp chúng ta ở ngoài activity đó (VD application, service), chúng ta sẽ sử dụng "application" context thay thể.

II. Vậy Context dùng để làm gì?

  • Sẽ có các trường hợp nhất định bắt buộc phải truyền vào context, ví dụ như start một activity, tạo một view mới, gửi local broadcast..v..v..

III. So sánh Application và Activity Context

  • Như chúng ta đã biết, Application Context và Activity Context là 2 thành phần context cơ bản nhất của Android. Vậy chúng khác nhau như thế nào?
  1. Trong khi theme và styles thường xuyên xử dụng tại application level, chúng có thể định nghĩa tại Activity. Trong trường hợp activity có thể có các set theme hoặc style khác nhau (VD như ông khách bắt ActionBar phải disable ở một số trang nhất định) Chúng ta sẽ khai báo tại AndroidManifest.xml cho application và định nghĩa 1 trường hợp đặc biệt cho activity

Đa phần các View nên truyền vào Activity Context để có thể apply các theme,style, dimensions tự định nghĩa. Nếu ko có trường hợp nào định nghĩa riêng cho Activity, default sẽ là trường hợp định nghĩa riêng cho Application. Đa số các trường hợp bạn nên sử dụng Activity Context, thông thường keyword this là instance của class cũng đại diện cho Activity Context.

  1. Anonymous Function: Sử dụng AF sẽ implement listener, keyword this sẽ không đại diện cho instance của activity đó nữa mà là class trực tiếp được định nghĩa nếu chúng ta viết trong function này vậy ta sẽ thêm tên activity trước keyword this như ví dụ dưới đây
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { TextView tvTest = (TextView) findViewById(R.id.abc); tvTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this, "Chiu chiu", Toast.LENGTH_SHORT).show(); } }); } }
  1. Các trường hợp sử dụng RecyclerViewAdapter ta có thể gọi context như sau viewHolder.itemView.getContext()

IV. Phòng tránh memory leak

  • Application Context là điển hình của Singleon instance, giống như class custom manager cần Context thông tin để có quyền truy cập vào system service nhưng sẽ được tái sử dụng ở nhiều Activity. Việc tham chiếu đến Activity Context sẽ không tự giải phóng bộ nhớ khi không dùng đến, đó là 1 trong lý do ta dùng Application Context để thay thế trong trường hợp trên. Ví dụ dưới đây, context sẽ được chứa ở Activity hoặc Service và destroy bởi hệ thống. Nó sẽ ko được giải phóng bộ nhớ bởi CustomeManager class giữ một tham chiếu static đến nó
public class CustomManager { private static CustomManager sInstance; public static CustomManager getInstance(Context context) { if (sInstance == null) { // This class will hold a reference to the context // until it's unloaded. The context could be an Activity or Service. sInstance = new CustomManager(context); } return sInstance; } private Context mContext; private CustomManager(Context context) { mContext = context; } }
  • Vây để xử lý những trường hợp trên, không bao giờ được giữ tham chiếu đến context ngoài vòng đời của nó. Kiểm tra mọi background thread, pending handler , hoặc inner class.
  • Sử dụng Application Context khi nó cần tham chiếu xuyên suốt theo vòng đời của component. VD như để giải quyết trường hợp trên như sau
public static CustomManager getInstance(Context context) { if (sInstance == null) { // When storing a reference to a context, use the application context. // Never store the context itself, which could be a component. sInstance = new CustomManager(context.getApplicationContext()); } return sInstance; }

Tham Khảo

  • What is a context - Simple Code Stuffs
  • Avoiding memory leaks
  • What is Context - StackOverflow
  • Using Context - CodePath

All rights reserved