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

วิธีดึงรายการแอปที่กำลังทำงานอยู่ใน Android ด้วย Kotlin

ตัวอย่างนี้สาธิตวิธี ดึงรายการ 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 ให้ไม่ต้องรู้แอปอื่นทำงาน