如何检测在Android上打开的应用程序

Meg*_*gaX 5 keyboard android

我正在开发一个Android定制的键盘,我想送胶粘物给我的朋友,例如Hangouts上从我的键盘.我为此添加了一些png.

当我使用android的共享api时,我必须首先选择要与之分享的应用程序.是否可以从键盘检测当前打开的应用程序?例如,如果我正在与环聊聊天,那么我想调用意图告诉它与"com.something.hangouts"分享

如果我在FB messenger然后告诉它"com.something.facebook.messenger"等...

我试着像这样:

fun getOpenedApplication() {
    var am = this.getSystemService(ACTIVITY_SERVICE) as ActivityManager;

    var l = am.getRecentTasks(1,
            ActivityManager.RECENT_WITH_EXCLUDED);
    var i = l.iterator();

    var pm = this.packageManager;

    while (i.hasNext()) {
        try {
            var intent = i.next().baseIntent;
            var list = pm.queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);

            var c = pm.getApplicationLabel(pm.getApplicationInfo(
                    list[0].activityInfo.packageName,
                    PackageManager.GET_META_DATA));

            Toast.makeText(this, "Application name: " + c.toString(),
                    Toast.LENGTH_LONG).show();

        } catch (e: Exception) {
            Toast.makeText(this,
                    "Application name not found: " + e.toString(),
                    Toast.LENGTH_LONG).show();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是效果不好......它会发回发射器或键盘.(随机)

我试图从最近的应用程序列表中获取第一个应用程序,但它无法正常工作

小智 9

这是非常容易的任务.

String packageName = getCurrentInputEditorInfo().packageName;
Run Code Online (Sandbox Code Playgroud)

InputMethodService类的方法.


Mah*_*raa 5

对于 Android L 及以上版本,请使用:

ActivityManager activityManager = (ActivityManager) newContext.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runAppProcessesList = activityManager.getRunningAppProcesses();
for (RunningAppProcessInfo runAppProcess : runAppProcessesList) {
    if (runAppProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        Log.d("current foreground App", runAppProcess.processName);
    }
}
Run Code Online (Sandbox Code Playgroud)