Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में वर्तमान में चल रहे ऐप्स प्रोग्रामेटिकली कैसे खोजें

ActivityManager का उपयोग करके चल रहे टास्क्स/ऐप्स की सूची प्राप्त करना

एंड्रॉइड में ActivityManager.getRunningTasks() और getRunningAppProcesses() का उपयोग करके चल रहे एप्लिकेशन की जानकारी प्राप्त की जा सकती है। नोट: एंड्रॉइड 5.0+ (API 21) में getRunningTasks() डिप्रिकेटेड है और केवल कॉलर के अपने टास्क्स लौटाता है। आधुनिक ऐप्स के लिए UsageStatsManager का उपयोग करें।

चरण 1: नया प्रोजेक्ट बनाएं

Android Studio में प्रोजेक्ट बनाएं।

चरण 2: लेआउट फ़ाइल

res/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">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/tvRunningApps"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:lineSpacingExtra="4dp"
            tools:text="चल रहे ऐप्स यहाँ सूचीबद्ध होंगे" />

    </ScrollView>

</RelativeLayout>

चरण 3: MainActivity - लीगेसी विधि (API < 21)

package com.app.sample;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TextView tvRunningApps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvRunningApps = findViewById(R.id.tvRunningApps);
        getRunningAppsLegacy();
    }

    @SuppressWarnings("deprecation")
    private void getRunningAppsLegacy() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        if (activityManager == null) return;

        StringBuilder output = new StringBuilder();

        // विधि 1: getRunningTasks (डिप्रिकेटेड API 21+)
        List tasks = activityManager.getRunningTasks(50);
        output.append("=== Running Tasks (डिप्रिकेटेड) ===\n");
        for (ActivityManager.RunningTaskInfo task : tasks) {
            output.append("टास्क ID: ").append(task.id).append("\n");
            output.append("बेस एक्टिविटी: ").append(task.baseActivity.flattenToShortString()).append("\n");
            output.append("टॉप एक्टिविटी: ").append(task.topActivity.flattenToShortString()).append("\n");
            output.append("थंबनेल: ").append(task.thumbnail != null ? "हाँ" : "नहीं").append("\n\n");
        }

        // विधि 2: getRunningAppProcesses (अभी भी काम करता है लेकिन सीमित)
        List processes = activityManager.getRunningAppProcesses();
        output.append("\n=== Running App Processes ===\n");
        for (ActivityManager.RunningAppProcessInfo proc : processes) {
            output.append("प्रोसेस: ").append(proc.processName).append("\n");
            output.append("  PID: ").append(proc.pid).append("\n");
            output.append("  महत्व: ").append(importanceToString(proc.importance)).append("\n");
            output.append("  पैकेजेस: ");
            if (proc.pkgList != null) {
                for (String pkg : proc.pkgList) {
                    output.append(pkg).append(", ");
                }
            }
            output.append("\n\n");
        }

        tvRunningApps.setText(output.toString());
    }

    private String importanceToString(int importance) {
        switch (importance) {
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND: return "फोरग्राउंड";
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE: return "विजिबल";
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE: return "सर्विस";
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND: return "बैकग्राउंड";
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_EMPTY: return "खाली";
            case ActivityManager.RunningAppProcessInfo.IMPORTANCE_CACHED: return "कैश्ड";
            default: return "अज्ञात (" + importance + ")";
        }
    }
}

आधुनिक विधि: UsageStatsManager (API 21+)

यह एंड्रॉइड 5.0+ के लिए अनुशंसित तरीका है:

1. अनुमति जोड़ें

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<!-- यूजर को सेटिंग्स में "Usage Access" देना होगा -->

2. UsageStatsManager कोड

private void getRunningAppsModern() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        getRunningAppsLegacy();
        return;
    }

    UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
    if (usageStatsManager == null) return;

    // पिछले 1 घंटे के आंकड़े
    long endTime = System.currentTimeMillis();
    long beginTime = endTime - 3600 * 1000; // 1 घंटा पहले

    List usageStatsList = usageStatsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_BEST, beginTime, endTime);

    StringBuilder output = new StringBuilder("=== Recent App Usage (UsageStatsManager) ===\n");

    if (usageStatsList != null && !usageStatsList.isEmpty()) {
        // अंतिम उपयोग समय के अनुसार सॉर्ट करें (नवीनतम पहले)
        usageStatsList.sort((a, b) -> Long.compare(b.getLastTimeUsed(), a.getLastTimeUsed()));

        for (UsageStats stats : usageStatsList) {
            String packageName = stats.getPackageName();
            String appName = getAppName(packageName);
            long lastUsed = stats.getLastTimeUsed();
            long totalTime = stats.getTotalTimeInForeground();

            output.append("ऐप: ").append(appName).append(" (").append(packageName).append(")\n");
            output.append("  अंतिम उपयोग: ").append(formatTime(lastUsed)).append("\n");
            output.append("  फोरग्राउंड समय: ").append(formatDuration(totalTime)).append("\n\n");
        }
    } else {
        output.append("कोई उपयोग डेटा नहीं (Usage Access अनुमति दें)\n");
    }

    tvRunningApps.setText(output.toString());
}

