Developer's Blog

[追記あり] Android 開発で気をつけたいこと 〜変数名と Context について〜

2016年5月27日追記

こんにちは。共同開発部 開発担当の戸澤です。

2012年に書かれた以下の記事内容に関しては、ApplicationContextの使用を推奨する点で不適切であるとご指摘をいただいています。 詳しくは http://ytrino.hatenablog.com/entry/2016/05/26/033936 をご覧ください。

誤解を招かないよう、この追記分ではみなさんのご指摘を踏まえた Context の使い方について追記しています。オリジナル記事は後半に残しています。みなさまのご指摘に感謝します。

Contextの使い方

AndroidにおけるApplicationContextとActivityContextの使い分けについてですが、 Application全体のライフサイクルでcontextに依存する必要がある処理以外は、基本的にActivityContextを用いるべきです。

ApplicationContextを使用する状況

アプリケーション全体で使用する長いライフサイクルを持つインスタンスでcontextに依存しているもの。

例)Realmの初期化

RealmConfiguration config = new RealmConfiguration.Builder(context).build();
Realm realm = Realm.getInstance(config);

ActivityのContextを使用する状況

Android DeveloperのGoogle +への投稿(https://plus.google.com/+AndroidDevelopers/posts/36bAFHpKbCH)でも説明されていますが、Viewを生成する場合は、ApplicationContextを用いるとActivityに設定されたThemeを適切に設定することができずデザイン上の不具合を招くケースが発生します。
Activity上のViewやインスタンスでcontextを渡す必要がある場合は、以下の使い方が適切です。

・Activity内で使う場合

 → this(自身をcontextとして渡す)

・Fragment上で使う場合

 → Fragment.getActivity()でFragmentを載せているActivityを取得する

まとめ

Contextは依存するインスタンスのライフサイクルを考慮して適切なものを使用する必要がある。

・アプリケーション全体のライフサイクルで使用する場合のみ、十分に検討した上でApplicationContextを使う。

・ViewやIntentの生成やFragment上で使用するcontextにはActivityのcontext(this)を用いる。

・AlertDialog.Builder等直接getActivity()できないがViewをinflateするのにcontextが必要なケース。

 → getContext()メソッドが用意されているのでそちらを使う。

今後もFenrir Developer’s Blog では開発者の皆様に有益な情報をご提供できるよう、エンジニア一同努めてまいりますのでよろしくお願いいたします。

オリジナル記事

以下、2012年当時のオリジナル記事です。冒頭に書いたような指摘をふまえてお読みください。


こんにちは。共同開発部でエンジニアをしている森河内です。

最近は Android の開発を担当しています。Androidの開発では設計から開発まで担当することが多いです。最近ソースコードレビューをする機会があり、レビューしていて取りあえず気をつけてほしいなと感じたことを今回は2点ほど書きました。

変数名の付け方

変数名は分かりやすく命名するというのは基本だと思います。個人的には日本語をアルファベットで書くのはかっこわるいような気がするので、極力英語で書くように努めています。また、Android では以下のようなルールを守ることが推奨されています。

public と static 以外 : 変数名は m で始める
static : 変数名は s で始める
public : 小文字で始める
定数 : アンダースコアを含む大文字だけにする

例:

public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    private int mFooValue;
    protected String mFooString;
}

私も以前は安易な名前や上記のルールを失念してしまうことが多かったのですが、最近きちんと守って開発できていると感じています。以下の URL には他にもいろいろと書いてあるので、読んでみると良いと思います。
(参考URL:http://source.android.com/source/code-style.html#follow-field-naming-conventions)

Contextの使い方

Android では、Intent の生成時等に Context を引数としてとることが多々あります。
Context とは、アプリケーションのグローバルな環境情報を受け渡すために使用されるものです。Context には、Application Context と Activity Context の2種類が存在します。Application Context は Activity クラス内で getApplicationContext() で取得できます。Activity Context は Activity 自身です。( Activity クラスが Context クラスを継承しています)引数に this を入れるだけで使用できます。
Context の引数として以下のように Activity 自身を MainActivity.this のようにして渡しても、一見問題なく動作するのですが、メモリーリークをする危険性があります。
(参考 URL : http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html )

new Intent(MainActivity.this, FooActivity.class);

特に理由がない場合は、以下のように this ではなく getApplicationContext を使用する方が無難ですし、メモリリークが起きることを回避することができます。

new Intent(getApplication(), FooActivity.class);

ただ、入門書等にも Context を引数としているところで getAcpplicationContext で問題がないところに this を入れている場合があるので、注意した方が良いかと思います。

まとめ

今回書いた2点については、Android開発者にとっては基本的なことですが、Android開発をはじめたばかりの人は抜けていたり、知らなかったりすることがあるかと思います。アプリケーションの品質を確保するには今回書いたことなど当たり前のことをきちんと積み重ねることが重要だと思います。

フェンリルの開発者アカウントでは、フェンリルプロダクトの最新開発情報などをつぶやいています。よろしければフォローしてください!

Copyright © 2019 Fenrir Inc. All rights reserved.