iOSとの比較つき!Androidでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、ライブラリのまとめ！


by @mixiappwchr

最近Androidのほうも久しぶりがっつりやっているため、簡単ですがまとめてみました。

![スクリーンショット 2014-12-07 12.10.15.png](https://qiita-image-store.s3.amazonaws.com/0/37731/ded85b13-3d8d-12d0-92ee-9e5704bd362c.png)


# 環境編

# IDEは何を使えばいいの？

今から始めるにはnatvieのコードとかを書かない限りAndroid Studioを使いましょう
最近ようやく1.0が出ました。

Android Studio
http://developer.android.com/sdk/index.html



## 検証用のエミュレータが遅いよ！
iOSと違う点ですが、Androidはエミュレータの遅さに定評があります。Intel HAXMでの高速なエミュレータか、Androidの仮想環境を提供してくれるGenymotionを使いましょう

Genymotion
http://www.genymotion.com/

## ライブラリの管理はどうすればいいの？
iOSでいうCocoapods的なものはAndroid Studioのビルドで使われているGradleで行うことができます。

例えば例としてネットワーク通信ライブラリを入れたい場合


## ネットワーク通信用のライブラリはどれがいいの？
iOSだとネットワーク通信周りと言えばAFNetworking。これを入れたい場合Podsfileに

```
pod 'AFNetworking', '~> 2.4'
```
と書きますよね！

Androidではいくらかライブラリがありますが,おすすめはRetrofitです。

Retrofit
http://square.github.io/retrofit/

AndroidStudioで使いたい場合は？

```
compile 'com.squareup.retrofit:retrofit:1.8.0'
```
と言った風に記載しましょう！

## 当然画像のロードもやってくれるよね？ライブラリのどれがいいの？
iOSだとSDWebImageとかのやつですね
Picassoがインターフェースが一番いけてます

Picasso
http://square.github.io/picasso/


## 古いバージョンのアプリでも最新のライブラリを使いたいんだけど？
iOSでは新しいSDKの機能は基本的には使えません。
Androidでは過去のバージョン向けにsupport ライブラリというものを提供していて
こちらを用いれば、過去のバージョンでも使えるものが増えます。
http://developer.android.com/tools/support-library/index.html

ただし、すべてが使える訳ではなかったりするので、使用する場合はその点も気をつけましょう


## ビルドがクッソ遅いんだけど!
そうです。Androidはビルドの遅さに定評があります。

gradle管理の場合、追加で新しいライブラリを入れる場合以外は
Preferenceのgradleの項目のところでOffline workにチェックを入れておきましょう

## cocoacontrolsみたいなUIライブラリや動きを参考にするやつってないの？

はい、このアプリをインストールしておきましょう
DevAppsDirect
https://play.google.com/store/apps/details?id=com.inappsquared.devappsdirect&hl=ja
これは実際のライブラリを試すことができるアプリです。

手元で動きを確認できるので、ぜひ自分でインストールしておくだけでなく、デザイナーさんにもインストールしてもらうようにしましょう。
このアプリにあることくらいは大体実装できそうですって基準になります。

## アプリのテスト配布はどうしたらいいの？

もうDeployGateしかありませんね！
DeployGate
https://deploygate.com/dashboard?locale=ja
グループ機能もちゃんとあるので使いやすいです
http://blog-ja.deploygate.com/post/87151299327


# アプリ開発編

## ナビゲーションバー周りはどう作ればいいの？

Androidではナビゲーション周りはActionBarを使います。最新のSDKではToolbarというものが導入されており、デザインなどさらに柔軟に変更が可能です。
http://developer.android.com/reference/android/support/v7/widget/Toolbar.html

## 横から出てくるメニューを作りたいんだけど
ドロワーメニューのことですね。
サポートライブラリで提供されているので使いましょう。

android.support.v4.widget.DrawerLayout
http://developer.android.com/training/implementing-navigation/nav-drawer.html


## スワイプで画面遷移するViewを作りたいんだけど
iOSでいうUIPageViewControllerですね
ViewPagerというライブラリを用いて実装します。

こちらもサポートライブラリで提供されているので使いましょう。
http://developer.android.com/reference/android/support/v4/view/ViewPager.html


## リスト表示のアプリを作りたいよ！
AndroidではListViewを用います。
ListView
http://developer.android.com/reference/android/widget/ListView.html

最新ライブラリでは
RecyclerViewというものが新しく追加されているのでこちらを用いてもいいでしょう。
https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html

iOSのTableViewと比較してTableViewの表示処理部分を行うDelegateの役割をAdapterという別のクラスが持つことになります。
ListViewの場合はListAdapterを使います。

ListAdapter
http://developer.android.com/reference/android/widget/ListAdapter.html
こちらの方にCellごとの実装を書きます。

また、パフォーマンスを向上させるための各行のView処理をキャッシュすることを行います。
iOSでもCellを再利用しますよね？
その辺の話はrejasupotaroさんがきれいにまとめてくれています。
http://rejasupotaro.github.io/2014/02/06/34.html


## グリッド表示のアプリを作りたいよ
iOSでいうCollectionViewですが、Androidだと

GridView
http://developer.android.com/guide/topics/ui/layout/gridview.html
になります。

ただし！注意点としてこのライブラリheaderやfooterをつけることができません！

そのため、他のライブラリを使うことになりますが、個人的には下記のライブラリで色々まかってます。

## いやPinterest的なグリッドが作りたいんだ！
はい,ということで、いっぱいライブラリがあるのですが比較的こちらのライブラリが安定しています。

AndroidStaggeredGrid
https://github.com/etsy/AndroidStaggeredGrid

GridViewとしてもつかえてheader,footerも追加できるので便利です。

## 画像フィルターアプリを作りたいよ！
iOSではGPUImage様万歳ですがAndroidにポーティングされたライブラリがあります

GPUImage for Android
https://github.com/CyberAgent/android-gpuimage

また標準SDKだとMedia Effectsをつかうと実装できそうです。
Media Effects 
http://developer.android.com/reference/android/media/effect/package-summary.html


## 動画は？動画編集アプリ作りたいよ！
iOSではAVFoundationにより、アニメーションを組み込んだり大分こったアプリが簡単にできましたAndroidはどうでしょうか？動画も同じくMedia Effectsが使用できそうです。また動画の結合

mp4parser
https://code.google.com/p/mp4parser/

最近のSDKでようやくMediaCodecまわりなど機能が拡張されていっているので動画はこれからという感じがします。未来を待ちましょう。この辺は興味がある分野なのでそのうち別途調べ直してみます。

## 音楽アプリをつくりたい！
端末内の曲を取得するにはContentResolverを取得してSQL発行することで、アルバム、曲、アーティストなどのデータを引っ張ってくることが可能です。MediaStoreをみてみましょう。

MediaStore
http://developer.android.com/reference/android/provider/MediaStore.Audio.html

```
	List albums = new ArrayList();
	ContentResolver resolver = activity.getContentResolver();
                Cursor cursor = resolver.query(
                                MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
                                Album.FILLED_PROJECTION, 
                                null, 
                                null,
                                "ALBUM  ASC"
                                );
                
                while( cursor.moveToNext() ){
                    albums.add(new Album(cursor));
                }

```

# Watchつくりたいよ.Watch!
Android Wearですね。
iOSだと最近Watchkitが公開されましたが現時点だと対したことができませんが、Android Wearについては一部固有の開発部分がありますが基本的に通常のAndroidのSDKと同じような開発や機能を用いることができます。

現時点だと実機も色々発売されてきており、今のところAndroidwearの方が開発する楽しさはあります

http://www.android.com/wear/

# その他iOSと比較して

アプリ開発的にはiOSと同じような考え方が使える場面が多いのですが、Android特有の大変さとしては

* 外部ライブラリの含めてメソッド数の壁、2.3だとサイズの壁があり、超えるとインストールできない、動かない。multidexなど解決策もでてきたがビルドが遅くなったり、つくりによっては動かない場合もあるので完全ではなくproguardを使って頑張る必要があったりする。
* そのproguardが辛い
* GCがありますが、ARCよりは大分面倒
* 端末固有の挙動の問題
* ビルド遅いよね
* デザイナーさんがiOSベースで話してくるのでしんどい

などなどあります。 

iOSよりよい点として
* リソース管理はAndroidがしっかりしてて扱いやすい
* 複数人開発はAndroidの方がやりやすい.(iOSのようにprojectfileがぶつかったり、storyboardなどのファイルがぶつからないよう気をつけるとか、悲しい出来事はあんまりない。。)
* 複雑な画面のレイアウトは断然Androidの方がくみやすい！リソース管理がきれいにできるのでメンテも楽(iOSのように,名ばかりの自動でなにもやってくれない、メンテナンス性がゼロのAutoLayoutなどとむきあわなくていい。。)
* 端末いっぱいあってガジェオタの人は楽しい限り


これからアプリ開発を始める人はもちろんですが、iOSエンジニアもAndroid側の開発をやってみると、いろいろな発見や楽しさや闇に触れることができるのでぜひやってみてはどうでしょうか？



iOSの方はこちらもどうぞ
[iOSでこんなアプリ,こんな機能を作りたかったらこれを見ろ！作りたいアプリに対応するクラス、フレームワーク、ライブラリのまとめ！]
(http://qiita.com/appwatcher/items/b02255026a3ee6d95142)

Android UIについては以下に初心者向けのまとめを作成しています。
[職種の枠を超えて劇的な効率化をはかる！デザイナーさんむけAndroid のUI作成の簡単まとめ](http://qiita.com/appwatcher/items/aa5f4026dc7db0dd10b2)


[そろそろアプリエンジニアへ華麗に転身を決めたいwebフロントエンジニア、両刀使いを目指すiOSエンジニア向け！Android UI開発の基本まとめその１]
(http://qiita.com/appwatcher/items/486966f4fe9d3c5e9f74)


# 最近の記事

[次世代のスーパーエンジニアたちも学ぶ！マインクラフトで触れる技術たちその1](http://qiita.com/appwatcher/items/05513e170b42b09ecd9a)

[あんなすごいエンジニアともであえるかも？？Qiitaユーザーが集まるSlack Teamを作ってみたよ！](http://qiita.com/appwatcher/items/00faadbf02f691186a54)

[goからiOSまで一人でアプリ開発をしてたらいつの間にかマインクラフトエンジニアになった話](http://qiita.com/appwatcher/items/6c0280cda9c4c8b3c65f)

[AutoLayoutに虐げられているIOSエンジニア向け、AutoResize再考](http://qiita.com/appwatcher/items/4e08fd88bba1da41871b)

[職種の枠を超えて劇的な効率化をはかる！デザイナーさんむけAndroid のUI作成の簡単まとめ](http://qiita.com/appwatcher/items/aa5f4026dc7db0dd10b2)

[限界までUXを向上させる! Facebook paperのようなアプリを最新UIライブラリAsyncDisplayKitでヌルヌルな操作感を実現しよう！](http://qiita.com/appwatcher/items/bc6d97a80c847206ba8e)

[あらゆる「モノ」との連携するIoT時代に向けて。iOS と AndroidのBluetooth LE対応状況を確認しておこう](http://qiita.com/appwatcher/items/c6e7e5767ba26aa6558e)

[作ったアプリをブラウザ即見せでモチベーションアップ！！TestFlightよりお手軽なアプリ配布サービスappetize.io](http://qiita.com/appwatcher/items/da77b66cce3c60e50d22)