TextViewに表示されているテキストからURL、@user、#hashなどの文字列を抽出してリンクにし、他のActivityを起動したい。(いわゆるTwitterクライアント)

この辺を参考に(特に2つ目)した。
http://developer.android.com/intl/ja/resources/articles/wikinotes-linkify.html
http://developer.android.com/intl/ja/resources/articles/wikinotes-intents.html
http://developer.android.com/intl/ja/guide/topics/intents/intents-filters.html

  1. リンク作成
    まず、Linkifyクラスで、該当の文字列を抜き出してリンクにする。
    httpで始まる単純なURLは、そのままの文字列で暗黙のIntentを発行。
    @userや#hashなどは、Linkify.TransformFilterを使って、content://で始まるURIに変換する。
    URIのサーバー名に当たる部分(Authorityという)は、パッケージ名などを元にユニークな名前にする。
     例:net.fchiba.sampleapp など。
    パスに当たる部分は、アプリごとに適当に設計する(RESTな感じで)。
     例: /user/(id) とか。

  2. ContentResolverの作成
    URIからMIMEタイプを求めるクラスを作成する。ContentResolverを継承したクラスを作成し、getTypeをオーバーロードする。サンプルを参考にして、getTypeのみ実装。
    MIMEタイプは、image/jpegなど決められているもの以外の場合、vndで始まりユニークになるように決める。
     例: @id なら vnd.net.fchiba.sampleapp.twitter/user、
        #hash なら vnd.net.fchiba.sampleapp.twitter/search とか
    作ったクラスをAndroidManifest.xmlに登録。
     <provider android:name=”(クラス名)” android:authorities=”net.fchiba.sampleapps” />

  3. 処理を受け取るActivityを作成
    1.で発行されるのは暗黙のintentなので、intent-filterで受け取る必要がある。
    発行されるActionは android.intent.action.VIEW。2.で決めたMIMEタイプで受け取るActivityを振り分ける。
    ユーザーを処理する Activityなら、
     <intent-filter>
      <action android:name=”android.intent.action.VIEW” />
      <category android:name=”android.intent.category.DEFAULT” />
      <data android:mimeType=”vnd.net.fchiba.sampleapp.twitter/user” />
     </intent-filter>
    など。


    TODO
    ・ユーザー名やハッシュタグを抜き出す正規表現を洗練させる。
    ・リンククリック時にメニューなどを表示させる方法を調べる。シングルクリックでデフォルトアクション、ロングクリックでメニュー選択がいいよね。android.intent.category.ALTERNATIVEなどが怪しげ。