ตัวอย่างนี้สาธิตวิธี ดึงรายการ Task/แอปที่รันอยู่ล่าสุด โดยใช้ ActivityManager.getRunningTasks() (Deprecated API 21+) สำหรับการเรียนรู้พื้นฐาน
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → New Project → Empty Activity
ขั้นตอนที่ 2: Layout (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvRunningApps"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAlignment="center"
android:textColor="@android:color/black"
android:textSize="16sp"
android:textStyle="bold" />
</RelativeLayout>
ขั้นตอนที่ 3: โค้ดหลัก (MainActivity.kt)
import android.app.ActivityManager
import android.content.Context
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "Running Apps Demo"
val tvApps = findViewById(R.id.tvRunningApps)
val activityManager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
// ⚠️ Deprecated since API 21 (Android 5.0)
// ใช้ได้เฉพาะแอปที่มี Signature Permission หรือ System App
val recentTasks = activityManager.getRunningTasks(Int.MAX_VALUE)
val sb = StringBuilder()
for (i in recentTasks.indices) {
val task = recentTasks[i]
sb.append("${i + 1}. ${task.baseActivity?.packageName ?: "Unknown"}\n")
sb.append(" ID: ${task.id}, Base: ${task.baseActivity?.flattenToShortString()}\n\n")
}
tvApps.text = if (sb.isNotEmpty()) sb.toString() else "No running tasks found\n(Requires special permission on Android 5.0+)"
}
}
⚠️ ข้อจำกัดสำคัญ (Android 5.0+ / API 21+)
getRunningTasks()**ไม่ทำงานสำหรับแอปทั่วไป** จะคืนเฉพาะ Task ของแอปตัวเอง- ต้องมี Permission
android.permission.GET_TASKS(Deprecated) - Google Play Store **ไม่อนุญาต** ให้แอปทั่วไปใช้ Permission นี้
✅ วิธีทันสมัยที่แนะนำ (Android 5.0+)
1. UsageStatsManager (สำหรับ Usage Stats)
// ต้องขอ Permission: PACKAGE_USAGE_STATS (Special permission)
val usageStatsManager = getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
val endTime = System.currentTimeMillis()
val startTime = endTime - 1000 * 60 * 60 // 1 ชม. ที่ผ่านมา
val stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime)
stats?.sortedByDescending { it.lastTimeUsed }?.forEach { ... }
2. ActivityManager.getRunningAppProcesses() (Deprecated API 26+)
val processes = activityManager.runningAppProcesses
processes?.forEach { println("${it.processName} - PID: ${it.pid}") }
3. Foreground Service + Notification Listener
สำหรับแอปที่ต้อง Monitor แอปอื่นจริงๆ
AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS" /> <!-- Deprecated -->
ทดสอบ
รันบน Emulator/API < 21 → จะเห็นรายการแอปที่รันอยู่
รันบน Device จริง API 21+ → จะเห็นเฉพาะแอปตัวเอง หรือข้อความ "No running tasks found"
💡 สรุป
API นี้ **ล้าสมัยและถูกจำกัด** ไว้แล้ว สำหรับ Production ให้ใช้ UsageStatsManager พร้อมขอ Special Permission จากผู้ใช้ หรือปรับเปลี่ยน Logic ให้ไม่ต้องรู้แอปอื่นทำงาน