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
は実行できなかったので、多分そういうこと。
近いうちにちゃんと調べよう。
寝る。