Android:来自 activity 名称字符串的应用程序名称和图标

Android: app name and icon from activity name string

我的 Android 应用程序存储一些 activity 外部应用程序的名称,稍后将启动。

示例:"com.companyname.app.ActivityName"

必须仅从此字符串中检索应用程序名称和图标。

我正在使用这种代码:

intent=new Intent("com.companyname.app.ActivityName");
label=packageManager.getApplicationLabel(packageManager.getApplicationInfo(intent.getPackage(),0)).toString();
icon=packageManager.getApplicationIcon(packageManager.getApplicationInfo(intent.getPackage(),0));

但似乎意图不正确,或者说明有误。

如何获取请求的值?

  1. 存储其他软件包的 activity 名称是个坏主意。该应用程序 开发人员可能会发布一个更新版本,该版本不再具有 Activity 用那个名字。

  2. 您正在使用的 Intent 构造函数设置了 action Intent。目前没有包。

我只会存储目标应用程序的包名称,并使用它来获取有关该应用程序的信息。

String packageName = ...;
try {
    String label = packageManager.getApplicationLabel(packageName);
    Drawable icon = packageManager.getApplicationIcon(packageName);
    // etc.
} catch (NameNotFoundException e) {
    Log.e(TAG, "Couldn't get info for package " + packageName);
}

如果您随后需要启动该应用程序,请使用 packageManager.getLaunchIntentForPackage(...) 获取 Intent 来执行此操作。

activity class 名称本身不足以明确识别它。您还需要知道它的包名。然后你可以创建一个 ComponentName 和一个开始这个 activity

的意图
Intent intent = new Intent(action).setComponent(new ComponentName(pkg, cls));

使用相同的组件名称和包管理器的 getActivityInfo() you could also access the ActivityInfo 并获取 activity 本身的标签和图标。

但在您的示例中,您使用 Intent(String) 构造函数来定义要启动的 "com.companyname.app.ActivityName" 操作。

<activity
  android:name=".ui.HomeActivity"
  android:label="@string/title_home_activity"
  android:icon="@drawable/icon">
  <intent-filter android:label="@string/app_name">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>