2016-04-25 3 views
1

У меня есть действие, называемое A. Я хочу добавить два псевдонима активности B и C. Можно ли узнать, называется ли A кодом B или C в коде? Я хочу, чтобы применить другое поведение, когда она называется, как B или C.Проверить псевдоним активности на целевую активность

+0

Вы имеете в виду, когда вы начинаете деятельность, вы хотите знать, что она называется? – Shahzeb

+0

Да, я хотел бы знать, называется ли A «от» B или C – greywolf82

ответ

2

Вы можете предоставить дополнительную информацию для каждого <actvity-alias> в Manifest и оценить ActivityInfo с помощью PackageManager:

Чтобы проиллюстрировать это, давайте предположим, что вы хотите отобразить два TextView s в своей целевой Activity и установить контент в зависимости от того, какой псевдоним используется.

В Manifest, вы поставите следующие элементы:

<activity 
    android:name=".HalloActivity" 
    android:label="@string/HalloDefault" > 
</activity> 
<activity-alias 
    android:name=".SalutActivity" 
    android:targetActivity=".HalloActivity" 
    android:label="@string/SalutAlias"> 
    <meta-data android:name="LOCALE" android:value="fr" /> 
</activity-alias> 
<activity-alias 
    android:name=".HelloActivity" 
    android:targetActivity=".HalloActivity" 
    android:label="@string/HelloAlias"> 
    <meta-data android:name="LOCALE" android:value="en" /> 
</activity-alias> 

Чтобы использовать псевдоним, запустите Activity так:

Intent intent = new Intent(); 
String pName = getPackageName(); 
ComponentName componentName = new ComponentName(pName, pName + ".HelloActivity"); 
intent.setComponent(componentName); 
startActivity(intent); 

Тогда в то onCreate() метод HalloActivity, получить android:label и <meta-data> примерно:

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_hallo); 

    String text; 
    String label = "?"; 
    String locale = "de"; 
    int color; 

    Intent intent = getIntent(); 
    PackageManager pm = getPackageManager(); 
    try 
    { 
     ActivityInfo ai = pm.getActivityInfo(intent.getComponent(), PackageManager.GET_META_DATA); 

     label = getString(ai.labelRes); 

     Bundle b = ai.metaData; 

     if (b != null) 
     { 
      locale = b.getString("LOCALE"); 
      if (locale == null) 
      { 
       locale = "en"; 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Log.e(TAG, ex.getMessage()); 
    } 

    switch(locale) 
    { 
     case "en": 
      text = "hello world :)"; 
      color = Color.BLUE; 
      break; 
     case "fr": 
      text = "salut tout le monde :D"; 
      color = Color.RED; 
      break; 
     default: 
      text = "hallo zusammen ;)"; 
      color = Color.GREEN; 
    } 


    TextView tvHello = (TextView) findViewById(R.id.tvHello); 
    tvHello.setText(text); 
    tvHello.setTextColor(color); 

    TextView tvLabel = (TextView) findViewById(R.id.tvLabel); 
    tvLabel.setText(label); 
} 

Важно при работе с <activity-alias> (цитата из documentation):

За исключением targetActivity, атрибуты являются подмножеством деятельности атрибутов. Для атрибутов в подмножестве ни одно из значений, заданных для цели, не переносится на псевдоним. Однако для атрибутов, не входящих в подмножество, значения, установленные для целевой активности, также относятся к псевдониму.

<meta-data> в documentation.

Смежные вопросы