在AndroidManifest中,意图过滤器的操作名称不应该使用字符串引用吗?

10

最初我的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 吗?还是我对一些事情有误解?

我完全感到困惑,请帮助我。谢谢。

1个回答

4

嗨,MarkG,谢谢,我也倾向于相信这是情况。我们没有被视为能够区分配置相关和独立字符串的成年人。 :-) 我接受你的答案。 - Zsolt Szikora

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接