Androidのアプリ開発案件にアサインされたのでモバイル開発について調べてみる

今回の記事は自分の考えをまとめるためだけに書いているので
間違った理解をしていたりすると思います。
そのあたりはコメントいただけるとありがたいです。

### まとめようと思った背景
- 3年目なのに新規で触る開発言語へのキャッチアップが遅いと感じた
- Flutter開発の経験もあるが、その時からモバイルアプリへの苦手意識があった
- そもそもモバイルアプリ全般に対しての知識がない状態で、画面の実装を始めていたので基礎をしっかり学びたいと思った

上記の3つが今回まとめようと思った背景です。


#### Androidの基本構造

- 基礎知識
    - AndroidStudio
        - デフォルトではプロジェクト表示になっていない
    - ソース関連
        - app/src/main/res
            - リソースを入れるところ
            - 画像、図形、UIレイアウト、テキスト
        - app/src/main/java
            - Java/Kotlinのコードを入れるところ
        - app/build.gradle
            - 外部依存ライブラリなどが記載されている
        - app/src/main/AndroidManifest.xml
            - アプリの構成情報が記載されている
    - リソースディレクトリについて
        - app/src/main/res
            - values/strings.cml
                - アプリで使用する文字列定義用ファイル
                - Java/Kotlinコード上に文字列を直接書くことはない
                    - 実行端末の言語環境によって表示文字列を変更するため
            - values/colors.xml
                - アプリで利用する色コードを定義するファイル
            - values/themes.xml
                - UIパーツの見た目の変更などを定義するファイル
    - app/build.gradleについて
        - ビルド時に必要な情報が記載されている
        - アプリのバージョン
            - compileSdkVersion
                - どのAndroidバージョンのSDKでビルドするか
            - minSdkVersion
                - 動作可能な最低Androidバージョン
            - applicationId(パッケージ名)
                - アプリを特定するためのユニークな文字列
                - リリースしたら変更できない
            - dependencies
                - 外部依存ライブラリ
    - AndroidManifestについて
        - 画面を定義(Activity)
            - Androidでは画面1枚をActivityクラスのサブクラスで表現する
            - 画面内で行う処理はActivityのサブクラスを起点に処理が伸びていく
            - ライフサイクル
                - 画面輝度、バックグラウンド移動、フォアグラウンド移動、画面終了などのアクションで呼ばれるメソッド群をライフサイクルと呼ぶ
                - ![Androidライフサイクル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606799/42ca1a06-f47e-4511-b624-b99efab6f96c.png)

        - バックグラウンドサービスを定義(Service)
        - アプリ名、アプリアイコン
        - 外部アプリから自アプリへの呼び出し方法の定義
            - intent-filter
    - Viewとは
        - ディスプレイ上に何かを表示するためのコンポーネント
        - XMLを用いて表示させる(実態はインスタンス)
    - サイズ単位
        - ピクセル単位だと端末の解像度によって表示サイズが変わってしまうため使用できない
        - サイズ指定ではdpを使用する
            - 画面の解像度に依存しないサイズ指定ができる
            - テキストサイズではspを使用する
            - 14sp, 14dp等
    - ViewGroupとは
        - Viewを複数並べるためのコンポーネント
        - 代表的なもの
            - FrameLayout
                - 複数のViewを重ねて表示
            - LinearLayout
                - 複数のViewViewを縦や横に並べて表示
            - ConstraintLayout
                - 複数のViewに制約(並べ方)を定義して表示
                - 複雑な並び方に対応できるため多用されている
                - app:layout_constraint〜〜という並び方制約を必ずつけないといけない
                    - 種類は複数あるようなのでどのように表示させたいかで対応するものを指定する
            - RecyclerView
                - 複数のViewを表示領域だけ縦や横に並べて表示
                - 使う上で必要な実装
                    - RecyclerView.adapter
                        - getItemCount
                            - データの総数を返す
                        - onCreateViewHolder
                            - Viewを新規作成しViewHolderを返す
                        - onBindViewHolder
                            - Viewにデータを設定する
                    - RecyclerView.ViewHolder
                        - 1行分のViewの入れ物
    - Androidの非同期処理
        - 大まかにふたつに分けられる
            - Mainスレッド(UIスレッドとも呼ばれる)
            - IOスレッド(バックグラウンドスレッド)
        - onCreateなどのライフサイクルメソッドはMainスレッドで呼ばれる
        - Mainスレッドで思い処理やネットワーク通信を行うと、、、
            - 通信が終わるまでアプリが固まる
            - ネットワーク通信するとクラッシュする(Androidの制約)
        - Viewの操作はMainスレッドで行う必要がある
            - IOスレッド→Mainスレッドへのコールバックが必要
        - AsyncTaskとは
            - 古くからあるAndroidの非同期処理用クラス
                - 今は新しいものに置き換わっている(コルーチン？)
        - Kotlin Coroutines
            - lifecycleScope.launchの呼び出しでブロックを作成すればこのブロック内でCoroutinesが有効になる

この辺りから話についていけなくなり挫けました、、、
上記の内容は
https://www.youtube.com/watch?v=91XQebVNnbI
↑の動画でお話しされていた内容をまとめただけです。
しかも結構序盤のみ。。。
ただ、こちらかなりわかりやすく説明されていました。
Mixi様様ですね、ほんとに。
新卒研修でこの内容を聞ける環境が羨ましい。。。