ภาพรวม
บทความนี้สาธิตการตั้งค่า Heap Watch Limit ผ่าน ActivityManager.setWatchHeapLimit() เพื่อให้ระบบแจ้งเตือนเมื่อหน่วยความจำเกินเกณฑ์
ขั้นตอนที่ 1: สร้างโปรเจกต์
Android Studio → File → New Project → Empty Activity
ขั้นตอนที่ 2: Layout (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="30sp"
android:gravity="center" />
</LinearLayout>
ขั้นตอนที่ 3: โค้ดหลัก (java/MainActivity.java)
package com.example.myapplication;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// ตั้งค่า Watch Heap Limit = 4 MB (4096 KB)
long watchLimitBytes = 4 * 1024 * 1024; // 4 MB
activityManager.setWatchHeapLimit((int) (watchLimitBytes / 1024)); // Parameter เป็น KB
textView.setText("ตั้งค่า Watch Heap Limit: 4 MB (4096 KB) แล้ว");
}
}
ข้อสังเกตสำคัญ
- Parameter ของ
setWatchHeapLimit()เป็น **KB (Kilobytes)** ไม่ใช่ Bytes - ต้องการ Permission:
android.permission.SET_ACTIVITY_WATCHER(Signature|System) - แอปทั่วไป (Third-party) **ใช้ไม่ได้** - จะได้ SecurityException
- ใช้ได้เฉพาะ System Apps, Platform-signed Apps, หรือบน Emulator/Rooted Device
Callback เมื่อเกิน Limit
เมื่อ Heap เกินค่าที่ตั้งไว้ ระบบจะเรียก ActivityManager.ProcessMemoryListener.onProcessMemoryLow() (ถ้าลงทะเบียนไว้)
ทางเลือกสำหรับแอปทั่วไป: ใช้ ComponentCallbacks2
public class MyApplication extends Application implements ComponentCallbacks2 {
@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
switch (level) {
case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:
// UI ซ่อนอยู่ - ควร release resources
break;
case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
case ComponentCallbacks2.TRIM_MEMORY_BACKGROUND:
case ComponentCallbacks2.TRIM_MEMORY_MODERATE:
case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:
// ระบบหน่วยความจำต่ำ - ลดการใช้งาน
break;
}
}
}
หรือใช้ Jetpack Lifecycle + ProcessLifecycleOwner
ProcessLifecycleOwner.get().getLifecycle().addObserver(new DefaultLifecycleObserver() {
@Override
public void onStop(@NonNull LifecycleOwner owner) {
// App ไป Background - clear caches, stop services
}
});
ทดสอบ
บน Emulator (root) หรือ System App: รันแอป → ดู Logcat จะ thấy Watch limit ถูกตั้งค่า