はじめに

ひっさびさに技術的な話を書くよ。でも技術の話というよりも、俺はこう思うという話なのでQiitaに上げるよりはブログに書くことにした次第。

extends Activity OR extends MyActivity

Androidアプリ開発するうえで、以下のようにしてActivityクラスを継承したクラスを作ることは非常に多いかと思う。

public class HomeActivity extends Activity {
    // snip
}

まぁ最近はandroid.support.v7.app.ActionBarActivityとかを継承することが多いのですが。 それはそれとして、Activityをそのまま継承する方法はサンプルコードでは非常によく出てくることです。 しかし、Githubなどで公開されているプロジェクトを見ると、あえてActivityクラスを継承したMyActivityという具合のクラスを作り、実体となるHomeActivityなどではMyActivityを継承しているケースが多い。こんなかんじ。

public class HomeActivity extends MyActivity {
    // snip
}

public class MyActivity extends Activity {
    // snip
}

で、どっちが良いかという話が個人的にずっと付きまとっていたのだけど、最近やっと自分なりの答えが出たので書いておきます

結論:どんな規模のアプリであれActivityを継承したクラスを作ったほうが良い

理由としては、例えば以下のようなことをしたいときが多々ある。

  • ネットワーク通信中にProgressBarもつ画面をスクリーン全体に表示させたい
  • 頻繁に似たデザインのダイアログを表示する
  • Toastをよく出す

こういう場合に、直接Activityを継承していると、毎回別々のActivityに同じような命令をコピペしていくことになるわけです。 今更書くことでもないですが、全く同じ実装が複数箇所に点在するというのはひどい。

しかし、Activityを継承したクラスを継承している場合、「Activityを継承したクラス」に実装しておけば命令を使いまわせるわけですね。

public class MyActivity extends ActionBarActivity {

    ProgressDialogFragment progress;

    // snip

    private void toggleProgressHID(boolean isVisible) {
        FragmentManager manager = getSupportFragmentManager();

        if (isVisible) {
            if (progress == null) {
                progress = new ProgressDialogFragment();
            }
            progress.show(manager, "progress");
        } else {
            if (progress != null) {
                progress.dismiss();
            }
        }
    }
}

ちなみに ProgressDialogFragment は以下のURLにあるコードを参照しました。 - Full screen ProgressDialog (for Android)

こうしておけば、toggleProgressHID(true)すると画面全体をProgressBarで覆い、toggleProgressHID(false)すると消えるようになるはず。

注意点として、DialogFragmentを使っているので、Activityを継承していると古い端末で使えないので、継承するクラスはFragmentActivityとかActionBarActivityを使うと良いです。