Извлечь / отличить имя ActivityAlias от TargetActivity
У меня есть несколько ActivityAliases
которые все начинаются одним TargetActivity
, Внутри моего TargetActivity
Я пытаюсь различить псевдоним, который начал TargetActivity
,
Псевдонимы определены в Manifest
как запускаемые (интент-фильтр), которые будут отображаться в виде ярлыков на домашнем экране. Пользователь нажмет на ярлык, и Android запустит действие, которое я определил в android:targetActivity=..
" тег.
Для этого я в настоящее время извлекаю componentName
от Intent
, который дается моей TargetActivity и используя className()
,
Подобно:
String aliasName = targetActivity.getComponentName().getClassName();
Это отлично работает для многих устройств. Но в настоящее время я вижу некоторые сбои в OnePlus. На этом устройстве моя методика возвращает только className моей TargetActivity, и поэтому я не могу выполнить действие, основываясь на псевдониме, который запустил пользователь.
Есть ли другие, надежные способы получить ActivityAlias
который был использован для запуска TargetActivity
? Это не должно быть само название, пока я могу их различать. Я не хочу создавать выделенные целевые действия для каждого псевдонима!
Спасибо!
Ps.: Я видел другой способ, который использует PackageManager для извлечения ActivityInfo и с помощью Activity.name. Но я сомневаюсь, что это вернет нечто иное, чем мой первый подход.
ActivityInfo aInfo = activity.getPackageManager().getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA);
String aliasName = aInfo.name;
Я также попробовал метаданные:
Редактировать:
К сожалению, этот метод не работает для всех устройств. Если разобрали alias-className
из Activity.component возвращает target-activity
, то подход метаданных тоже терпит неудачу.
Я продолжил поиск ответа и нашел хороший обходной путь, чтобы различать мои псевдонимы внутри TargetActivty.
Вы можете предоставить метаданные в вашем теге 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>
тег.
Чтобы извлечь метаданные, вы можете получить ActivityInfo из PackageManager с 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()
это мелкая копия mActivityInfo
от Activity
, Итак, возможно, этот метод не решает проблему:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);
1 ответ
1. Метаданные
К сожалению, этот метод не работает для всех устройств. Если разобрали alias-className
из Activity.component возвращает target-activity
, то подход метаданных тоже терпит неудачу.
Я продолжил поиск ответа и нашел хороший обходной путь, чтобы различать мои псевдонимы внутри TargetActivty.
Вы можете предоставить метаданные в вашем теге 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>
тег.
Чтобы извлечь метаданные, вы можете получить ActivityInfo из PackageManager с 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()
это мелкая копия mActivityInfo
от Activity
, Итак, возможно, этот метод не решает проблему:
Field field = Activity.class.getDeclaredField("mActivityInfo");
field.setAccessible(true);
ActivityInfo value = (ActivityInfo) field.get(this);
Log.e("APPINFO2", "NAME: " + value.name);