Разве строковые ссылки не должны работать для имен действий фильтра намерений в AndroidManifest? - PullRequest
10 голосов
/ 14 декабря 2010

Первоначально мой 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")); начал свою активность без проблем.

Но яне был удовлетворен этим стилем кодирования.Раньше мне сурово говорили, что не следует использовать встроенные строковые константы, потому что это приведет к менее поддерживаемому коду.И это действительно точка.

Итак, сначала я объявил ap ublic static final String MY_ACTION = "com.company.project.TestActivity"; в своем классе App.java (тот, который я использовал) и достиг своего компонента через эту именованную константу следующим образом:

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 и изменил свое приложение:

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" />.После этого изменения, к моему большому удивлению, приложение перестало работать во время выполнения, жалуясь на то, что я не нашел Активность для своих намерений.Ссылка на строку, вероятно, была проанализирована неправильно.: (

Может быть, проблема в том, что R.string зависит от конфигурации ...? Но, эй, я не могу быть настолько безумным, чтобы выбрать такую ​​строковую ссылку, значение которой может измениться от config до config! И developer.android.com сказал мне, что можно использовать ссылки в именах действий! Я испытывал это поведение на уровнях API 6, 7, end 8. Это простая ошибка в системе Android? Или я что-то неправильно понимаю?

Iполностью озадачен, пожалуйста, помогите мне. Заранее спасибо.

1 Ответ

4 голосов
/ 21 марта 2011

У меня была та же проблема сегодня, и я искал ответ в другом месте. По словам Дайан Хэкборн, кажется, что то, что мы пытаемся сделать, запрещено. Вы, очевидно, должны использовать литеральные строки в фильтрах намерений.

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

...