Androidアプリ開発者としてのキックオフ　「Androidアプリ開発の教科書」を読んで

これまでにもちょっとだけAndroidアプリの開発に携わったことがあるのですが、散逸的な知識しか身に着いていないという反省点がありました。
幸い仕事の方も少し落ち着いているので、良い機会として基礎から体系的な学習に取り組んでみることにしました。

手始めに「[Androidアプリ開発の教科書（第2版）](https://www.shoeisha.co.jp/book/detail/9784798152028)」という書籍を手に取ったのですが、これがかなり良かったので内容について簡単にレビューしてみたいと思います。
これからAndroidネイティブアプリの開発をやってみたいという方の参考になれば幸いです。

# 書籍の概要
2019年7月に第1版が刊行されたのち、2021年4月に第2版が出版されました。
バージョンの差が大きいことでおなじみのAndroidStudioですが、割と新しい本ということで自分が読んだ2021年8月の時点では特にコンパイルエラー等なくサクサク進めることができました。
1章から17章まで、各章のテーマに沿ったアプリをハンズオン形式で開発していく構成となっています。
自分はガンガン手を動かしながら勉強したいタイプなので性に合っていました。

ちなみに自分の開発環境は下記の通りです。

- Windows 10 Home Edition
- AndroidStudio 4.2.1

ちなみに実機がなくても問題ありません。



# 学習の流れ
1章でAndroidStudioのインストール、2章でアプリの作成方法を学び、3章以降はテーマごとのアプリを作っていくことになります。
3章から8章まではViewやViewGroupの使い方、ButtonClickなどのイベントを制御する方法を学び、アプリに様々な機能を肉付けしていきます。
特に8章で作成する画面遷移やオプションメニュー、コンテクストメニューを含んだListView形式のアプリは示唆的で、初学者にとって非常に参考になる内容だと思います。
ここまでの知識だけでも色々なアプリを実装できそうです。
![ListView.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073313/8a3a60c0-fc2b-61c8-e4c8-5c6c6dc9a306.gif)


9章以降はFragment、DBアクセス、他のアプリとの連携など各論的な内容が続きます。
最後の16、17章では`MaterialDesign`についても触れられています。
これは16章で作成するToolBarのサンプルです。スクロールに応じて範囲が（カッコイイ言葉を使うとインタラクティブに）変わるのが分かるかと思います。
![MaterialDesign.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073313/0251477a-3990-985c-b968-52cc2f775fad.gif)



# 各章の内容
各章で学べる内容についてまとめます（ほぼ自分用の逆引きインデックスです）。
1、2章は割愛。

<dl>
<dt>3章</dt>
<dd>TextView、EditView、Buttonなどの画面部品の使い方</dd>
<dd>レイアウト部品（LinearView）の使い方</dd>
</dl>

<dl>
<dt>4章</dt>
<dd>画面部品に対するイベントハンドラとリスナの実装方法</dd>
</dl>

<dl>
<dt>5章</dt>
<dd>ListViewの使い方（データの設定方法、イベントハンドラとリスナの実装）</dd>
<dd>Toastの表示</dd>
<dd>Dialogの表示</dd>
</dl>

<dl>
<dt>6章</dt>
<dd>ConstraintLayoutの解説（制約ハンドラ、ベースライン、ガイドラン、チェイン）</dd>
<dd>デザインモードでの画面デザイン</dd>
</dl>

<dl>
<dt>7章</dt>
<dd>ListViewのカスタマイズ（SimpleAdapterの使用）</dd>
<dd>Intentによる画面遷移の実装</dd>
<dd>アクティビティのライフサイクルについての解説</dd>
</dl>

<dl>
<dt>8章</dt>
<dd>ListViewのカスタマイズ（タップイベント→画面遷移）</dd>
<dd>オプションメニューの実装</dd>
<dd>コンテキストメニューの実装</dd>
</dl>

<dl>
<dt>9章</dt>
<dd>フラグメントの解説</dd>
<dd>フラグメントによるマルチデバイス対応</dd>
</dl>

<dl>
<dt>10章</dt>
<dd>Androidデータベースの解説、実装方法</dd>
</dl>

<dl>
<dt>11章</dt>
<dd>非同期処理の解説、実装方法</dd>
<dd>Web APIの使用方法</dd>
<dd>Kotlinコルーチンの解説、実装方法</dd>
</dl>

<dl>
<dt>12章</dt>
<dd>MediaPlayerクラスの使用方法</dd>
</dl>

<dl>
<dt>13章</dt>
<dd>サービスクラスの使用方法</dd>
<dd>バックグラウンド通知の実装方法</dd>
</dl>

<dl>
<dt>14章</dt>
<dd>暗黙的インテントの使い方</dd>
<dd>Androidアプリから地図アプリの起動方法</dd>
<dd>パーミッションチェック</dd>
</dl>

<dl>
<dt>15章</dt>
<dd>Androidアプリからカメラアプリの起動方法</dd>
</dl>

<dl>
<dt>16章</dt>
<dd>MaterialDesignの解説</dd>
<dd>Toolbarの実装（スクロール連動機能）</dd>
</dl>

<dl>
<dt>17章</dt>
<dd>RecylcerViewの実装（Adapterの作成方法）</dd>
</dl>



# 非推奨のコード
前述の通り書籍に記されたサンプルコードをそのまま写経してもコンパイルエラーとなることはなかったのですが、現在Deprecated（非推奨）となっているコードが2ヶ所ありました。
9章「フラグメント」で、`FragmentManger`からFragmentオブジェクトを生成していますが現在は非推奨の書き方です。エディタでは下記の通り取り消し線がコードに表示され、メッセージでは注意が促されます。
![Deprecated_FragmentManager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1073313/cbd48197-bf4b-9bec-fe9d-f873c3bb18a9.png)
現在は`getParentFragmentManager()`の使用が推奨されています。
https://developer.android.com/jetpack/androidx/releases/fragment

同様に15章「カメラアプリとの連携」で`startActivityForResult()`と`onActivityResult()`が使われていますが、こちらも非推奨となっています。代わりに`Activity Result API`を使ってね、とのこと。
https://developer.android.com/jetpack/androidx/releases/activity#1.2.0-alpha04

ただしいずれも（現時点では）コンパイルエラーが出るようなものではないので、放っておいても問題ありません。
時間があれば推奨される書き方へのリファクタリングに挑戦するのも理解が深まって凄く良いですね（開発を続けていたらいずれ直面する問題でもあるので……）。



# 対象の読者層
まったくのプログラミング初学者には向いてはいないです。
前提として、以下の知識があった方が良いでしょう。
##### Kotlinの知識
本書の冒頭にも書いてありますが、Kotlinがある程度使える前提の構成となっています。
Kotlinに触れたことがないという方は先にある程度学習を済ませておくことをお勧めします（この段階ではそこまでガッツリとやる必要はないと思いますが）。
一冊本を買ってもいいし、お金を節約したい人は無料のチュートリアルもあります。
自分は改めて公式ドキュメントの「[Kotlin プログラミング言語を学ぶ](https://developer.android.com/kotlin/learn?hl=ja)」と「[Android で一般的な Kotlin パターンを使用する](https://developer.android.com/kotlin/common-patterns?hl=ja)」でおさらいしておきました。
Javaの開発経験があれば確かにベストですが、他にもC#などのオブジェクト指向言語の経験があれば十分に理解できる内容です。

##### 画面の開発経験
必須というわけではないんですが、ViewへのAdapterの設定などについて、画面とそのコードビハインドを作った経験なんかがあると理解が早いでしょう。ちなみにWPFとか、vue.jsを触ったことあってMVVMが分かっているとかだと後々楽できます（データバインディングとか。この本の範囲ではないですが）。


# この先の勉強
この本を一通り読み終えることでAndroidアプリ開発の基礎的な部分は一通り触れることができるかと思います。公式のドキュメントやサンプルコードを見てもある程度は何をやっているのかが分かるようになるでしょう。
ただ本文でも言及されていますが、実際の開発で用いられる、あるいはGoogleが推奨する技術・技法のうちいくつかは未消化な部分があります。
パッと思いつくのは以下のあたりでしょうか。

- `ViewModel`
- `Room`
- `Navigation`
- `LiveData`

いずれも[Android JetPack](https://developer.android.com/jetpack?hl=ja)に関連するものですね。
公式のサイトには[基礎トレーニング](https://developer.android.com/courses/kotlin-android-fundamentals/overview?hl=ja)と[実践的なチュートリアル](https://developer.android.com/codelabs/android-room-with-a-view-kotlin?hl=ja#0)という二つのCodeLabが用意されているので、この本を読み終えた方はこちらをやってみると良いと思います。
いずれも日本語版のページがあります。
そのうち記事書きたいな。

そして`MaterialDesign`かな？
`MaterialDesign`については最後の章でも触れられているのですが、実際のアプリを作るのであれば（仮に個人開発だとしても）もう少し深い理解があった方が良いのではと思います。
[Material Design](https://material.io/)
英語のサイトですが、個々の[Component](https://material.io/components/app-bars-bottom#usage)の動きやデザインを見ているだけでも楽しいですよ。

とは言っても、 **この本を読んでアプリ開発をスタートするって方は、まずは色んなアプリを作ってみた方が絶対に良い** と思います。
上に書いた内容は開発の円滑化や描画・表現性能の向上を図るためのテクニックです。
機能面で言えば本書の内容だけでも結構色んなアプリケーションを作れると思います。
何かしら作りたいアプリがあって勉強されている人が多いと思いますので、まずはその目標に一歩近づくためにも、 **AndroidStudioを開いて、Create New Project をクリックしましょう** 。
んで出来ることならリリースしちゃいましょう。

そのうえで`ViewModel`やら`Room`やらを勉強して、お手製のアプリをリファクタリングしていくのがベストな流れではないでしょうか。


# まとめ？
まとめるほどのものはないですが。
自分の学習のログ的な意味も込めて書いてみました。
一緒に頑張りましょう。


うーん何だかレビューってよりお勧め記事みたいになってしまった。
別におれ版元さんの回しものとかじゃないよ。