Như các bạn đã biết, cho dù cho bọn họ truy cập cho tới một View hoặc những tài nguyên hệ thống (Asset), phần lớn bọn họ đều tham chiếu mang lại một Context. Hôm nay mình muốn trình bày với các bạn về Context trong Android.Bạn đang xem: Context trong apk là gì
Bạn gồm công thừa nhận là các bạn gọi rất nhiều đến Context trong ứng dụng không? Vậy chúng ta đã hiểu bản chất của content trong apk là gì chưa? cùng có bao giờ bạn bị chú ý là cần sử dụng Context ko đúng đang làm áp dụng bị Memory Leak chưa?
Bài viết này, chúng ta sẽ cùng đi tìm cội mối cung cấp của Context nhé!
Context trong android là gì?
Theo documentation của Google:
Context is an interface lớn global information about an application environment. This is an abstract class whose implementation is provided by the app android system. It allows access khổng lồ application-specific resources và classes, as well as up-calls for application-level operations such as launching activities, broadcasting & receiving intents, etc.
Tạm dịch:
Context là một trong những interface chứa thông tin toàn bộ về môi trường ứng dụng. Đây là 1 trong những lớp trừu tượng được xúc tiến bởi khối hệ thống Android. Nó được cho phép truy cập đến những tài nguyên và những lớp áp dụng cụ thể, cũng tương tự gọi đến các tác vụ bên trên mức ứng dụng như khởi chạy các activity, gửi và nhận intents, v.v..Bạn sẽ xem: Context trong apk là gì
Nói biện pháp khác, chúng ta đều đang biết và thực hiện nó, trong nhiều cách thức khác nhau. Cơ mà thường là sai giải pháp hoặc hồ hết không để ý đến các bài toán Garbage Collector (GC – trình dọn rác của JVM) sẽ lau chùi và vệ sinh context như làm sao v.v.. Dẫn đến sự việc bị leak memory…
Cứ bình tĩnh, bọn họ sẽ tiếp tục tìm hiểu bên dưới nhé
Có bao nhiêu cách để gọi Context vào Android
Có các cách nào để có thể get được một context?
Theo tởm nghiệm phiên bản thân thì tất cả một biện pháp gọi như sau:
this / getActivity()getContext()getBaseContext()getApplicationContext()this sinh sống đây đó là Activity hiện tại. Ví dụ, hàm hiển thị Toast thân quen thuộc:
Toast.makeText(this, "Boom!", Toast.LENGTH_LONG).show();getContext() là một trong những hàm của lớp View, sẽ nhận được context bây giờ của View đó.
Bạn đang xem: Context trong android là gì
getBaseContext() là 1 trường hợp quánh biệt. Bí quyết gọi này không nhiều thông dụng cơ mà không có nghĩa là hoàn toàn vô dụng. Nó chỉ sử dụng khi chúng ta biết rõ nó là gì, và gồm lý do quang minh chính đại để sử dụng. Đơn cử như bạn có nhu cầu override một Context bởi một context khác.
getApplicationContext() được sử dụng ở gần như nơi mà chúng ta không niềm nở hoặc không cần thiết phải truy cập mang lại context của activity. Số đông gì bạn muốn là tin tức của context trong vận dụng của bạn.
Lưu ý này: bạn phải rất cẩn trọng để không giữ lại context lâu dài cần thiết. Đặc biệt là với các activity. Khôn xiết tiếc là tất cả bọn họ đều phạm lỗi này bằng cách tạo ra những anonymous inner classes với 1 tham chiếu mạnh dạn (strong reference) mang lại Context vào Android.
Mình rước ví dụ điển hiển kia là gọi Context trong AsyncTask.
AsyncTasks là vẻ ngoài mà việc thực thi không tạm dừng sau khi activity bị hủy. Do đó, garbage collector ko thể thu hồi nó lúc Activity bị hủy. Và nguy cơ Memory Leak sẽ xảy ra rất lớn.
Vậy phải làm sao đây?
Như ví dụ mặt dưới, mình sử dụng Handler để bảo vệ context của Activity không bị leak. Nhưng giải pháp này tương đối tốn effort, đặc biệt quan trọng khi viết một ứng dụng phức tạp. (Đọc thêm bài về Handler vào Android nhé)
private static final Handler handler = new Handler();private final Runnable messageTask = new SetMessageTask(this, "This is the message!");private void postTask() handler.postDelayed(messageTask, 8000);private static class SetMessageTask implements Runnable private final WeakReference activity; pivate final String message; SetMessageTask(MainActivity activity, String message) this.activity = new WeakReference(activity); this.message = message; Override public void run() if (message == null
Sử dụng Context trong Fragment
Với việc bổ sung cập nhật fragments, hầu hết thứ trở nên phức hợp hơn. Chính vì vòng đời của fragments kết nối tới vòng đời của các activity. Điều này tạo ra nhiều lỗi về state cùng transactions, tương tự như việc làm chủ stack của ứng dụng.Tuy nhiên, kia chỉ là bố nơi chúng ta cũng có thể gọi, điều này còn có vẻ hơi tiêu giảm nhỉ.

Vòng đời của activity và thứ tự gọi các phương thức
Do tài nguyên smartphone có hạn, bắt buộc activity có thể bị hủy bất kể lúc làm sao bởi khối hệ thống để giải hòa tài nguyên. Đó là vì sao tại sao bạn không nên dựa vô số vào context cùng tính khả dụng của nó.
Quy tắc thực hiện Context trong Android
Đôi khi, gồm những trường hợp rất “nực cười” trong ứng dụng. Ví dụ, việc kiểm soát hiển thị view cùng load data đến view trong và một hàm (bạn cấm kị điều này nhé, chỉ lấy ví dụ thui!).
Khi mà lại việc pha trộn giữa khai báo view với tải tài liệu cho view đó cũng trong 1 hàm. Điều này làm phần lớn thứ phụ thuộc vào lẫn nhau dẫn đến khó kiểm soát.
Bạn rất có thể bị sa đà vào vấn đề code hầu hết thứ trong onCreateView()… và sự lộ diện của Fragments chỉ tạo ra các vấn đề thêm trầm trọng, đặc biệt là việc áp dụng Context.
Một phần vì chưng Context không phải lúc cũng sẵn sàng chuẩn bị để hotline được. Chỉ vào onActivityCreated() hoặc onAttach() chúng ta mới chắc chắn về tính khả dụng của Context.
Ở hình mặt dưới, chúng ta có thể thấy MainActivity đã trở nên memory leak. Đây là công dụng mình thực hiện thư viện LeakCanary nhằm phát hiện nay memory leak

MainActivity bị leak memory
6 Quy tắc áp dụng Context vào Android
Tóm lại, để ngăn cản để xảy ra lỗi memory leak khi áp dụng Context, mình đúc kết được một số quy tắc như sau:
Sử dụng getContext() hoặc Activity.this khi nên xử lý đến những Views nằm trên activity.Sử dụng getApplicationContext() nếu bạn cần context ở cung cấp ứng dụng, không cân xứng với bất kỳ view/ activity nào. Ví dụ: thực hiện hàm này cùng với BroadcastReceiver hoặc Service)Không sử dụng getBaseContext(). Khi mà lại không thực sự hiểu thì cực tốt tìm biện pháp khác bình an hơnSử dụng WeakReference nếu chúng ta cần truy vấn đến context từ phía bên trong threads.Không tham chiếu cho context của một activity từ một activity khác. Tuyệt đối không sử dụng context như một trở thành static. Ở trong fragment, gán một context để áp dụng ở vào hàm onAttach(Context context)Như vậy, họ đã làm rõ về Context trong app android rồi đúng không? cùng mình hi vọng với hồ hết quy tắc trên, các bạn sẽ không còn băn khoăn lo lắng về sự việc memory leak khi áp dụng context nữa