Kotlin メモ

## Kotlinとは
### Kotlin 
- KotlinはJetBrainsが2011年に発表したプログラミング言語です。 
- Javaとの互換性がある
- Javaよりもコードを短く記述することができる。
- Null安全や型推論などのモダンな思考を一部取り入れている。 
- [公式サイト](https://kotlinlang.org/)
- [GitHub](https://github.com/topics/kotlin)

## 開発ツールについて
### Android Studio 
- 以前はEclipseでの開発が主流だったが、2015年にGoogleがEclipseでの開発のサポ ートを終了した。 
- そのため、2014年からAndroid Studioが開発ツールとして一般化している。 
- UIは、拡張XMLファイル で構築されている。
- UIの部品の名前やID、幅、高さや表示位置をXML形式のファイルで指定する。 
- GUIでドラッグアンドドロップで設定することや、直接XMLファイルで定義できる。 
- 基本的にXMLとGUIは一対一の関係のため、同じXMLファイルなら同じUIを表現できる。 
- [公式サイト](Android Developer 公式サイト)
- [Androidニュース](https://developer.android.com/)

### Gradle 
- Androidのバージョンの設定を記述することができる。
- dependenciesブロックに、必要な外部ライブラリを記述することができる。 
- [公式サイト](https://gradle.org/)
- [公式ユーザガイド](http://gradle.monochromeroad.com/docs/userguide/userguide.html)
	
### ReactiveX 
- ReactiveXは、データが同期か非同期かに関係なく、命令型プログラミング言語がデー タのシーケンスを操作できるようにするツールのセットです。
- これは、シーケンス内の各項目を操作する一連のシーケンス演算子を提供します。
- [公式サイト](http://reactivex.io/)
- [GitHub](https://github.com/ReactiveX/RxJava)

### RxJava
- RxJavaは、Javaでリアクティブプログラミングを行うためのライブラリです。 
- このライブラリは軽量であり、また、他のライブラリに対する依存がないのでRxJavaの jarをパスに通すだけで使えるようになります。 
- 対応しているJavaのバージョンは6からで、さらにAndroidもバージョン 2.3(Gingerbread)からサポートしています。
- [参考サイト](https://qiita.com/disc99/items/1b2e44a1105008ec3ac9)

### SDK 
- パソコンなどでAndroid端末向けソフトウェアを開発するために必要なプログラムやラ イブラリなどをまとめた開発キット。 
- Google社が無償で公開しており、Windows版、macOS版、Linux版がある。 
	
### AVD
- Androidの仮想デバイスのこと。 
- Androidのアプリは実際の端末で動作させることになりますが、端末がなくてもエミュ レーター上でアプリを実行し動作を確認できます。 

### NDK
- Android で C や C++ のコードを使用できるようにするツールセットのことです。 

### AppIconの設定方法
- [参考サイト](https://developer.android.com/studio/write/image-asset-studio?hl=ja)

### apkインストール手順
- [参考サイト](https://kuroyagikun.com/apk-download-install/) 

### AR Coreについて
- Googleが開発したAndroidに対応したARフレームワークです。 
- [公式サイト](https://developers.google.com/ar)
- [参考サイト](https://vrinside.jp/news/arcore/)

### トーストの概要 
- トーストは、操作に関する簡単なフィードバックを小さなポップアップに表示します。
- トーストでは、メッセージの表示に必要なスペースのみを使用します。現在のアクティ ビティは表示されたままになり、引き続き操作できます。
- トーストはタイムアウト後に自動的に消えます。 
- [公式サイト](https://developer.android.com/guide/topics/ui/notifiers/toasts?hl=ja)

## Android Jetpackについて
### Android Jetpack
- Android Jetpackで提供されているライブラリやツールを使用することで、高品質な Androidアプリを作成できる。
- Android Jetpackは、基盤、アーキテクチャ、動作、UIの4つのカテゴリに分類されて いる。
- [公式サイト](https://developer.android.com/jetpack?hl=ja)
- [参考サイト](https://qiita.com/k_masa777/items/c01c1de6ac763ce5c075)

### 1. DataBinding 
- 多くの場合、ビュー バインディングによってデータ バインディングと同じメリットがも たらされ、実装をよりシンプルに行うことができパフォーマンスも向上します。 
- findViewById() 呼び出しを主にデータ バインディングに置き換える場合は、ビュー バインディングの使用を検討してください。 
- データ バインディング ライブラリはサポート ライブラリであるため、Android 4.0(API レベル 14)以降を搭載しているデバイスで使用できます。
- [公式サイト](https://developer.android.com/topic/libraries/data-binding?hl=ja#kotlin) 

### 双方向DataBinding
- 一方向データ バインディングを使用すると、属性の値を設定し、その属性の変更に反応 するリスナーを設定できます。
- 双方向データ バインディングを使用すると、このプロセスをショートカットできます。
- バッキング データの変更に対応するには、次のコード スニペットに示すように、レイア ウト変数を Observable の実装(通常は BaseObservable)にして、@Bindable アノ テーションを使用します。
- [公式サイト](https://developer.android.com/topic/libraries/data-binding/two-way?hl=ja)

### 2. ViewBinding 
- ビュー バインディングとは、ビューを操作するコードを簡単に記述できる機能です。
- ほとんどの場合、ビュー バインディングは findViewById の後継となります。 
- ビュー バインディングと データ バインディングは、両方ともビューを直接参照できる バインディング クラスを生成します。 
- ただし、ビュー バインディングはよりシンプルなユースケースを扱うことを目的として おり、データ バインディングに比べて次のようなメリットがあります。 
- ビュー バインディングはアノテーション処理を必要としないため、コンパイル時間が短縮されます。 
- ビュー バインディングは特別にタグ付けされた XML レイアウト ファイ ルを必要としないため、より迅速にアプリで利用できます。
- モジュールでビュー バイ ンディングを有効にすると、そのモジュールのすべてのレイアウトに自動的に適用されます。
- [公式サイト](https://developer.android.com/topic/libraries/view-binding?hl=ja)

### findViewById との違い 
- ビュー バインディングには、findViewById を使用するよりも大きなメリットがあります。 
- ビュー バインディングは、ビューへの直接参照を作成するため、無効 なビュー ID によって NullPointerException が発生することはありません。
- また、 レイアウトの一部の構成内だけに存在するビューがあった場合、バインディング クラ ス内でそのビューへの参照を含むフィールドには @Nullable のマークが付きます。 
- 各バインディング クラス内のフィールドは、XML ファイル内で参照して いるビューと合致する型を持ちます。そのため、ClassCastException のリスクがあ りません。 
- このような違いがあるため、レイアウトとコードとの間に互換性がない場合は、実行時ではなくコンパイル時にビルドが失敗することになります。

### 3. ViewModel の概要
- ViewModel は、ライフサイクルを意識した方法で UI 関連のデータを保存し管理するためのクラスです。
- ViewModel クラスを使用すると、画面の回転などの設定の変更後にデータを引き継ぐことができます。
- [公式サイト]( https://developer.android.com/topic/libraries/architecture/viewmodel?hl=ja)

### 4.Lifecycle 
- ライフサイクル対応コンポーネントは、別のコンポーネント(アクティビティやフラグ メントなど)のライフサイクル ステータスの変化に対応してアクションを実行します。 
- これらのコンポーネントを使用することで、適切に整理されメンテナンスが容易な軽量 のコードを作成できます。
- [公式サイト](https://developer.android.com/jetpack/androidx/releases/lifecycle)

### 5.LiveData の概要
- LiveData は監視可能なデータホルダー クラスです。 
- 通常の監視とは異なり、LiveData はライフサイクルに応じた監視が可能です。
- つまり、アクティビティ、フラグメント、サービスなどの他のアプリ コンポーネントの ライフサイクルが考慮されます。
- このため、LiveData はライフサイクルの状態がアクティブなアプリ コンポーネント オ ブザーバーのみを更新します。
- データを保存して、変化を観察することができるオブジェクトです。 UIオブジェクトは LiveDataにオブザーバーを登録することができ、データが変更されたときのUIを変更する ことができます。
- [公式サイト](https://developer.android.com/topic/libraries/architecture/livedata?hl=ja)
	
### 6.Navigation Component 
- Android Jetpack の Navigation コンポーネントは、単純なボタンクリックから、アプリバーやナビゲーション ドロワーなどの複雑なパターンまで、さまざまなナビゲーションを実装するのに役立ちます。 
- [公式サイト](https://developer.android.com/guide/navigation?hl=ja)

### 7.RecyclerView で動的リストを作成する
- RecyclerView を使用すると、大規模なデータセットを簡単かつ効率的に表示できます。 
- データを指定し、各アイテムの表示方法を定義すると、必要に応じて、RecyclerView ライブラリが動的に要素を作成します。
- [公式サイト]( https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ja)

### RecyclerView の高度なカスタマイズ
- 特定のニーズに合わせて RecyclerView オブジェクトをカスタマイズできます。 
- RecyclerView でダイナミック リストを作成するで説明した標準のクラスでは、ほとん どのデベロッパーが必要とする機能がすべて用意されています。
- [公式サイト](https://developer.android.com/guide/topics/ui/layout/recyclerview-custom?hl=ja)

### API リファレンス
- メモリ使用量を最小限に抑えつつ、大規模なデータのセットを UI に表示します。
- [公式サイト](https://developer.android.com/jetpack/androidx/releases/recyclerview?hl=ja) 

### 8.Room
- Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのより安定したアクセスを可能にし、SQLite を最大限に活用できるようにします。
- このライブラリは、アプリを実行しているデバイスでアプリのデータのキャッシュを作成する際に有用です。
- このキャッシュは、アプリの信頼できる唯一の情報源として機能します。 
- ユーザーはこのキャッシュを使用することで、インターネットに接続しているかどうか に関係なく、アプリ内の重要な情報の一貫性のあるコピーを表示できます。
- Roomデータ永続性ライブラリにはRoomDatabase.Callbackクラスが付属しています。
- このRoomDatabase.Callbackクラスには、 onCreateとonOpen の2つのコールバッ クメソッドがあります。
- [公式サイト]( https://developer.android.com/topic/libraries/architecture/room?hl=ja)
- [参考サイト](https://qiita.com/tfandkusu/items/672b2a043d27c0fefc89)

### DAO
- DAO(Data Access Object)はプログラムからデータベースシステム(DBMS)などデ ータの永続化機構に対するデータの保存、読み出し、修正、削除などを行う。
- Room の主要コンポーネントであり、各 DAO は、アプリのデータベースへの抽象アク セスを可能にするメソッドを備えています。
- データを挿入するには、@ Insertアノテーションを使用します。 メソッド名として任意 の名前を選択できます。
- データを更新するには、@ Updateアノテーションを使用します。 
- データを削除するには、@ Deleteアノテーションを使用します。
- @Query は、DAO クラス内で使用される主要なアノテーションです。データベースに 対して読み書き処理を実行できます。 
- 各 @Query メソッドはコンパイル時に検証されるため、クエリに問題があると、ランタ イム エラーの代わりにコンパイル エラーが発生します。
- [公式サイト](https://developer.android.com/training/data-storage/room/accessing-data?hl=ja)

### 9.Retrofit 
- Retrofitは、Squareによって開発されたAndroidおよびJava用のタイプセーフなHTTP クライアントライブラリ(ネットワークサービス)です。 
- AndroidアプリケーションおよびJAVAで使用して、HTTP要求を作成し、RESTAPIか らのHTTP応答を処理します。
- [公式サイト](https://square.github.io/retrofit/) 
- [参考サイト](https://blogs.datanapps.com/retrofit-kotlin-jetpack)

### 10.Notifications 
- 通知は、アプリが使用されていないときに、アプリ内のイベントに関する簡潔な情報を タイムリーに提供します。
- 通知は、アプリの UI の外で Android が表示するメッセージであり、リマインダー、他 の人からのメッセージ、アプリからのタイムリーな情報などをユーザーに提供します。
- ユーザーは通知をタップしてアプリを開いたり、通知から直接操作したりできます。 
- [公式サイト](https://developer.android.com/training/notify-user/build-notification?hl=ja)

### 11.WorkManager でタスクのスケジュールを設定する
- WorkManager は、アプリが終了した場合やデバイスが再起動した場合でも実行される、延期可能な非同期タスクのスケジュールを簡単に設定するための API です。
- [公式サイト](https://developer.android.com/topic/libraries/architecture/workmanager) 

### 12.Android でのDependency Injection (依存性の注入)
- 依存関係インジェクション(DI)はプログラミングで広く使用されている手法で、 Android 開発にも適しています。
- DI の原則に従うことで、優れたアプリ アーキテクチャの土台を築くことができます。 
- 依存関係インジェクションを実装すると、コードを再利用できる、 リファクタリングが容易になる、 テストが容易になる 等のメリットがあります。
- [公式サイト](https://developer.android.com/training/dependency-injection?)hl=ja 
- [参考サイト](https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f)

### 13.Dagger の基本
- Android アプリにおいて、手動による依存関係インジェクションやサービス ロケータ は、プロジェクトの規模によっては問題になることがあります。
- Dagger を使用すれば、依存関係を管理することで、プロジェクトの複雑さを抑えられ ます。
- Dagger は、通常は手書きするコードを模倣してコードを自動的に生成します。 
- このコードはコンパイル時に生成されるため、Guice などのリフレクション ベースのソ リューションよりも、トレース可能でパフォーマンスが高いものになります。
- [公式サイト](https://developer.android.com/training/dependency-injection/dagger-basics?hl=ja)

### Google Guice
- Google Guiceは、Apacheライセンスの下でGoogleによってリリースされたJavaプ ラットフォーム用のオープンソース ソフトウェアフレームワークです。
- [参考サイト](https://qiita.com/opengl-8080/items/6fb69cd2493e149cac3a)

### 14.Hilt を使用した依存関係の注入
- Hilt は Android 用の依存関係インジェクション ライブラリです。 
- これを使うことで、プロジェクトで依存関係の注入(DI)を手動で行うためのボイラー プレートが減ります。
- Hilt には、他の Jetpack ライブラリからクラスを提供するための拡張機能が用意されて います。
- Hilt で現在サポートされている Jetpack コンポーネントは次のとおりです。
- [公式サイト](https://developer.android.com/training/dependency-injection/hilt-jetpack?hl=ja)

### 15.Paging Libraryの概要
- ページング ライブラリを使用すると、データの小さなチャンクを一度に読み込んで表示 することができます。
- 部分的なデータをオンデマンドで読み込むことで、ネットワーク帯域幅とシステム リソ ースの使用量を削減できます。 
- PagingライブラリはRecyclerViewにデータをページ単位で効率的にデータをロードし て、画面に出力するのに役立ちます。
- ページングは、Androidの開発で頻繁に使用されるが、実装する面倒な効率的なリスト ビューを簡単に実装できるように支援します。
- [公式サイト](https://developer.android.com/topic/libraries/architecture/paging/)

### 16.DataStore 
- Jetpack DataStore は、プロトコル バッファを使用して Key-Value ペアや型付きオ ブジェクトを格納できるデータ ストレージ ソリューションです。 
- DataStore は、Kotlin コルーチンとフローを使用して、データを非同期的に、一貫した 形で、トランザクションとして保存します。
- [公式サイト](https://developer.android.com/topic/libraries/architecture/datastore)

### 17.テストの基礎
- [公式サイト](https://developer.android.com/training/testing/fundamentals?hl=ja)

### 18.Android MVVM
- [参考サイト](https://qiita.com/sdkei/items/a48ae24536562ed000b3)

### MVC, MVVM違い 
- [参考サイト](https://digitalidentity.co.jp/blog/creative/mvc-mvvm.html)

### 19.Android開発者のためのSOLID原則 
- SOLIDは、オブジェクト指向ソフトウェア開発における5つの設計原則の頭字語であ り、ソフトウェア設計をより理解しやすく、柔軟で、保守しやすくすることを目的として います。
- SOLIDの原則
  - S —単一責任の原則(SRPとして知られています) 
  - O —オープン/クローズド原則
  - L —リスコフの置換原則
  - I —インターフェイス分離の原則
  - D —依存性逆転の原則
  - [参考サイト](https://medium.com/kayvan-kaseb/the-solid-principles-for-android-developers-75fd4ca3ef84)

### 20.Android での Kotlin(コルーチン)
- コルーチンとは、Android で使用できる並行実行のデザイン パターンです。 
- これを使用すると、非同期実行するコードを簡略化できます。
- コルーチンは、Kotlin にはバージョン 1.3 で追加されたものですが、すでに他の言語で 
- 確立されている概念をベースにしています。
- 中断がサポートされているため、1 つのスレッドで多数のコルーチンを実行できます。
- これにより、コルーチンを実行しているスレッドがブロックされません。中断により、多数の同時実行処理をサポートしつつ、ブロックさせる場合よりメモリを節約できます。
- [公式サイト](https://developer.android.com/kotlin/coroutines?hl=ja)
- [コルーチンガイド](https://kotlinlang.org/docs/coroutines-guide.html) 

### Android での Kotlin Flow
- 「Flow」はコルーチンの一種で、返す値が 1 個のみの「suspend 関数」とは異なり複数の値を順次出力できます。
- 例えば、データベースからリアルタイムで更新情報を受け取るような場合に使用でき ます。
- [公式サイト](https://developer.android.com/kotlin/flow?hl=ja)