Intereting Posts
Android – можно ли отключить звук в настоящее время в аудио-приложениях? Android – увеличение / уменьшение местоположения RelativeLayout с распространением / пинчем Android.app.Application нельзя использовать для android.app.Activity Как центрировать выравнивание вида? Побочные эффекты изменения фильтра и требования к существующему приложению в Android Play / Market Как изменить целевой эмулятор в Android Studio? Файл конфигурации Android Studio ORMLite – не удалось найти Raw Directory Как изменить цвет точек меню опций? Как центрировать несколько видов вместе, используя ConstaintLayout? Android простой Junit с кинжалом 2 Ошибка при запуске AVD с процессором AMD Как обнаружить все устройства, подключенные в сети WiFi от приложения Android Как получить время в миллисекундах в Android Shell? Каков правильный способ расширения EditText, чтобы придать ему дополнительные функции «по умолчанию» CoordinatorLayout: Скрытие / отображение наполовину видимой панели инструментов?

Извлечь / отличить имя ActivityAlias ​​от TargetActivity

У меня есть несколько ActivityAliases которые запускают одну единственную TargetActivity . Внутри моей TargetActivity я пытаюсь отличить псевдоним, который запустил TargetActivity .

Эти псевдонимы определены в Manifest как запускаемые (умышленный фильтр), которые будут отображаться как ярлыки на рабочем столе. Пользователь нажимает на ярлык, и андроид начнет действие, которое я определил в android:targetActivity=..

Для этого я в настоящее время извлекаю имя componentName из Intent , которое присваивается моей TargetActivity и использует className() .

Подобно:

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

Это отлично подходит для множества устройств. Но в настоящее время я вижу некоторые сбои в OnePlus . На этом устройстве моя техника возвращает классName моей 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; } 

Редактировать:

mActivityInfo класс Activity с помощью отладчика, он включает в mActivityInfo поле 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); 

Solutions Collecting From Web of "Извлечь / отличить имя ActivityAlias ​​от TargetActivity"