Вопрос по android – Android: как я могу получить текущее имя открытого приложения на экране

1

Подскажите, пожалуйста, как мне узнать текущее имя открытого приложения, даже если на устройстве есть домашний экран, тогда я обнаружу, что "Главный экран открыт".

Вы можете получить активность поstackoverflow.com/questions/3873659/… Dheeresh Singh

Ваш Ответ

6   ответов
-1

С этим вы можете получить текущее имя приложения

 Resources appR = getApplicationContext().getResources(); 
 CharSequence txt = appR.getText(appR.getIdentifier("app_name","string", getApplicationContext().getPackageName()));
 System.out.println(txt+"  APp Name");
эй, спасибо за ваш ответ, но дайте мне знать, что если я запускаю это в фоновом режиме, то оно дает другое имя открытого приложения, которое в настоящее время присутствует на экране? Simon Gates
1

Вы также можете перечислить запущенные задачи с кодом ниже:

ActivityManager am = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
List li = am.getRunningTasks(100);
Iterator i = li.iterator();
PackageManager pm = getApplicationContext().getPackageManager();
while (i.hasNext()) {
    try {
        ActivityManager.RunningTaskInfo info = (ActivityManager.RunningTaskInfo)(i.next());
        String ac = info.baseActivity.getPackageName();
        CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(
        ac, PackageManager.GET_META_DATA));
        Log.v("asd", c.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
10

Ну вот

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRecentTasks(1, ActivityManager.RECENT_WITH_EXCLUDED);
Iterator i = l.iterator();
PackageManager pm = this.getPackageManager();
while (i.hasNext()) {
    ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo)(i.next());
    try {
        CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(
        info.processName, PackageManager.GET_META_DATA));
        Log.w("LABEL", c.toString());
    } catch (Exception e) {
        // Name Not FOund Exception
    }
}
привет, я получаю ClassCastException в ActivityManager.RunningAppProcessInfo info = (ActivityManager.RunningAppProcessInfo) (i.next ());
Эй, спасибо. Можете ли вы предложить, какое разрешение пользователя Android необходимо для этой строки - info.processName, PackageManager.GET_META_DATA)); Simon Gates
Эй, я сделал .. Спасибо, Випул Шах. Simon Gates
FYI getRecentTasks не только устарела в Lollipop (API 21), его функциональность была отключена. Этот ответ обновил информацию об обходном пути:stackoverflow.com/questions/27087675/…
Можете ли вы отредактировать этот ответ и опубликовать свой здесь.
0

Для меня приведенный выше пример не сработал. Итак, я в конечном итоге с помощью этого:

ActivityManager am = (ActivityManager) this
            .getSystemService(ACTIVITY_SERVICE);

    List<ActivityManager.RecentTaskInfo> l = am.getRecentTasks(1,
            ActivityManager.RECENT_WITH_EXCLUDED);
    Iterator<ActivityManager.RecentTaskInfo> i = l.iterator();

    PackageManager pm = this.getPackageManager();

    while (i.hasNext()) {
        try {
            Intent intent = i.next().baseIntent;
            List<ResolveInfo> list = pm.queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);

            CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(
                    list.get(0).activityInfo.packageName,
                    PackageManager.GET_META_DATA));

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

        } catch (Exception e) {
            Toast.makeText(this,
                    "Application name not found: " + e.toString(),
                    Toast.LENGTH_LONG).show();
        }
    }
Начиная с уровня API 21 уровень ActivityManager.getRececntTask устарел!
0

ИспользуйтеAccessibilityService

  • You can detect the currently active window by using an AccessibilityService.
  • In the onAccessibilityEvent callback, check for the TYPE_WINDOW_STATE_CHANGED event type to determine when the current window changes.
  • Check if the window is an activity by calling PackageManager.getActivityInfo().

I tested and working in Android 2.2 (API 8) through Android 7.1 (API 25).

public class MyAccessibilityService extends AccessibilityService {
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();

        //Configure these here for compatibility with API 13 and below.
        AccessibilityServiceInfo config = new AccessibilityServiceInfo();
        config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
        config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

        if (Build.VERSION.SDK_INT >= 16)
            //Just in case this helps
            config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

        setServiceInfo(config);
    }
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        Log.d("ABC-",accessibilityEvent.getPackageName()+" -- "+accessibilityEvent.getClassName());
        if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            if (accessibilityEvent.getPackageName() != null && accessibilityEvent.getClassName() != null) {
                ComponentName componentName = new ComponentName(
                        accessibilityEvent.getPackageName().toString(),
                        accessibilityEvent.getClassName().toString()
                );

                ActivityInfo activityInfo = tryGetActivity(componentName);
                boolean isActivity = activityInfo != null;
                if (isActivity)
                    Log.i("CurrentActivity", componentName.flattenToShortString());
            }
        }
    }

    private ActivityInfo tryGetActivity(ComponentName componentName) {
        try {
            return getPackageManager().getActivityInfo(componentName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }
    }
    @Override
    public void onInterrupt() {

    }
}
-1

Просто используя этот код

getActivity().getApplicationInfo().packageName

Он дает вам информацию о приложении, а затем вызывает имя пакета.

Похожие вопросы