Blog
2020年のAndroidアプリ開発の変化を振り返る

2020年ももうすぐ終わりですね。

今年は本当に激動の1年でした。

Androidアプリ開発においても、1年経てば色々と環境が変わってきます。

今年出た技術や注目された技術について、私なりの視点で解説していきたいと思います。

続きを読む
【Kotlin】suspend functionとテストの書き方

この記事は Kotlin Advent Calendar 2020の15日目の記事です。

非同期処理を書く際に、kotlin coroutinesは使いやすく、非常に強力です。

一方で、単体テスト等を書くのには一定のハードルがあります。

今回は、suspend functionをテストしたり、モックする方法について紹介します。

続きを読む
【Android】新旧アーキテクチャが混ざるプロジェクトで気をつけていること

この記事はCyberAgent Developers Advent Calendar 2020の6日目の記事です。

ある程度の歴史の長いプロジェクトでは、リアーキテクチャやアーキテクチャのブラッシュアップ等により、複数のアーキテクチャが混ざるということが多々あると思います。

私もAndroidアプリにおいてMVCからMVVM、javaからkotlinへの段階的リアーキテクチャを進めています。

その中で一番重要なのは、 新アーキテクチャの実装/設計を旧アーキテクチャに依存させないことだと感じています。

今回は、それを実現するためのいくつかの工夫について紹介したいと思います。

続きを読む
kotlin coroutinesでViewModelからViewにイベント通知したい

この記事はAndroid Advent Calendar 2020の2日目の記事です。

SharedFlowやStateFlowの登場により、ますますkotlin coroutinesを手軽に扱えるようになってきました。

AndroidのMVVMにおいても、LiveDataの代わりにStateFlowを使ってViewとViewModelをbindingすることが可能になりました。一方で、ViewModelからViewに状態ではなくイベントを送るのは未だいくつかの問題があります。

今回は、複数の方法をメリットデメリットとともに紹介したいと思います。

続きを読む
StateFlowの深堀り、SharedFlowとの違いとstateIn【kotlin coroutines flow】

StateFlowはkotlin corouteinsの1.3.6で追加された状態管理用の特別なFlowです。

以前、「StateFlowのドキュメントを読み込む」という記事を書きましたが、その後SharedFlowが追加され、若干実装に変更がありました。

また、新たにstateInというoperatorも追加されています。

今回はそれらを含めたStateFlowの詳細な仕様に関して深堀りしていきたいと思います。

続きを読む
GASで記念日通知 slack botを作ろう

突然ですが、2020年11月6日に入籍しました。

結婚記念日やその他記念日を忘れると、怒られが発生するので、記念日当日にslackに通知してもらいましょう。

今回はGAS(Google Apps Script)を使っていきます。

続きを読む
SharedFlowの深堀り、replay, bufferって何【kotlin coroutines flow】

SharedFlowはkotlin corouteinsの1.4.0-M1で追加された新しいFlowです。

以前、Flow, SharedFlow, StateFlowの比較を行いました。

今回はSharedFlowの詳細な仕様に関して深堀りしていきたいと思います。

続きを読む
kotlin coroutinesのFlow, SharedFlow, StateFlowを整理する

JetpackでもRoom, Paging 3, DataStore等様々なライブラリがkotlin coroutines flowを使い始め、もはやAndroid開発にはflowが必要不可欠になってきました。

そんな中、以前紹介したStateFlowに加えて、SharedFlowが1.4.0-M1から登場しました。

少し複雑に感じますが、実はかなり整理されており、以前より使いやすくなっていると思っています。

今回は、Flow、SharedFlow、StateFlowの概要に関して紹介し、各々の詳細に関しては別途まとめたいと思います。

続きを読む
ViewModelでString resourcesを扱いたい

Androidで開発する際、文字列のリソースは res/values/strings.xml に書いて管理すると思います。

それらを実際に文字列として取得するためには、contextが必要になります。

一方で、ViewModelにActivity contextを渡すことはメモリリークの危険性があるため、アンチパターンとされています。

Application contextで文字列を取得する方法もあると思いますが、言語切替時に正しくUIが更新されない等、あまり良くないと感じました。

ViewModelではenum等を作成し、View側で文字列に変換する等の方法もあると思いますが、細かい文字列の制御が難しくなります。

今回はActivity contextを使いつつ、いい感じにString resourcesを扱う方法について紹介したいと思います。

続きを読む
OnLifecycleEventより、DefaultLifecycleObserverを使おう

Androidの複雑なlifecycleに対応するのに、jetpackのLifecycleObserver等の仕組みは非常に強力です。

LifecycleObserverにはいくつか種類がありますが、LifecycleObserverのinterfaceにOnLifecycleEventのアノテーションを付けてやる方法が一番一般的だと思っていました。

しかし、java 8環境下ではDefaultLifecycleObserverのほうが強く推奨されていたので、その説明と、移行に関する注意点をまとめてみます。

続きを読む
Navigation Componentのいい感じのアニメーションを検討する【サンプルアプリあり】

Navigation Componentの登場により、画面遷移をFragmentベースで行う例が増えてきたように思います。

Fragmentで画面遷移をさせることで、toolbarやbottom navigation view等の共通のUIを表示し続けられるようになったり、activityでの画面遷移よりパフォーマンスがよかったり、いくつかの利点があります。

一方で、activityでの画面遷移とは違い、navigation利用時は遷移時にデフォルトのアニメーションがつきません。

そこで、今回はいくつかの遷移アニメーションの例を提示したいと思います。

続きを読む
kotlin coroutines flowのテストを快適に書く

StateFlowもリリースされ、kotlin coroutines flowがますます存在感を増してきています。

一方、単体テスト等を書こうとした際、こういったストリームをテストするのは比較的難しいです。

今回は、僕が普段実際に使ってるテスト用utilとその使い方について紹介したいと思います。

続きを読む
Kotlin Android Extensions(views)はやめてViewBindingを使おう

Kotlin Android Extensionは現在2つ機能があり、findViewByIdを省略できるviewsとParcelableの実装を楽にしてくれるparcelizeがあります。

特に viewsは非常に便利で、僕自身もよく使っていました。

一方、ViewBindingというものも登場し、DataBindingの軽量版みたいな立ち位置で、こちらもfindViewByIdを省略することができます。

Kotlin Android ExtensionとViewBinding、DataBindingを比較し、使い分けについて議論したいと思います。

続きを読む
タッチエリアを広げる【Android】

Androidに置いてアクセシビリティの観点からボタンのサイズは縦横共に最小48dpを推奨されています。(iOSは44pxみたいです)

また、デザイン上そのサイズに満たない場合でも、その周りもタッチできることが求められています。

今回はそれの具体的な実装方法について紹介したいと思います。

続きを読む
fragmentでもby lazyっぽく書きたい

fragmentが難しい理由の一つとして、viewの生存期間よりfragmentの生存期間のほうが長い、というところがあると思います。

そのため、viewが再生成された際に正しく新しいviewを参照できなかったり、viewへの参照が切られずメモリリークしたりということがよく起きます。

今回はviewへの参照をby lazyの形で安全に書ける仕組みを考えてみたいと思います。

続きを読む