簡體   English   中英

在Android上打開應用程序時如何獲取應用程序的名稱?

[英]How to get the name of an app when it opens on Android?

我需要在打開並啟動密碼窗口時獲取任何 Android 應用程序的名稱。 我到處搜索如何找出用戶打開的應用程序的名稱,但我還沒有找到可行的解決方案。 我有一個在后台運行的服務,但它只返回我的應用程序名稱或主屏幕名稱,無論我打開哪個應用程序。

這是我的服務代碼:

package com.example.applock

import android.app.ActivityManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.IBinder
import android.provider.Settings


class BackAppListenerService  : Service() {
    private var isRunning = false
    private var lastApp = ""

    override fun onCreate() {
        println(TAG + "Service onCreate")
        isRunning = true
        val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        println(TAG + "Service onStartCommand")

        //Creating new thread for my service
        //Always write your long running tasks in a separate thread, to avoid ANR
        Thread(Runnable { //Your logic that service will perform will be placed here
            //In this example we are just looping and waits for 1000 milliseconds in each loop.

            while (true) {
                try {
                    Thread.sleep(1000)
                } catch (e: Exception) {
                }

                val mActivityManager = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
                val mPackageName = mActivityManager.runningAppProcesses[0].processName
                println(mPackageName)
            }
        }).start()
        return START_STICKY
    }

    override fun onBind(arg0: Intent): IBinder? {
        println(TAG + "Service onBind")
        return null
    }

    override fun onDestroy() {
        isRunning = false
        println(TAG + "Service onDestroy")
    }

    companion object {
        private const val TAG = "HelloService"
    }
}

好的,所以我已經想通了。 首先將其添加到 manifest.xml 的 manifest 標簽下:

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

然后轉到apps permissions > Usage Stats轉到您的應用程序並啟用它。 您還可以在應用程序加載后彈出窗口,要求用戶執行此操作。

現在,獲取當前前台應用程序的名稱:

fun getForegroundApp(): String {
    var currentApp = "NULL"
    // You can delete the if-else statement if you don't care about Android versions
    // lower than 5.0. Just keep the code that is inside the if and delete the one
    // inside the else statement.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        val usm = this.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
        val time = System.currentTimeMillis()
        val appList =
            usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time)
        if (appList != null && appList.size > 0) {
            val mySortedMap: SortedMap<Long, UsageStats> =
                TreeMap<Long, UsageStats>()
            for (usageStats in appList) {
                mySortedMap.put(usageStats.lastTimeUsed, usageStats)
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey())!!.getPackageName()
            }
        }
    } else {
        val am = this.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        val tasks = am.runningAppProcesses
        currentApp = tasks[0].processName
    }
    // Get only the app name name
    return currentApp.split(".").last()
}

有時應用程序名稱不是顯示的名稱,例如“gmail”應用程序在我測試時的名稱為“gm”。 主屏幕名稱也會因設備而異

每隔幾毫秒調用一次以獲取當前前台應用程序的邏輯很簡單:

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
    //Creating new thread for my service
    //Always write your long running tasks in a separate thread, to avoid ANR
    Thread(Runnable {
        while (true) {
            try {
                Thread.sleep(10)
            } catch (e: Exception) {
            }
            val currentApp = getForegroundApp()
            if (currentApp != lastApp) {
                println(currentApp)
                // New app on front
                lastApp = currentApp
                println(currentApp)
                // Do whatever you wan
            }
        }
    }).start()
    return START_STICKY
}

就是這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM