我有一个名为A的活动。我想添加两个名为B和C的活动别名。是否可以知道A在代码中是否被称为B或C?当它被称为B或C时,我想应用不同的行为。
答案 0 :(得分:3)
您可以向<actvity-alias>
中的每个Manifest
提供一些其他信息,并在ActivityInfo
的帮助下评估PackageManager
:
为了说明这一点,我们假设您要在目标TextView
中显示两个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);
然后在 HalloActivity 的onCreate()
方法中,获取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外,属性是活动属性的子集。对于子集中的属性,为目标设置的值都不会转移到别名。但是,对于不在子集中的属性,为目标活动设置的值也适用于别名。
详细了解documentation中的<meta-data>
。