<HOME

Androidアプリプロジェクトの概要30分


「Hello World!」アプリを例として、Androidアプリのプロジェクト構成を理解していきます。

  • まずは、Android Studioを起動して「Hello World!」アプリのプロジェクトを表示し、画面左のProjectウィンドウの「app」を開いてください。

    「manifests」「java」「res」の3種類のフォルダが表示されます。

    Androidアプリは大きく分けて「マニフェスト」「ソースコード」「リソース」で構成されています。

  • マニフェストについて学習します。

    1. マニフェストは、このアプリがどういったものなのかを宣言するファイルです。

      Android OSは、アプリのマニフェストから、そのアプリをどう扱うべきかを知ることができます。

      詳細については公式サイトに記載されています。

      すべてのアプリには、そのルート ディレクトリに AndroidManifest.xml(ファイル名はこのまま)が必要です。 マニフェスト ファイルはアプリに関する重要な情報を Android システムに提供します。これは、システムがアプリのコードを実行する前に必要な情報です。

      その他、マニフェスト ファイルでは次のことを行います。
      • アプリの Java パッケージ名を指定します。パッケージ名は、アプリの一意の識別子としての機能を果たします。
      • アプリのコンポーネント(アプリを構成するアクティビティ、サービス、ブロードキャスト レシーバー、コンテンツ プロバイダ)を記述します。また、各コンポーネントを実行するクラス名を指定し、機能を公開します。扱えるのは、Intent メッセージなどです。Android システムにコンポーネントと起動可能な状態であることを知らせる役目を果たします。
      • アプリのコンポーネントをホストするプロセスを決定づけます。
      • アプリが API の保護された部分にアクセスし、他のアプリとやり取りする際に必要となるパーミッションを宣言します。また、他のアプリがアプリのコンポーネントとやり取りするために必要なパーミッションも宣言します。
      • アプリの実行時にプロファイリングやその他の情報を提供する Instrumentation クラスを記載します。これらの宣言は、アプリの開発時にのみマニフェストに含まれ、アプリの公開前に削除されます。
      • アプリに必要な Android API の最小限のレベルを宣言します。
      • アプリにリンクする必要があるライブラリを記載します。
    2. 「Hello World!」アプリのマニフェストを見てみましょう。

      1. 「manifests」をダブルクリックし、「AndroidManifest.xml」を表示します。

        AndroidManifest.xml

        コードを表示するにはJavaScriptを有効にしてください

      2. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        これは今のところは、AndroidManifestに必ず記載する、おまじないのようなものだと思っておいて良いです。

        XML文書であることの宣言と、XMLのNameSpaceの定義を行っています。

      3. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        このアプリのパッケージ名を宣言しています。


        Android OSは、「HelloWorld」のようなプロジェクト名ではなく、パッケージをユニークな識別子としてアプリを認識します。

        これにより、同名のアプリであっても同一端末内で共存することが可能です。

        例えば、「a.example.com」さんの「HelloWorld」アプリと「b.example.com」さんの「HelloWorld」アプリを、同じ端末にインストールできます。


        パッケージ名は、

        「製作者のドメインを逆さにしたもの」+「.」+「アプリプロジェクト名」 (全て英小文字)

        を使用するのが一般的です。

      4. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        「application」タグで、このアプリの定義を行っています。

        使用するActivity等の宣言は子要素にて行いますが、アプリの全体的な定義は属性にて記述されています。


        • android:icon

          アプリのアイコン画像を指定します。

          ここで設定された画像は、ランチャーアプリや、設定アプリのアプリ設定画面上で表示されます。

          使用する画像はリソース(後述)から指定します。

        • android:label

          アプリの名前を指定します。

          ここで設定された名前は、ランチャーアプリや、設定アプリのアプリ設定画面上で表示されます。

          使用する文字列はリソース(後述)から指定します。

        • android:theme

          アプリのテーマを指定します。

          指定されたスタイルに応じて、各種UIの振る舞いが変更されます。

          例えば、「アプリの見た目を白ベースではなく黒ベースにしたい」と思った時、
          いちいちソースコードやリソースファイルを細かく修正しなくても、
          テーマを変更するだけで簡単にUIを変更することができます。

      5. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        「activity」タグで、このアプリで使用するActivityの定義を行っています。

        「Activity」は、画面を構成するためのオブジェクトです。

        (詳細については公式サイトに記載されています。)


        使用するActivityの数だけ、「activity」の宣言が必要です。


        • android:name

          使用するActivityのクラス名を指定します。

          ここでは、ソースコードにて定義された「MainActivity」というクラスを指定しています。

          名前には、クラス名の前にパッケージ名をつけた「com.example.s.helloworld.MainActivity」
          もしくは、それからアプリのパッケージ名を除いた「.MainActivity」を指定できます。

      6. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        「intent-filter」タグで、Activityが受信できるIntentの定義を行っています。

        「Intent」は、アプリ同士のプロセス間通信を実現するためのメッセージオブジェクトです。

        (詳細については公式サイトに記載されています。)


        例えば、アプリAからアプリBのActivityを表示したい、といった場合、アプリAが起動用のIntentを発行し、
        それを受けてAndroid OSが対応するActivityを起動します。

        1つのアプリ内でActivity-AからActivity-Bを起動する場合でも、Intentを発行してAndroid OSにActivityを起動してもらいます。


        また、ActivityなどがIntentを受信できるようにするためには、「IntentFilter」を登録しておく必要があります。

        IntentFilterに「自分はこのIntentを受信できるよ」と指定しておくことで、
        Android OSが「この子はこのIntentを受信可能なんだ」と判断してくれます。

        ここでは、MainActivityが「ランチャーからの起動要求Intentを受け付けることができるよ」ということをAndroidManifestにて宣言しています。

  • リソースについて学習します。

    1. Androidアプリでは、文字列や画像といった静的なデータをリソースとして登録しておくことで、
      ソースコードや他のリソースから容易に利用することができます。

      また、リソースを活用することで、異なる解像度への対応や、多言語対応、UIの一括変更などがやりやすくなります。

      詳細については公式サイトに記載されています。

    2. 「Hello World!」アプリのリソースを見てみましょう。

      1. Projectウィンドウにて「res」を開きます。

        「drawable」「layout」「mipmap」「values」フォルダが格納されています。

      2. 「drawable」は、画像リソースを格納するフォルダです。

        1. 「drawable」を開くと、画像リソースが表示されます。

          名前の後ろに「(…)」が記載されているものがあります。


          リソースは、解像度や多言語など、複数の条件への対応をフォルダ分割することで実現しています。

          例えば、デフォルト画像を「drawable」フォルダ・高解像度用の画像を「drawable-hdpi」フォルダへ同名で格納すると、
          高解像度端末でアプリ実行される場合は「drawable-hdpi」の方が使用されます。


          Android Studioではフォルダ分けされた同種のリソースを見やすくまとめてくれており、
          デフォルトではないものに関しては名前の後ろに「(…)」が表示されています。

          今回のケースは、「ic_launcher_foreground.xml」が「drawable-v24」に格納されている、ということになります。

        2. エクスプローラ上で実際のフォルダ構成を確認してみましょう。

        3. なお、「画像リソース」と謳いながらも、今回格納されているのはXML(テキスト)ファイルです。

          通常、drawableにはPNG等のガチの画像リソースを格納しますが、AndroidではXMLを利用して画像を作る仕組みがあります。

          「ic_launcher_background.xml」をダブルクリックして開いてみましょう。

          中身はXMLで記述されていますが、右側のPreviewウィンドウには画像が表示されています。

          このように、XMLで画像を作ることができますので、背景画像の作成やファイルサイズの調整に活用できます。

          詳細については公式サイトに記載されています。

        4. 他のリソースから呼び出す際の指定方法は<「@drawable/」+ファイル名(拡張子無し)>です。

          @drawable/ic_launcher_background

          ソースコードから呼び出す際の指定方法は<「R.drawable.」+ファイル名(拡張子無し)>です。

          R.drawable.ic_launcher_background

      3. 「mipmap」も、画像リソースを格納するフォルダです。

        drawableとの違いは、端末の実解像度に合わせた画像の拡縮時の変換方法などです。

        通常はそこまで細かく気にせずdrawableを使用すれば良いと思いますが、

        ランチャーアイコンについてはmipmapを使用する方が画質劣化が少なく、推奨されているようです。

        1. 「mipmap」を開くと、画像リソースが表示されます。

          「drawable」で学習した通り、画面解像度に合わせた画像が格納されていることがわかります。

        2. 他のリソースから呼び出す際の指定方法は<「@mipmap/」+ファイル名(拡張子無し)>です。

          @mipmap/ic_launcher

          ソースコードから呼び出す際の指定方法は<「R.mipmap.」+ファイル名(拡張子無し)>です。

          R.mipmap.ic_launcher

      4. 「values」は、文字列など、値に関するリソースを格納するフォルダです。

        1. 「values」を開くと、「colors.xml」「strings.xml」「styles.xml」が表示されます。

        2. 「colors.xml」には、色の定義が記載されています。

          colors.xml

          コードを表示するにはJavaScriptを有効にしてください

          <resources>要素の中に、子要素<color>を定義し、名前と値を指定します。

          名前は属性nameで指定します。この名前をソースコードやほかのリソースファイルから参照することで、対応する色が適用されます。

          値はテキストノードに「#」+「RGBもしくはARGBの16進表記」で記述します。

          例えば赤色は「#FF0000」や「#FFFF0000」となります。


          他のリソースから呼び出す際の指定方法は<「@color/」+名前>です。

          @color/colorPrimary

          ソースコードから呼び出す際の指定方法は<「R.color.」+名前>です。

          R.color.colorPrimary


        3. 「strings.xml」には、文字列の定義が記載されています。

          strings.xml

          コードを表示するにはJavaScriptを有効にしてください

          <resources>要素の中に、子要素<string>を定義し、名前と値を指定します。

          名前は属性nameで指定します。この名前をソースコードやほかのリソースファイルから参照することで、対応する文字列が適用されます。

          値はテキストノードに記述します。


          他のリソースから呼び出す際の指定方法は<「@string/」+名前>です。

          @string/app_name

          ソースコードから呼び出す際の指定方法は<「R.string.」+名前>です。

          R.string.app_name


        4. 「styles.xml」には、UI等のスタイルの定義が記載されています。

          styleを利用することで、Viewの表示を統一したり、タイトルバーの色を変えたり、Dialogの見た目を変えたり、といったことができるようになります。

          詳細については公式サイトに記載されています。

          こちらのサイトも非常に分かり易いです。


          styles.xml

          コードを表示するにはJavaScriptを有効にしてください

          <resources>要素の中に、子要素<style>を定義し、名前とアイテムを指定します。

          名前は属性nameで指定します。この名前をソースコードやほかのリソースファイルから参照することで、対応するスタイルが適用されます。


          他のstyleを引き継ぐ場合は、属性parentで指定します。


          アイテムは<style>要素の中に、子要素<item>を定義します。

          名前を属性nameで指定し、対応する値をテキストノードに記述します。


          他のリソースから呼び出す際の指定方法は<「@style/」+名前>です。

          @style/AppTheme

          ソースコードから呼び出す際の指定方法は<「R.style.」+名前>です。

          R.style.AppTheme


      5. 「layout」は、画面に表示するViewのレイアウトを定義するリソースを格納するフォルダです。

        詳細については公式サイトに記載されています。

        1. 「layout」を開くと、レイアウトリソースが表示されます。「activity_main.xml」を開きます。

          中身はXMLで記述されており、「Text」タブを選択することでコードが表示されます。

          右側のPreviewボタンをクリックすると、プレビューの確認が可能です。

          activity_main.xml

          コードを表示するにはJavaScriptを有効にしてください

        2. 次の記述について説明します。

          コードを表示するにはJavaScriptを有効にしてください

          これは今のところは、おまじないのようなものだと思っておいて良いです。

          XML文書であることの宣言と、XMLのNameSpaceの定義を行っています。

        3. 次の記述について説明します。

          コードを表示するにはJavaScriptを有効にしてください

          「res-auto」や「tools」を利用する場合にXMLのNameSpaceの定義が必要となります。

          今回は「app:layout_constraint○○」や「tools:context」を利用しているので必要になります。

        4. 次の記述について説明します。

          コードを表示するにはJavaScriptを有効にしてください

          このレイアウトのルートとなるViewに「android.support.constraint.ConstraintLayout」クラスを使用しています。

          幅・高さは「親Viewに合わせる」ように設定しています。(すなわち、画面全体に表示する指定ということです。)

        5. 次の記述について説明します。

          コードを表示するにはJavaScriptを有効にしてください

          このViewのイベントを使用するcontextとして「com.example.s.helloworld.MainActivity」を指定しています。

          これによりレイアウト内に「onClick」などのイベントを定義し、指定したContextで処理を受け付けるといったことが可能になります。

          (個人的にはレイアウトリソースの再利用性が失われるイメージがあるのであまり好きではないですが。)

        6. 次の記述について説明します。

          コードを表示するにはJavaScriptを有効にしてください

          「ConstraintLayout」の中に「TextView」を含めるようにしています。

          「android:layout_width」「android:layout_height」は「親Viewに合わせる」指定となっています。

          TextViewはテキストを表示させられるViewですので、「android:text」で、表示させるテキストを指定しています。

          「app:layout_constraint○○」は、表示させる位置を指定しています。

          例えば「app:layout_constraintBottom_toBottomOf="parent"」は「このViewの下端を親Viewの下端に制限する」という指定です。

        7. 他のリソースから呼び出す際の指定方法は<「@layout/」+ファイル名(拡張子無し)>です。

          @layout/activity_main

          ソースコードから呼び出す際の指定方法は<「R.layout.」+ファイル名(拡張子無し)>です。

          R.layout.activity_main

    3. リソースは、Androidアプリプロジェクトのビルド時に、Javaから参照できるようにIDがふられ、R.javaというファイルに記述されます。

      (R.javaはビルド時に生成されます。)

      app\build\generated 配下

      そこからビルド時にR.classが生成されるため、Javaソースコードから「R.~」での参照が可能となります。

      (そのため、プロジェクトエラーでビルドに失敗する場合は参照できないことがあります。)

      R.classが属するパッケージは、AndroidManifestに定義されたアプリのパッケージになります。

      (そのため、プロジェクト内で別のパッケージに属するクラスから参照する場合などでは、import文の記述が必要です。)

    4. APIの一つとして、Android標準で用意されているリソースもあります。「android.R.~」での参照が可能です。

      例えば、以下の指定で、Androidが用意する「OK」に相当する文字列を利用することができます。

      android.R.string.ok

      これらをうまく活用することで、多言語対応やAndroidらしいUIの作成をしやすくなります。

  • ソースコードについて学習します。

    1. ソースコードでは、実際にアプリがどんな動作を行うのか、事細かに処理を記述していきます。

      2017年11月現在、Androidアプリの主な開発言語はJavaとなっています。

    2. 「Hello World!」アプリのソースコードを見てみましょう。

      1. プロジェクトウィンドウの「MainActivity」をダブルクリックし、「MainActivity.java」を表示します。

        MainActivity.java

        コードを表示するにはJavaScriptを有効にしてください

      2. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        このクラスの所属するパッケージを宣言しています。

      3. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        このクラス内で使用する、外部パッケージに定義されているクラスをインポートしています。

      4. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        クラスの定義を行っています。


        Activityとして利用するクラスを定義する場合は、Activity(android.app.Activity)を継承する必要があります。

        今回はActivityを継承したAppCompatActivityクラスを継承しています。


        また、ActivityはAndroid OS(=アプリと別パッケージ)により起動されるものであるため、アクセス修飾子はpublicとなります。

      5. 次の記述について説明します。

        コードを表示するにはJavaScriptを有効にしてください

        Activityの「onCreate」メソッドをオーバーライドして、自前のレイアウトリソースをコンテンツViewに設定する、という処理が記述されています。


        Activityはライフサイクルをもっており、「onCreate」はActivityがAndroid OSにより生成されたときに呼び出されるメソッドです。

        つまり、ここでは「Activityが生成されたときに自前のレイアウトリソースをコンテンツViewに設定する」という処理を記述しているということです。


        なお、コンテンツViewはAndroid OSにより適切なタイミングで画面に表示されます。

  • 長くなったので、重要なポイントをおさらいしておきます。

    • Androidアプリは大きく分けて「マニフェスト」「ソースコード」「リソース」で構成される。

    • どういったアプリであるかをOSに教えるために、マニフェスト(AndroidManifest)が必要。

    • Activityは、画面を提供するオブジェクト。

    • Activityを使用するためには、AndroidManifestに記述する必要がある。

    • OSにActivityを起動してもらうためにはIntentFilterが必要で、その定義についてもAndroidManifestに記述する必要がある。

    • アプリで使用する文字列や画像などのデータは、リソースとして持つ。

    • リソースをうまく使えば、画面解像度や多言語への対応が容易。

    • アプリを動作させる各処理は、ソースコードに記述する。