元々、私の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クラス(使用したクラス)でapを宣言ublic static final String MY_ACTION = "com.company.project.TestActivity";
し、次のようにこの名前付き定数を介してコンポーネントに到達しました。
startActivity(new Intent(App.MY_ACTION));
これははるかに優れているように見えましたが、それでも同じ文字列の2つのインスタンスを維持する必要がありました。http://developer.android.com/reference/android/R.styleable.html#AndroidManifestAction_nameで読む
...これは、値を含むリソース( "@ [package:] type:name"の形式)またはテーマ属性( "?[package:] [type:] name"の形式)への参照である場合もあります。このタイプの。
したがって、この文字列を1回だけ定義するのは問題ないと思いました。<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ごとに変わる可能性のあるそのような文字列参照を選択するのはそれほど狂気ではありません!そして、developer.android.comは、アクション名で参照を使用しても問題ないと言っていました。私はAPIレベル6、7、エンド8でこの動作を経験しました。これはAndroidシステムの単なるバグですか?それとも私は何かを誤解していますか?
私は完全に困惑しています、助けてください。前もって感謝します。