最初我的AndroidManifest.xml文件包含一个通过自定义动作名称启动的活动。
<activity
android:label="HERE I AM"
android:name="TestController">
<intent-filter>
<action android:name="com.company.project.TestActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
使用这个清单文件 startActivity(new Intent("com.company.project.TestActivity"));
启动我的 Activity 没有出现任何问题。
但是我对这种编码风格并不满意。早些时候,我被告知不要使用内联定义的字符串常量,因为它会导致代码难以维护。这确实是一个问题。
所以我首先在我的 App.java 类中声明了一个 public static final String MY_ACTION = "com.company.project.TestActivity";
,并通过这个命名常量来访问我的组件:
startActivity(new Intent(App.MY_ACTION));
这看起来好多了,但我仍然需要维护两个相同的字符串。在http://developer.android.com/reference/android/R.styleable.html#AndroidManifestAction_name上读到:
...这也可以是对包含此类型值的资源(形式为"@ [package:]type:name")或主题属性(形式为"?[package:][type:]name")的引用。
所以我猜只定义一次这个字符串就可以了。我在 strings.xml 中放置了 <string name="MY_ACTION">com.company.project.TestActivity</string>
并修改了我的 App:
public class App ...
public static String MY_ACTION;
@Override
public void onCreate() {
super.onCreate();
MY_ACTION = getString(R.string.MY_ACTION);
...
一切都仍然是好的。
... 直到我更改了AndroidManifest.xml,使用 <action android:name="@string/MY_ACTION" />
替代了 <action android:name="com.company.project.TestActivity" />
。在这次更改之后,令我惊讶的是应用在运行时崩溃, complaining about not finding the Activity for my intent. 该字符串引用可能没有被正确解析。:(
也许问题在于 R.string 是依赖于配置的...? 但是我不能如此疯狂地选择这样一个字符串引用,其值可能会从配置到配置发生变化! developer.android.com 告诉我,在 action 名称中使用引用没问题!我在 API 级别 6、7 和 8 中遇到了这种情况。这只是 Android 系统中的一个简单 bug 吗?还是我对一些事情有误解?
我完全感到困惑,请帮助我。谢谢。