Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีตั้งค่า Heap Watch Limit ใน Android

ภาพรวม

บทความนี้สาธิตการตั้งค่า 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 ถูกตั้งค่า