Android 从TargetActivity提取/区分ActivityAlias名称
我有多个ActivityAlias,它们都从一个TargetActivity开始。 在我的TargetActivity中,我尝试区分开始的别名 目标活动 这些别名在清单中定义为launchables意图过滤器,它将显示为 主屏幕上的快捷方式。用户将单击快捷方式和android 将启动我在android中定义的活动:targetActivity=。。标签 为此,我目前从Intent中提取componentName,即 指定给我的TargetActivity并使用类名 比如: 这适用于许多设备。但是现在我看到了一些失败 OnePlus。在该设备上,我的技术只返回 我的目标活动,因此我无法根据 用户启动的别名 是否有其他可靠的方法来获取用于 启动目标活动?它不需要是名称本身,只要 因为我能分辨出来。我不想为每个别名创建专用的TargetActivity 谢谢 注:我看到了另一种方法,它使用PackageManager来检索 activityInfo并使用Activity.name。但我怀疑这是否会发生 返回与我的第一个方法不同的内容Android 从TargetActivity提取/区分ActivityAlias名称,android,android-intent,android-activity,android-manifest,android-activity-alias,Android,Android Intent,Android Activity,Android Manifest,Android Activity Alias,我有多个ActivityAlias,它们都从一个TargetActivity开始。 在我的TargetActivity中,我尝试区分开始的别名 目标活动 这些别名在清单中定义为launchables意图过滤器,它将显示为 主屏幕上的快捷方式。用户将单击快捷方式和android 将启动我在android中定义的活动:targetActivity=。。标签 为此,我目前从Intent中提取componentName,即 指定给我的TargetActivity并使用类名 比如: 这适用于许多设备。但是
ActivityInfo aInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);
String aliasName = aInfo.name;
我还尝试了元数据:
编辑:
不幸的是,这种方法并不适用于所有设备。
如果activity.component中解析的别名类名返回
目标活动,那么元数据方法也失败了
我继续寻找答案,并找到了解决问题的好办法
在TargetActivity中区分我的别名
您可以在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>
<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>
并通过以下方式提取元数据:
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;
}
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字段,该字段与getPackageManager.getActivityInfo返回的ActivityInfo不同,因此您可以使用反射提取它并检查它的名称
注意:getPackageManager.getActivityInfo返回的ActivityInfo似乎是活动中mActivityInfo的浅拷贝。因此,这种方法可能无法解决问题:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
一,。元数据
不幸的是,这种方法并不适用于所有设备。
如果activity.component中解析的别名类名返回
目标活动,那么元数据方法也失败了
我继续寻找答案,并找到了解决问题的好办法
在TargetActivity中区分我的别名
您可以在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>
<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>
并通过以下方式提取元数据:
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;
}
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;
}
二,。mActivityInfo
使用调试器检查Activity类时,它包含一个mActivityInfo字段,该字段与getPackageManager.getActivityInfo返回的ActivityInfo不同,因此您可以使用反射提取它并检查它的名称
注意:getPackageManager.getActivityInfo返回的ActivityInfo似乎是活动中mActivityInfo的浅拷贝。因此,这种方法可能无法解决问题:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
元数据方法究竟是如何失败的?ActivityInfo中没有元数据。如果在调试时检查targetActivity,mActivityInfo字段是否显示您的活动或别名?对于我,在我的测试设备上,它显示别名。过去,我使用mActivityInfo.name来区分我的别名。但不幸的是,在野外,有些设备的mActivityInfo返回targetActivity。您应该回答自己的问题。这将从未回答的问题列表中删除该问题,并可能帮助其他有类似问题的人。