我有多个ActivityAliases,它们都以一个TargetActivity开头。
在我的TargetActivity内部,我尝试区分开始的别名TargetActivity

别名在Manifest中定义为可启动项( Intent 过滤器),将显示为
主屏幕上的快捷方式。用户将点击快捷方式和android
将开始 Activity ,该 Activity 是我在“android:targetActivity=..”标记中定义的。

为此,我目前从componentName中提取Intent,这是
给我的TargetActivity并使用className()

喜欢:

String aliasName = targetActivity.getComponentName().getClassName();

这适用于许多设备。但目前我看到了一些失败
OnePlus。在该设备上,我的技术仅返回
我的TargetActivity
,因此,根据
用户启动的别名。

是否还有其他可靠的方法来获取用于以下目的的ActivityAlias:
开始TargetActivity吗?只要名称本身不必长
因为我可以区分它们。我不想为每个别名创建专用的TargetActivities!

谢谢!

附言:我看到了另一种方法,它使用PackageManager来检索
activityInfo并使用Activity.name。但是我怀疑这会不会
返回与我的第一种方法不同的东西。
ActivityInfo aInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);

String aliasName = aInfo.name;

我也尝试过元数据:

编辑:

不幸的是,该方法不适用于所有设备。
如果从activity.component解析的alias-className返回target-activity,那么元数据方法也将失败。

我继续寻找答案,找到了一个很好的解决方法
在Tar​​getActivty中区分我的别名。

您可以在ActivityAlias标记内提供元数据,如下所示:
<activity-alias
    android:name=".aliasName"
    android:enabled="false"
    android:exported="true"
    android:icon="@drawable/someIconRes"
    android:label="@string/someLabelRes" android:targetActivity=".yourTargetActivity">
    <meta-data android:name="alias" android:value="valueToDistinguish"/>
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>

这里的重要部分是:
<meta-data android:name="alias" android:value="valueToDistinguish"/>

<activity-alias>此处</activity-alias>标记内。

要提取元数据,您可以从PackageManager获取ActivityInfo
使用TargetActivity:
ActivityInfo appInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);

并通过以下方式提取元数据:
    private static String getAliasNameByMetaData(ActivityInfo app) {
    String aliasName = "";
    if (app.metaData != null && app.metaData.containsKey(ALIAS_META_DATA_KEY)) {
        aliasName = app.metaData.getString(ALIAS_META_DATA_KEY, "");
    } else {
        LOG.i("AliasName by META-DATA didn't work!");
    }
    LOG.v("AliasName by META-DATA: " + aliasName);
    return aliasName;
}

编辑:

使用调试器检查Activity类,它包含一个mActivityInfo字段,该字段与ActivityInfo返回的getPackageManager().getActivityInfo()不同,因此您可以使用反射提取它并检查其名称。

注意:看来ActivityInfo返回的getPackageManager().getActivityInfo()mActivityInfoActivity的浅拷贝。因此,也许此方法不能解决问题:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);

最佳答案

1.元数据

不幸的是,该方法不适用于所有设备。
如果从activity.component解析的alias-className返回target-activity,那么元数据方法也将失败。

我继续寻找答案,找到了一个很好的解决方法
在Tar​​getActivty中区分我的别名。

您可以在ActivityAlias标记内提供元数据,如下所示:

<activity-alias
    android:name=".aliasName"
    android:enabled="false"
    android:exported="true"
    android:icon="@drawable/someIconRes"
    android:label="@string/someLabelRes" android:targetActivity=".yourTargetActivity">
    <meta-data android:name="alias" android:value="valueToDistinguish"/>
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity-alias>

这里的重要部分是:
<meta-data android:name="alias" android:value="valueToDistinguish"/>

<activity-alias>此处</activity-alias>标记内。

要提取元数据,您可以从PackageManager获取ActivityInfo
使用TargetActivity:
ActivityInfo appInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);

并通过以下方式提取元数据:
    private static String getAliasNameByMetaData(ActivityInfo app) {
    String aliasName = "";
    if (app.metaData != null && app.metaData.containsKey(ALIAS_META_DATA_KEY)) {
        aliasName = app.metaData.getString(ALIAS_META_DATA_KEY, "");
    } else {
        LOG.i("AliasName by META-DATA didn't work!");
    }
    LOG.v("AliasName by META-DATA: " + aliasName);
    return aliasName;
}

2. mActivityInfo

使用调试器检查Activity类,它包含一个mActivityInfo字段,该字段与ActivityInfo返回的getPackageManager().getActivityInfo()不同,因此您可以使用反射提取它并检查其名称。

注意:看来ActivityInfo返回的getPackageManager().getActivityInfo()mActivityInfoActivity的浅拷贝。因此,也许此方法不能解决问题:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);

10-07 22:12