ひらい ぶらり Hi-Library

ぷろぐらみんぐについて。ときどきどうでもいいことについて。

preference でintentを飛ばしたい

preferenceは何もxmlだけで書かなくても、intentで飛ばすことができるらしい。
僕は設定画面からOuth認証させたかったので、通常のxmlだけでは定義できないので普通のActivityに飛ばしたい。

で、注意したいのがintentを使用するときにtargetClassはパッケージ名も含めて書くということらしい。

    <PreferenceScreen
           android:title="[タイトル]"
           android:summary="[サマリ]">
       <intent android:action="android.intent.action.MAIN"
               android:targetPackage="[パッケージ名]"
               android:targetClass="[パッケージ名].[クラス名]" />
   </PreferenceScreen>

参考: http://blog.utils.jp/2009/10/xml-preference-intent.html
参考: http://d.hatena.ne.jp/mumoshu/20100504/1272971062

なるほどなるほど!こうしないとActivityNotFoundExceptionが発生する。
いえーい実行!

ActivityNotFoundException

orz

なんでだ!
問題はパッケージを無駄に切りまくってたせい。
android開発する時ってActivityをパッケージに分けたりしないのかな・・・。作法がよくわからん。
おんなじことにハマる人がいるかどうか分からないけど、一応ブログに残しておこう。

パッケージの構成としては↓みたいに分けていた。

jp.hoge.android.app
jp.hoge.android.app.auth

で、manifest.xmlには

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.hoge.android.app">

こうかいてある。で、僕はtargetPackegeに

    <PreferenceScreen
           android:title="[タイトル]"
           android:summary="[サマリ]">
       <intent android:action="android.intent.action.MAIN"
               android:targetPackage="jp.hoge.android.app.auth"
               android:targetClass="jp.hoge.android.app.auth.AuthActivity" />
   </PreferenceScreen>

みたいに書いちゃったんですよ。
そもそもJavaのパッケージって概念がなんなのかもよくわかってないし、targetPackageが何を指しているのかもわかってないからこういう事になるんですね。わからずにとりあえず書いてます。
で、何が行けないって本当はこう書かなきゃいけないみたいです。

    <PreferenceScreen
           android:title="[タイトル]"
           android:summary="[サマリ]">
       <intent android:action="android.intent.action.MAIN"
               android:targetPackage="jp.hoge.android.app"
               android:targetClass="jp.hoge.android.app.auth.AuthActivity" />
   </PreferenceScreen>

manifestに書いてあるpackageがtargetPackageにあたるみたい。たぶん。
つまり
jp.hoge.android.appまでがパッケージで.auth.AuthActivityがクラス名ということらしい。

http://d.hatena.ne.jp/minghai/20090316/p1 を参考に

am start -n jp.hoge.android.app/.auth.AuthActivity

は実行できたけど

am start -n jp.hoge.android.app.auth/.AuthActivity

は実行できなかったので、多分そういうこと。
近いうちにちゃんと調べよう。
寝る。