Activity の特性

ContentProvider から検索してリスト表示されているものから、特定行行タップで特定列をキーにしてさらに検索して同じ Activity に表示、という実装を書く機会がありました。
通常 Activity はインスタンス複数生成可能な形になっているので、普通に Intent 作って startActivity してやれば異なるインスタンスとしてバックスタックに積まれるんですね。

実装

Intent の ACTION で切り分け。反則気味ですが通常表示は ACTION_VIEW で特定列をキーにして、な検索は ACTION_SEARCH ってことに。
とりあえず onCreate で ACTION とそれにまつわる処理を。

        Intent i = getIntent();
        mSearchMode = i.getAction();
        
        Log.d(TAG, "ACTION : " + mSearchMode);

        if (mSearchMode.equals(Intent.ACTION_SEARCH)) {
            mMemberId = i.getStringExtra(MEMBER);
            Log.d(TAG, "member : " + mMemberId);
        }

で、ACTION_DEFAULT なら行の OnClick を云々。

        if (mSearchMode.equals(Intent.ACTION_DEFAULT)) { 
            mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

あとは、ACTION の状態で onCreateLoader から戻すオブジェクトを調整。

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        if (mSearchMode.equals(Intent.ACTION_DEFAULT)) {
            return new CursorLoader(this, Contract.Hoge.contentUri, 
                                    null, null, null, null);
        } else if (mSearchMode.equals(Intent.ACTION_SEARCH)) {
            Uri uri = Uri.withAppendedPath(Contract.Hoge.contentUri, "member");
            uri = Uri.withAppendedPath(uri, mMemberId);
            Log.d(TAG, "onCreateLoader uri is " + uri);
            return new CursorLoader(this, uri, null, null, null, null);
        } else {
            return null;
        }
    }

最初、ACTION の状態でボタンのコールバックを設定するあたりはスルーしてたのですが、そのまんまにしといて何度行クリックしたらプログラムがオチるか試してみりゃ良かたかも。