中級以上のAndroid開発者がAndroidらしい開発のために見たほうが良いURL一覧

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部品（コンポーネント）について調べるだけでも効果を発揮します。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/a69066c3-f4fe-be27-485b-0a6ccf28f265.png)

※余談ですがiOSを触る人は[iOS Human Interface Guidelines](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/index.html)が必読です。

## ライフサイクル

Androidを開発するということは、Javaをマスターするよりもライフサイクルをマスターすることだ、という話は勉強会でちらほら出ます。Androidとはライフサイクル、Android開発とはライフサイクルをきちんと考えて開発することです。

[公式の入門編](http://developer.android.com/intl/ja/training/basics/activity-lifecycle/index.html)では再開、一時停止、停止の3状態しか出てきませんが、実際はとてつもないデカさのライフサイクルメソッドの呼び出し図ができるわけですよ・・（特にFragmentが絡む場合は複雑）。

そのまとめが下記のrepoに上がっています。
https://github.com/xxv/android-lifecycle

下記画像は1/4程度の抜粋（CC-BY-SA 4.0）
![image](https://qiita-image-store.s3.amazonaws.com/0/4153/0964dad1-df1e-ba5b-351e-9c266342fdda.png)

※余談ですがAndroid Nで[マルチウインドウ](http://developer.android.com/intl/ja/preview/features/multi-window.html#lifecycle)きてonPause()とonStop()の考え方が若干変わるかもしれない微妙に複雑化するかもしれないので宜しくお願い申し上げます（）

## バックスタックとタスク

startActivity()した後の戻るボタンの動き（ざっくりすぎだろ・・）を制御しているのが、バックスタックとタスクです。
戻るボタンだけでなく、タスクスイッチャに表示すべき内容（例えば外部のメールアプリを起動した時に、タスクスイッチャにメールアプリを表示するかしないかなど）も、注意深く考える必要があります。

Android開発者なら、バックスタックとタスクの違い、AndroidManifest.xmlに書くlaunchModeの違い、説明できますよね・・？
とかいうものの正直[公式ドキュメント](http://developer.android.com/intl/ja/guide/components/tasks-and-back-stack.html)だけだと実際の挙動がわからずつらいです。
自分は下記サイトを参考にしてようやく全容を理解できました。

- [図で理解するActivityのスタック (Qoncept TechBlog
)](http://techblog.qoncept.jp/?p=102)
- [Y.A.M の 雑記帳: Android　launchMode の違い](http://y-anz-m.blogspot.jp/2011/02/androidlauchmode.html)

下記画像は「図で理解するActivityのスタック」からの引用です。図が非常にわかりやすかったです。
![image](https://qiita-image-store.s3.amazonaws.com/0/4153/59539255-da02-5286-787c-a67ec5546d7d.png)

※本当は"taskAffinity"についても知るべきなはずなんですが、自分は今の所は必要な場面にぶち当たってないです。

## Upナビゲーション

Android開発者なら、戻るボタンと左上の「Up」ボタンの挙動の違い、説明できますよね・・？
Upは前に表示されていた画面に戻るとは限らず、「上位の概念」に移動しなくてはなりません。
Up Navigationは見落とされがちな仕組みなので、画面遷移が多いアプリケーションではぜひ参考にしたいです。
http://developer.android.com/intl/ja/design/patterns/navigation.html

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/f4fc3ea6-c420-12fe-223e-c6be6e1faf4b.png)

実装方法はこちら
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ストアで見ると、「このアプリはタブレット向けに設計されています」にならないとランキングに表示されないなどの弊害があります。

実はこれ、昔はタブレット向けスクショを登録するだけでよかったんですが最近は人力チェックされているようです（[志望動機みたいな応募フォーム](https://support.google.com/googleplay/android-developer/contact/tabletq)）。

フラグメントの使い方
http://developer.android.com/intl/ja/guide/practices/tablets-and-handsets.html#Fragments

http://qiita.com/HideMatsu/items/ddf640899cbe1b2027ed

# もっとテクニカルな話

## 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で）[消えた祭りが発生しました](http://stackoverflow.com/q/32345768/1474113)。

GoogleがAndroid API Differences Reportを出しているので、これを見ると各バージョンでどこのインタフェースが変わったのか確認することができます。
http://qiita.com/takahirom/items/b46afb73a5c8429d8675

## 便利ライブラリの一覧

- [wasabeef/awesome-android-ui](https://github.com/wasabeef/awesome-android-ui) ←UIのライブラリ一覧は本当に便利です。
- [新年のうちに抑えておきたい、イマドキなイカした Android のオープンソースライブラリ集](http://qiita.com/KeithYokoma/items/b5b53c94f6ab27b604e7)

他にもQiita記事がたくさんあります。

## ライブラリの導入時に便利なサイト

だいたいのライブラリはgithubのREADME.mdに書いてありますが、とりあえずbuild.gradleに何を書けばいいのかを探すには[mvnrepository.com](http://mvnrepository.com/)が便利です。一部のライブラリはMaven Centralの代わりにjCenterにだけアップロードされているものがあり、その場合は[bintray](https://bintray.com/bintray/jcenter)から探さねばなりません。

ただ、なんでもポイポイ突っ込めばいいというわけじゃなく、入れれば入れるほどビルド時間が長くなってしまいます。[methodscount.com](http://www.methodscount.com/)を使うとbuild.gradleに書くアレをコピペするだけで、ライブラリのサイズをメソッド数やバイト数で表示してくれます（Android Studioプラグインもあります！）。

余談ですが、[bintray-release](https://github.com/novoda/bintray-release)使うとjCenterにライブラリを数クリックで公開できるのでぜひ公開していきましょう。

# とにかくひたすらソースコードを読む

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Android development is about 10% writing Java. The other 90% is reading, crying, debugging, and pressing alt+enter</p>&mdash; Jon F Hancock (@JonFHancock) <a href="https://twitter.com/JonFHancock/status/702973001600364544">2016年2月25日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

泣きながらソースコードを読み、Alt+Enterを連打するのがAndroid開発です。URLとか言いましたがコードを読むのがAndroid開発です。大事なことなので2回言いました。

とりあえず問題を[公式Issue Tracker](https://code.google.com/p/android/issues/list)などで探してみて出てこなかったら下記のURLを使ってSDK（Androidフレームワーク）のコードを検索して読むのです。*ソースを使え、ルーク。*

- [ソースコード検索 (OpenGrok)](https://sites.google.com/site/devcollaboration/codesearch)
- [GithubのAndroidオーガニゼーション](https://github.com/android)
    - [Androidフレームワークのmirrorリポジトリ](https://github.com/android/platform_frameworks_base)
    - [Support Libraryのmirrorリポジトリ](https://github.com/android/platform_frameworks_support)
- Android StudioでSDKのソースコードを参照できるようにする（[ちょっと古い記事](http://qiita.com/makoto_kw/items/032e210aecf57deeb5a5)）

## サンプルアプリと読んでおくべき箇所

konifarさんの[DroidKaigi 2016のアプリ](https://github.com/konifar/droidkaigi2016)はシンプルに情報を表示し、お気に入りなどの管理をするサンプルアプリとしてとてもきれいなコードだと定評があります。

我らが神、Jake Wharton氏の[u2020](https://github.com/JakeWharton/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らしいかっこいいアプリがもっと増やしていきましょう・・！