mẫu thực hiện
public class AppContext extends Application {
//This my introduce OutOfMemoryException if you don't handle register and removal quiet well, better to replace it with weak reference
private static List<IMemoryInfo> memInfoList = new ArrayList<AppContext.IMemoryInfo>();
public static abstract interface IMemoryInfo {
public void goodTimeToReleaseMemory();
}
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
//don't compare with == as intermediate stages also can be reported, always better to check >= or <=
if (level >= ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW) {
try {
// Activity at the front will get earliest than activity at the
// back
for (int i = memInfoList.size() - 1; i >= 0; i--) {
try {
memInfoList.get(i).goodTimeToReleaseMemory();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
*
* @param implementor
* interested listening in memory events
*/
public static void registerMemoryListener(IMemoryInfo implementor) {
memInfoList.add(implementor);
}
public static void unregisterMemoryListener(IMemoryInfo implementor) {
memInfoList.remove(implementor);
}
}
public class ActivityParent extends Activity implements AppContext.IMemoryInfo {
protected ActivityParent child;
@Override
protected void onStop() {
super.onStop();
try {
if (child != null)
AppContext.unregisterMemoryListener(child);
} catch (Exception e) {
}
}
}
public class ActivityChild extends ActivityParent {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
child = this;
}
/---move following onResume() in parent as following eg:
/*
*@Override
* protected void onResume() {
* super.onResume();
* if(null != child){
* AppContext.registerMemoryListener(this);
* }
* }
*/
@Override
protected void onResume() {
super.onResume();
AppContext.registerMemoryListener(this);
}
@Override
public void goodTimeToReleaseMemory() {
super.goodTimeToReleaseMemory();
//remove your Cache etc here
}
//--NO Need because parent implementation will be called first, just for the sake of clarity
@Override
protected void onStop() {
super.onStop();
try {
if (null != child)
AppContext.unregisterMemoryListener(child);
} catch (Exception e) {
}
}
More Info:
Khi ứng dụng của bạn đang chạy: TRIM_MEMORY_RUNNING_MODERATE Thiết bị này sắp hết bộ nhớ. Ứng dụng của bạn đang chạy và không thể giết được.
TRIM_MEMORY_RUNNING_LOW Thiết bị đang chạy thấp hơn nhiều trên bộ nhớ. Ứng dụng của bạn đang chạy và không thể giết được, nhưng vui lòng giải phóng tài nguyên chưa sử dụng để cải thiện hiệu suất hệ thống (tác động trực tiếp đến hiệu suất của ứng dụng).
TRIM_MEMORY_RUNNING_CRITICAL Thiết bị đang chạy rất thấp trên bộ nhớ. Ứng dụng của bạn vẫn chưa được coi là quá trình giết người, nhưng hệ thống sẽ bắt đầu giết chết các quá trình nền nếu ứng dụng không phát hành tài nguyên, vì vậy bạn nên phát hành tài nguyên không quan trọng ngay bây giờ để ngăn chặn sự xuống cấp hiệu suất.
Khi ứng dụng của bạn tầm nhìn thay đổi về giao diện TRIM_MEMORY_UI_HIDDEN của ứng dụng của bạn không còn có thể nhìn thấy, vì vậy đây là thời điểm tốt để giải phóng nguồn lực lớn mà chỉ được sử dụng bởi giao diện người dùng của bạn.
Khi quá trình ứng dụng của bạn nằm trong danh sách LRU nền: TRIM_MEMORY_BACKGROUND Hệ thống đang ở mức thấp vào bộ nhớ và quá trình của bạn là gần đầu danh sách LRU
. Mặc dù quy trình ứng dụng của bạn không có nguy cơ bị giết cao, hệ thống có thể đã bị giết trong danh sách LRU
, do đó bạn nên giải phóng tài nguyên dễ khôi phục để quy trình của bạn vẫn còn trong danh sách và tiếp tục nhanh chóng khi người dùng trở lại ứng dụng của bạn.
TRIM_MEMORY_MODERATE Hệ thống sắp hết bộ nhớ và quá trình của bạn nằm gần giữa danh sách LRU. Nếu hệ thống trở nên bị ràng buộc hơn nữa đối với bộ nhớ, có khả năng quá trình của bạn sẽ bị giết.
TRIM_MEMORY_COMPLETE Hệ thống sắp hết bộ nhớ và quá trình của bạn là một trong những người đầu tiên bị giết nếu hệ thống không khôi phục bộ nhớ ngay bây giờ. Bạn nên phát hành tuyệt đối mọi thứ không quan trọng để tiếp tục trạng thái ứng dụng của bạn. Để hỗ trợ mức API thấp hơn 14, bạn có thể sử dụng phương thức onLowMemory()
làm dự phòng tương đương với mức TRIM_MEMORY_COMPLETE
.
http://developer.android.com/reference/android/content/ComponentCallbacks2.html
Lưu ý rằng onTrimMemory (mức) được gọi bởi hệ thống trên tất cả các thành phần Android - không chỉ Hoạt động/Phân đoạn. – Tom
xem mẫu Thực hiện tại đây http://stackoverflow.com/a/28210326/185022 –