Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidアプリ開発研修【ミクシィ22新卒技術研修】

 Androidアプリ開発研修【ミクシィ22新卒技術研修】

22新卒技術研修で実施したAndroidアプリ開発研修の講義資料です。
動画:https://youtu.be/tqCDiQygR70

ハンズオン用リポジトリ
https://github.com/mixigroup/AndroidTraining2022

MIXI ENGINEERS

April 26, 2022
Tweet

More Decks by MIXI ENGINEERS

Other Decks in Programming

Transcript

  1. 講師・チューター紹介 • 講師 ◦ 山田 淳登 (slack: atsuto.yamada) ◦ 2015新卒

    ◦ TIPSTAR Android版 開発リーダー • チューター ◦ 太田 祐樹 (slack: yuki.ota) ◦ 2021.09入社 2014高専卒 ◦ Androidは2018年頃からやっています
  2. 研修の目的と範囲 • 目的 ◦ 基礎的な部分の学習 ◦ Android開発の特徴・魅力が分かる • 範囲 ◦

    Androidの実行環境の概要 ◦ UIレイアウト ◦ リスト(RecyclerView) ◦ 非同期処理とKotlin Coroutine ◦ リアクティブストリーム( LiveData) ◦ MotionLayout ◦ ハンズオン(ストップウォッチを作ってみよう) ▪ 一緒にやるハンズオンと、自分で手を動かしてもらうハンズオンがある ※Kotlin文法は範囲外 10:31
  3. Androidネイティブアプリとは • Androidランタイム(ART)上で動くアプリ ◦ Java Virtual Machineではない ◦ Java APIが利用できる

    ◦ ただし独自実装のため、 Javaとは動作が異なるAPIも存在する • 開発言語は主にJava or Kotlin ◦ 今ではKotlinが主流 ◦ バイトコード(class)を吐き出すことができれば良い ▪ 例えばScalaでも開発可能 10:32
  4. ディレクトリ構成 • app/src/main/res ◦ リソースを入れる場所 ▪ 画像、図形、UIレイアウト、テキスト など • app/src/main/java

    ◦ Java, Kotlinのコードを入れる場所 • app/build.gradle ◦ アプリのビルド時に必要な情報を記すファイル ▪ SDKバージョン ▪ 外部ライブラリ • app/src/main/AndroidManifest.xml ◦ アプリの構成情報を記すファイル 10:34
  5. リソースディレクトリ • app/src/main/res ◦ values/strings.xml ▪ アプリ内のUIで表示する文字列を定義する ▪ Java, Kotlinコード上に表示文字列を書くことはほぼ無い

    • 実行環境の言語設定によって内容を変えるため ◦ values/colors.xml ▪ アプリで利用する色コードを定義する ◦ values/themes.xml ▪ UIパーツの見た目の変更を定義する 10:35
  6. app/build.gradle • ビルド時に必要な情報が定義されている • アプリのバージョン • compileSdk ◦ どのAndroid SDKバージョンでビルドするか

    ◦ 32 = Android 12 • minSdk ◦ 動作可能な最低のAndroidバージョン • パッケージ名(applicationId) ◦ アプリを特定するための ID • 外部依存ライブラリ(dependencies) 10:35
  7. AndroidManifest.xml • アプリの構成情報 • アプリにどんな画面があるのか(Activity) • アプリにどんなサービスがあるのか(Service) ◦ サービスとは? ▪

    画面を持たないバックグラウンド処理を行うもの ▪ 消費電力節約の観点から、近年多用はされない ▪ プッシュ通知で使われる • アプリ名 • アプリアイコン • 外部アプリから自分のアプリ画面への呼び出し方法の定義(IntentFilter) ◦ 例:別アプリで「共有」を押すと、データを受け取りつつ自分のアプリを開く 10:36
  8. Activityのライフサイクル • ライフサイクルとは ◦ 画面のステートによって呼ばれるメソッドと、その順序 • 画面のステート ◦ ステートの例:画面を開く、画面を起動したまま別アプリを開く、画 面を閉じる

    • onCreateで画面の初期化を行う • onDestroyで画面の終了処理を行う 画面の起動 onCreate onStart onResume 画面の表示 onPause onStop onDestroy 画面の終了 画面が見えな くなる 10:37
  9. View • Viewとは:画面上に何かを表示するためのコンポーネント • Viewを継承したさまざまなクラスがSDKで用意されている • 代表的なView ◦ TextView:文字列を表示 ◦

    ImageView:画像を表示 ◦ Button:ボタンを表示 ◦ EditText:文字列入力フォームを表示 • 画面で必要なViewをXMLで記述する(レイアウトXML) 11:16
  10. レイアウトXMLとActivity(Kotlinコード)の関係 • Viewを利用するにはインスタンスが必要 • レイアウトXMLをViewインスタンスに変換することでプログラム上で利用可能となる • レイアウトXMLはViewインスタンスを用意するための手段 ◦ レイアウトに限らず、 AndroidでのXML定義要素はすべてインスタンス化して利用する

    • レイアウトXMLをインスタンス化する機能はLayoutInflaterが提供 • 1つのXMLに存在するViewをまとめるためのHolderとしてViewBindingが利用され る • ActivityにsetContentViewすることで、その画面のUIとして利用される XML View View View View View ViewBinding 11:17
  11. TextView • 文字列を表示するためのView • XML属性を変更することで書式の変更が可能 ◦ android:id Viewを特定するためのID ◦ style 別途定義した属性を引っ張ってくる ◦

    android:text 表示するテキスト内容 ◦ android:textColor テキスト色 ◦ android:textSize テキストサイズ • リソースとして定義した値は @.../ で参照 ◦ @color/ ◦ @string/ 11:18
  12. サイズ単位 sp, dp • 世の中のAndroid端末のディスプレイは、高解像度・低解像度が混在している • よって、pixel単位をそのまま利用できない ◦ 低解像度ディスプレイでは大きく、高解像度ディスプレイでは小さく表示される •

    サイズ指定は dp を使う ◦ 画面のピクセル密度を考慮したサイズ指定が可能 • テキストサイズ指定では sp を使う ◦ 画面のピクセル密度に加え、 OSのフォントサイズ設定によって変化する単位 ◦ フォントサイズ標準時、 14sp = 14dp 11:19
  13. ViewGroupとは • ViewGroupとは:Viewを複数並べるためのコンポーネント • 代表的なViewGroup ◦ FrameLayout:重ねて表示 ◦ LinearLayout:縦方向や横方向に並べて表示 ◦

    ConstraintLayout:View同士の制約(並べ方)を定義して表示 ◦ ScrollView:表示領域をはみ出るくらいの大きな Viewをスクロール可能にする ◦ RecyclerView:スクロール可能な表示領域のみ Viewを配置する • これも同じくレイアウトXMLに記述する 11:20
  14. ViewGroupに対しての属性指定 • ViewGroupに属しているViewは、親に対してどのよ うなサイズ・位置にするかを指定できる ◦ layout_…がついている属性は親に対する指定 • android:layout_width, android:layout_height ◦

    wrap_content Viewのコンテンツが収まるように ◦ match_parent 親要素の大きさに合わせる • android:layout_margin… ◦ マージンを取って位置を決定する 11:22
  15. ハンズオン②:【課題】秒数表示・ボタンを置く • ブランチ lesson2 をcheckout • 課題 ◦ MainActivityに紐付いているactivity_main.xmlを編集 ◦

    右のようにTextViewとButtonを配置する ◦ (必要なパラメーターは次ページ) • 時間:10分間(11:47まで) 11:47
  16. RecyclerViewを使う • RecyclerView.Adapterを実装する ◦ リストにあるデータをViewに変換する • ハンズオンではこの実装である ListAdapter を 利用

    • onCreateViewHolder ◦ ViewHolderを返す ▪ アイテム内で使うViewを保持するクラス ▪ 歴史的にはViewBindingが後発 • onBindViewHolder ◦ positionに位置するデータを Viewに設定する 12:06
  17. ハンズオン③:リスト表示する • 一緒にやるハンズオン • ブランチ lesson3 をcheckout • 解説 ◦

    ボタンを押すとリストにアイテムが追加される実装 ◦ Adapterの実装 ◦ MainActivity側の実装 12:15
  18. Androidにおける非同期処理 • Androidにおける処理スレッドの種類 ◦ Mainスレッド(UIスレッド) ◦ IOスレッド(バックグラウンドスレッド) • onCreateなどのフレームワークからのコールバックはMainスレッドで呼ばれる •

    Mainスレッドで重い処理やネットワーク通信を行うと ◦ 処理(通信)が終わるまでアプリが固まる ◦ ネットワーク通信はフレームワークの制約によりそもそもできない(クラッシュする) • Viewの操作はMainスレッドで行う必要がある ◦ IOスレッド→Mainスレッドへのコールバックが必要 13:30
  19. Kotlin Corouines • 同一ブロック内で中断可能なスコープ ◦ →CoroutineScope ◦ Activityに連動したCorouineScopeは lifecycleScope.launch で生成

    • 通常 Thread.sleep を使うとスレッドが停止す る • delay を使うとスレッドが停止せず、別ブロック にある処理を続行する • 実行スレッドを同一ブロック内で変更可能
  20. 責務の分離 • 画面に機能を実装していくとActivityの肥大化する ◦ 可読性の低下 ◦ メンテナンスコストの増加 ◦ バグの増加 •

    各クラスが特定の処理に集中できる設計が重要 ◦ →ViewModelの登場 13:37 Activity ViewModel ViewModelが用意した データをViewに設定す ることに集中 UI表示するデータを用意 することに集中 データ
  21. LiveData • ViewModelがActivityに依存することは許されない ◦ インスタンスの生存期間が異なる・責務分離の明確化 などの理由 • ViewModelからActivityにデータを伝える方法が必要 ◦ →LiveDataを使う

    • LiveData:データの入れ物 • 更新を通知する機能が備わっている • LiveData.observe ◦ データの変化時に実行されるリスナーを設定する 13:39
  22. LiveDataの仲間たち • MutableLiveData ◦ 外部から自由に変更可能な LiveData ◦ setValue(Kotlin上からは value と省略)でデータを設定

    • MediatorLiveData ◦ 別のLiveData(ソース)を元にデータ設定できる LiveData ◦ addSource ▪ 別のLiveDataソースを設定 ▪ ソースの値変更されたら、ブロックが呼ばれる 13:40
  23. ハンズオン⑦:最終課題 • ブランチ lesson7 をcheckout • 1時間(16:15まで) • ラップ機能を完成させる ◦

    ストップウォッチ開始中だけ、ラップボタンを有効にする (Button.isEnabled) ◦ ラップ時間表示を実装する ◦ ラップがあるときは時間表示を上げる ◦ ラップがないときは時間表示を下げる • 完成したら、別ブランチで差分をpushし、lesson7 へのPRを作成 16:10