在Android中获取当前活动应用程序名称

15

我正在尝试制作一个程序,可以显示所有活动应用程序。

我已经搜索了很多地方,但只找到了显示包名的代码。

如果您们大神能告诉我如何显示所有活动的应用程序名称,那将非常有帮助。

3个回答

34

你尝试使用 ActivityManager.getRunningAppProcesses() 了吗? 下面是检索名称的示例代码:

ActivityManager am = (ActivityManager)this.getSystemService(ACTIVITY_SERVICE);
List l = am.getRunningAppProcesses();
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
  }
}


是的,我确实尝试过了。但在ActivityManager.getRunningAppProcess()中,只有获取进程名称的选项。但我需要这些进程的应用程序名称,而在其中找不到任何方法。 - Shijilal
@bhups 你能告诉我如何找到仅运行的系统应用程序而不是已安装的应用程序吗? - user3233280
嗨@bhups,我目前正在开发一个应用程序,当点击按钮时,它将检查应用程序是否处于活动状态(例如Facebook),然后终止该进程或应用程序。这可能吗? - Jeongbebs

1
如果您正在获取包名,您应该能够使用PackageManager获取有关应用程序的其他信息:

http://developer.android.com/reference/android/content/pm/PackageManager.html

有直接的方法可以获取应用程序图标,ApplicationInfo和ActivityInfo对象。我不确定哪个方法会直接指向可读名称,但如果这些方法中没有一个可以直接访问它,那么它应该可以从应用程序资源中访问(也可以从此类中访问)。


-2
如果您正在编写一个服务,并希望像我一样定期更新当前的“前台应用程序”,请不要在服务的onCreate()方法中获取ActivityManager实例并在更新当前应用程序名称时重复使用它:
public class MyService extends Service implements {
  ActivityManager mActivityManager;
    
  @Override   public void onCreate()   {
        mActivityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE );   }


  String getForegroundAppName() {
    String appname;

    List <RunningAppProcessInfo> l;
    l = mActivityManager.getRunningAppProcesses();
    
    while( i.hasNext() ) {
      if ( info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && !isRunningService(info.processName) {
        currentApp = info;
        break;
      }
    }

    if ( currentApp != null ) {
      try {
        CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(currentApp.processName, PackageManager.GET_META_DATA ));
        appname = c.toString();
    }
    return appname;
  }

}

不要这样做。每次调用都会导致内存泄漏,从而产生大量的GC_CONCURRENT错误。我不知道背后的真正原因,但每次使用时获取ApplicationManager实例会更加清晰易懂:
public class MyService extends Service implements {
        
      @Override   public void onCreate()   {...   }
    
    
      String getForegroundAppName() {
        ActivityManager mActivityManager;
        String appname;
    
        mActivityManager = (ActivityManager)getSystemService(ACTIVITY_SERVICE );
        List <RunningAppProcessInfo> l;
        l = mActivityManager.getRunningAppProcesses();
        
        while( i.hasNext() ) {
          if ( info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && !isRunningService(info.processName) {
            currentApp = info;
            break;
          }
        }
    
        if ( currentApp != null ) {
          try {
            CharSequence c = pm.getApplicationLabel(pm.getApplicationInfo(currentApp.processName, PackageManager.GET_META_DATA ));
            appname = c.toString();
        }
        return appname;
      }
    
    }

可以通过帖子上的删除链接进行删除。编辑答案并不是正确的方法。 - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接