Извлечь / отличить имя 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);
Другие вопросы по тегам