private String getAppName(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        return pm.getApplicationLabel(pm.getApplicationInfo(packageName, 0)).toString();
    } catch (PackageManager.NameNotFoundException e) {
        return packageName;
    }
}

private String formatTime(long timestamp) {
    return new java.text.SimpleDateFormat("HH:mm:ss", java.util.Locale.getDefault()).format(new java.util.Date(timestamp));
}

private String formatDuration(long millis) {
    long seconds = millis / 1000;
    long minutes = seconds / 60;
    long hours = minutes / 60;
    return String.format("%02d:%02d:%02d", hours, minutes % 60, seconds % 60);
}

यूजर को Usage Access अनुमति देने के लिए निर्देशित करें

private void requestUsageStatsPermission() {
    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivity(intent);
}

// जांचें कि अनुमति दी गई है या नहीं
private boolean hasUsageStatsPermission() {
    AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
    int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, android.os.Process.myUid(), getPackageName());
    return mode == AppOpsManager.MODE_ALLOWED;
}

चरण 4: AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.app.sample">

    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
        tools:ignore="ProtectedPermissions" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.Light">

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

तुलना: लीगेसी vs आधुनिक

पहलूgetRunningTasks (लीगेसी)UsageStatsManager (आधुनिक)
API स्तरसभी (लेकिन API 21+ पर सीमित)API 21+
डेटा प्रकारवर्तमान टास्क स्टैकऐतिहासिक उपयोग आंकड़े
अनुमतिकोई नहींPACKAGE_USAGE_STATS (यूजर द्वारा दी गई)
सटीकता (API 21+)केवल अपना टास्कसभी ऐप्स का उपयोग इतिहास
उपयोग का मामलापुराने ऐप्स, सरल जांचउपयोग ट्रैकिंग, डिजिटल वेलबीइंग
महत्वपूर्ण: एंड्रॉइड 5.0+ पर getRunningTasks() केवल कॉलिंग ऐप के अपने टास्क्स लौटाता है। अन्य ऐप्स की जानकारी के लिए UsageStatsManager अनिवार्य है, जिसके लिए यूजर को सेटिंग्स → Security → "Apps with usage access" में अनुमति देनी होती है।
  1. एंड्रॉइड में TextView स्पैन का कलर कैसे सेट करें? एंड्रॉइड में TextView स्पैन का कलर कैसे सेट करें?

    SpannableString और ForegroundColorSpan के साथ आंशिक टेक्स्ट कलरिंग यह उदाहरण दर्शाता है कि SpannableString का उपयोग करके TextView के विशिष्ट भागों का टेक्स्ट कलर कैसे बदलें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट में TextView res/layout/activity_main.x

  1. Android Emulator का IP एड्रेस कैसे प्राप्त करें? Android Emulator का IP एड्रेस कैसे प्राप्त करें?

    WifiManager का उपयोग करके Android एमुलेटर/डिवाइस का स्थानीय IP एड्रेस प्रोग्रामेटिकली प्राप्त करने का तरीका। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में नया प्रोजेक्ट बनाएं। चरण 2: लेआउट res/layout/activity_main.xml: <?xml version=1.0 encoding=utf-8?> <RelativeLayout xmlns:android=https

  1. प्रोग्रामेटिकली वर्तमान Android SDK वर्जन कैसे प्राप्त करें? प्रोग्रामेटिकली वर्तमान Android SDK वर्जन कैसे प्राप्त करें?

    Android में प्रोग्रामेटिकली SDK वर्जन जानना यह ट्यूटोरियल दिखाता है कि कैसे रनटाइम पर डिवाइस का API लेवल और Android वर्जन प्राप्त किया जाता है, जो वर्जन-स्पेसिफिक फीचर्स इम्प्लीमेंट करने के लिए जरूरी है। चरण 1: प्रोजेक्ट बनाएं Android Studio में नया प्रोजेक्ट बनाएं। चरण 2: लेआउट में TextView res/l