Android Tips #1

Android で最近わかったこと。

ClassLoader が複雑

Android の ClassLoader の仕組みは、Dalvik VM がプロセスをフォークするという性質上、普通の Java のそれとは異なる感じです。

やろうとしたのは BroadcastReceiver でブロードキャストを受信した際に、自分自身を Classloader#loadClass(String) で生成しようとすることです。

    @Override
    public void onReceive(final Context context, Intent intent) {
        Class<?> clazz = getClass().getClassLoader().loadClass(getClass().getName());
    }

これが ClassNotFoundException を発生させます。

普通、自身のクラスの ClassLoader なら、自身のクラスが見つかるはずなんですが・・・。

Activity だとどうで、Service だとどうで、というのは暇ができたら検証してみたいです。

AndroidManifest.xml の intent-filter に @string/hoge は使えない

なんかブロードキャストを受信しないなぁ、と思ったらこれが原因でした。

    <intent-filter>
        <action android:name="@string/hoge" />
    </intent-filter>

たぶん、action タグの android:name 属性内では @string/hoge は展開されず、そのままの文字列として使われてしまうんだと思います。

定義を一箇所にまとめたいと思ったのですが、必ず分散してしまうということになりますね・・・。