字符串引用不应该适用于AndroidManifest中的intent过滤器的动作名称吗?

时间:2010-12-13 23:23:33

标签: android action android-manifest intentfilter string-literals

最初我的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"));启动我的活动没有任何问题。

但我对这种编码风格并不满意。早期我被告知不要使用内联定义的字符串常量,因为它会导致代码的可维护性降低。它真的一个点。

所以首先我在我的App.java类(我用过的那个)中声明了一个p ublic 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”)包含此类型的值。

所以我猜想将这个字符串定义 JUST ONCE 会好的。我将<string name="MY_ACTION">com.company.project.TestActivity</string>放在strings.xml中并修改了我的App:

public class App ...
    public static String MY_ACTION;

    @Override
    public void onCreate() {
        super.onCreate();
        MY_ACTION = getString(R.string.MY_ACTION);
    ...

一切都还是O.K。

...直到我将AndroidManifest.xml更改为使用<action android:name="@string/MY_ACTION" />而不是<action android:name="com.company.project.TestActivity" />。 在此次更改后,我最大的惊喜是应用程序在运行时崩溃,抱怨没有为我的意图找到活动。字符串引用可能未正确解析。 :(

问题可能是R.string依赖于配置......?但是嘿,我不能这么疯狂地选择这样一个字符串引用,其值可能会从config更改为config! developer.android.com告诉我这是O.K.在动作名称处使用引用!我在API级别6,7,结束8时遇到过这种行为。它只是android系统中的一个简单错误吗?或者我误解了什么?

我完全不解,请帮助我。提前谢谢。

1 个答案:

答案 0 :(得分:4)

我今天遇到了同样的问题,并在其他地方寻找答案。根据Dianne Hackborne的说法,我们试图做的事情是不允许的。您显然必须在intent过滤器中使用文字字符串。

http://android.bigresource.com/Track/android-zKGKHraw9/