Javaの話はいろいろあると思いますが、Android開発を極めていくにはどうしたらいいかという話を吐き出してみようと思います。
開発入門向けのガイドはいいもの https://github.com/mixi-inc/AndroidTraining があるので、より実践的な内容をどうするか、という話にフォーカスします。
Androidなデザインと開発
Material Designのガイドライン
Googleが考えた最強(?)のデザインガイドライン、それがマテリアルデザインです。
https://www.google.com/design/spec/material-design/introduction.html
使うべきUI部品、リスト表示のレイアウト、ダイアログを使うタイミングと表示内容、遷移アニメーションの使い方など多岐に渡ります。
この内容に沿って開発するとかなりモダンなAndroidアプリに見えます。使おうと思ったUI部品(コンポーネント)について調べるだけでも効果を発揮します。
※余談ですがiOSを触る人はiOS Human Interface Guidelinesが必読です。
ライフサイクル
Androidを開発するということは、Javaをマスターするよりもライフサイクルをマスターすることだ、という話は勉強会でちらほら出ます。Androidとはライフサイクル、Android開発とはライフサイクルをきちんと考えて開発することです。
公式の入門編では再開、一時停止、停止の3状態しか出てきませんが、実際はとてつもないデカさのライフサイクルメソッドの呼び出し図ができるわけですよ・・(特にFragmentが絡む場合は複雑)。
そのまとめが下記のrepoに上がっています。
https://github.com/xxv/android-lifecycle
※余談ですがAndroid NでマルチウインドウきてonPause()とonStop()の考え方が若干変わるかもしれない微妙に複雑化するかもしれないので宜しくお願い申し上げます()
バックスタックとタスク
startActivity()した後の戻るボタンの動き(ざっくりすぎだろ・・)を制御しているのが、バックスタックとタスクです。
戻るボタンだけでなく、タスクスイッチャに表示すべき内容(例えば外部のメールアプリを起動した時に、タスクスイッチャにメールアプリを表示するかしないかなど)も、注意深く考える必要があります。
Android開発者なら、バックスタックとタスクの違い、AndroidManifest.xmlに書くlaunchModeの違い、説明できますよね・・?
とかいうものの正直公式ドキュメントだけだと実際の挙動がわからずつらいです。
自分は下記サイトを参考にしてようやく全容を理解できました。
下記画像は「図で理解するActivityのスタック」からの引用です。図が非常にわかりやすかったです。
※本当は"taskAffinity"についても知るべきなはずなんですが、自分は今の所は必要な場面にぶち当たってないです。
Upナビゲーション
Android開発者なら、戻るボタンと左上の「Up」ボタンの挙動の違い、説明できますよね・・?
Upは前に表示されていた画面に戻るとは限らず、「上位の概念」に移動しなくてはなりません。
Up Navigationは見落とされがちな仕組みなので、画面遷移が多いアプリケーションではぜひ参考にしたいです。
http://developer.android.com/intl/ja/design/patterns/navigation.html
実装方法はこちら
http://developer.android.com/intl/ja/training/implementing-navigation/ancestral.html
結局のところ
http://developer.android.com/intl/ja/index.html 以下の情報は(APIリファレンス含め)かなり重宝するので、時間がある時に目を通しておくと良いのかもしれません。
タブレットや画面回転への対応
AndroidはiOS(iPhone/iPad)と違って、AndroidManifestでタブレット向けです宣言とかしなくても普通にタブレットで使えるようになっています。
でもGoogle Playストアで見ると、「このアプリはタブレット向けに設計されています」にならないとランキングに表示されないなどの弊害があります。
実はこれ、昔はタブレット向けスクショを登録するだけでよかったんですが最近は人力チェックされているようです(志望動機みたいな応募フォーム)。
フラグメントの使い方
http://developer.android.com/intl/ja/guide/practices/tablets-and-handsets.html#Fragments
もっとテクニカルな話
Support Libraryの更新情報
Androidには最初から使えるFragmentとSupport Libraryに入ってるFragmentと、Fragmentの実装が二つあるわけですが、Googleの中の人が最新の機能やバグ修正の恩恵のために常にSupport Libraryを使うべき(DroidKaigi 2016 2日目基調講演より)とおっしゃっていて、必ず使うことになると思います。
ただ、バージョンアップでガツンと仕様が変わる(メソッドなくなるとか)がある場合もあり注意が必要です。Android Studioが「アップデートしろよ」と黄色い波線を引いてきますが、ぐっとこらえてまずは下記のページで何が変わったかをチェックするのが望ましいです。
http://developer.android.com/intl/ja/tools/support-library/index.html
AndroidフレームワークのAPI Diff
AndroidのcompileSdkVersionを上げるとメソッドが消えることがあります。
最近だとNotification.BuilderのsetLatestEventInfo()メソッドが(API 23で)消えた祭りが発生しました。
GoogleがAndroid API Differences Reportを出しているので、これを見ると各バージョンでどこのインタフェースが変わったのか確認することができます。
http://qiita.com/takahirom/items/b46afb73a5c8429d8675
便利ライブラリの一覧
- wasabeef/awesome-android-ui ←UIのライブラリ一覧は本当に便利です。
- 新年のうちに抑えておきたい、イマドキなイカした Android のオープンソースライブラリ集
他にもQiita記事がたくさんあります。
ライブラリの導入時に便利なサイト
だいたいのライブラリはgithubのREADME.mdに書いてありますが、とりあえずbuild.gradleに何を書けばいいのかを探すにはmvnrepository.comが便利です。一部のライブラリはMaven Centralの代わりにjCenterにだけアップロードされているものがあり、その場合はbintrayから探さねばなりません。
ただ、なんでもポイポイ突っ込めばいいというわけじゃなく、入れれば入れるほどビルド時間が長くなってしまいます。methodscount.comを使うとbuild.gradleに書くアレをコピペするだけで、ライブラリのサイズをメソッド数やバイト数で表示してくれます(Android Studioプラグインもあります!)。
余談ですが、bintray-release使うとjCenterにライブラリを数クリックで公開できるのでぜひ公開していきましょう。
とにかくひたすらソースコードを読む
Android development is about 10% writing Java. The other 90% is reading, crying, debugging, and pressing alt+enter
— Jon F Hancock (@JonFHancock) 2016年2月25日
泣きながらソースコードを読み、Alt+Enterを連打するのがAndroid開発です。URLとか言いましたがコードを読むのがAndroid開発です。大事なことなので2回言いました。
とりあえず問題を公式Issue Trackerなどで探してみて出てこなかったら下記のURLを使ってSDK(Androidフレームワーク)のコードを検索して読むのです。ソースを使え、ルーク。
- ソースコード検索 (OpenGrok)
- GithubのAndroidオーガニゼーション
- Android StudioでSDKのソースコードを参照できるようにする(ちょっと古い記事)
サンプルアプリと読んでおくべき箇所
konifarさんのDroidKaigi 2016のアプリはシンプルに情報を表示し、お気に入りなどの管理をするサンプルアプリとしてとてもきれいなコードだと定評があります。
我らが神、Jake Wharton氏のu2020も一部をコピってきたという話をたまに聞くので(読んだことないけど)きっと何か得られるはずです。さっきみたらRxJavaとかRetrofit 2とか使われていてモダンな構成になっているようです。
ActivityThreadとFragmentManagerあたりはライフサイクル絡みのちゃんとドキュメントされていない挙動(画面回転開始から終了までの間に他の処理がMain Threadで走るの走らないの・・?みたいな素朴な疑問)をチェックするために読んでおく必要があるかもしれません。僕は読むことになりました()。
https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ActivityThread.java
https://github.com/android/platform_frameworks_support/blob/master/v4/java/android/support/v4/app/FragmentManager.java
まとめ
日本ではiOSユーザのほうが多いためかiOS開発(者)が優勢で、AndroidはiOSのデザイン丸コピみたいな事案もよく聞き寂しいです。
Androidらしいかっこいいアプリがもっと増やしていきましょう・・!