Android ビルディングデザイン TechBooster 著 2015-08-24 版 TechBooster 発行 はじめに Android ビルディングデザインを手に取っていただき、ありがとうございます。ビルディン グデザインとは建築設計、ものを作るための言葉です。近年、アプリ開発は複雑化が進み、設 計そのものが難しくなってきています。本書は Android 開発に影響する新しい設計技術を解 説しています。特に注目度の高いライブラリ、手法を丁寧にまとめました。これらの設計手法 を知ることが読者の手助けになれば幸いです。 (発行代表 @mhidaka) 本書の内容について • 開発を効率化する Data Binding 徹底解説 • 非同期プログラミングのためのフレームワーク RxJava 入門 • Kotlin、マテリアルデザイン、新パーミッションモデルなど注目技術解説 TechBooster とは TechBooster は Android をはじめとしたモバイルのための技術サークル*1です。オープン ソースへの貢献や社会還元を目的にサイトでモバイル技術を解説しています。 お問い合わせ先 本書に関するお問い合わせ https://plus.google.com/+TechboosterOrg/ *1 TechBoosterのWebサイト http://techbooster.org/ 1 目次 はじめに 1 本書の内容について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 TechBooster とは . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 お問い合わせ先 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 第 1 章 Introduction to RxJava 8 1.1 RxJava とは何か . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.2 RxAndroid / RxT4A とは何か . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.3 プロジェクトへの導入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4 RxJava の基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.1 プロミス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.2 リスト操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 1.4.3 イベント通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1.4.4 RxJava の基本のまとめ . . . . . . . . . . . . . . . . . . . . . . . . 22 1.5 Android アプリにおける RxJava . . . . . . . . . . . . . . . . . . . . . . . 22 1.5.1 Android コンポーネントと observable のライフサイクルの関係 . . . 23 1.5.2 CompositeSubscription でまとめて unsubscribe する . . . . . . . 23 1.5.3 AndroidCompositeSubscription でまとめて unsubscribe する . . . 24 1.5.4 OperatorAddToCompositeSubscription で ACS への add を簡単に 行う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.5.5 イベントの observable 化 . . . . . . . . . . . . . . . . . . . . . . . 25 1.6 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2 目次 第 2 章 Fundamental Of The Data Binding 27 2.1 セットアップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.1 Android SDK を更新する . . . . . . . . . . . . . . . . . . . . . . . 28 2.1.2 build.gradle に設定を記述する . . . . . . . . . . . . . . . . . . . . 29 2.1.3 Proguard の設定を追加する . . . . . . . . . . . . . . . . . . . . . . 29 2.1.4 minSdkVersion 7 までサポート . . . . . . . . . . . . . . . . . . . . 30 2.2 Data Binding Library で Hello World . . . . . . . . . . . . . . . . . . . . . 30 2.3 Layout XML でできること . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.3.1 import 要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 2.3.2 Binding クラスに任意の名前を付ける . . . . . . . . . . . . . . . . . 34 2.3.3 include を使う . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 2.3.4 式を利用する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.3.5 Null 合体演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.3.6 式や表記の制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2.3.7 条件に合わせてリソースを変更する . . . . . . . . . . . . . . . . . . 40 2.3.8 引数をもつリソース . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.4 コードでできること . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.4.1 Binding クラスの作成方法 . . . . . . . . . . . . . . . . . . . . . . . 42 2.4.2 Observable による値の自動反映 . . . . . . . . . . . . . . . . . . . 43 2.4.3 BaseObservable による値の自動反映 . . . . . . . . . . . . . . . . 45 2.4.4 ObservableField を使った値の自動反映 . . . . . . . . . . . . . . . 46 2.5 Data Binding Library の特殊な機能 . . . . . . . . . . . . . . . . . . . . . . 48 2.5.1 Automatic Setter で存在しない属性値へバインドする . . . . . . . . 48 2.5.2 対応する setter を持たない属性値を@BindingAdapter を使ってバイ ンドする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 2.5.3 @BindingAdapter を使って複雑な処理を属性値で記述できるように する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 2.5.4 定義済みの@BindingAdapter や@BindingMethod、@BindingCon- version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.6 ユースケースと罠 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.6.1 ユースケース : ViewHolder の代わりに使う . . . . . . . . . . . . . 55 3 目次 2.6.2 ユースケース : プログレスとエラー表示をもつ ListView . . . . . . . 57 2.6.3 罠 : multi dex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 2.6.4 罠 : testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 2.7 最後に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 第 3 章 Kotlin それは希望の言語 66 3.1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 3.2 Android Studio で Kotlin を使う . . . . . . . . . . . . . . . . . . . . . . . . 67 3.3 ラムダ式を使ってイベントリスナをすっきり書く . . . . . . . . . . . . . . . 68 3.3.1 課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 3.3.2 Kotlin の答え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 3.3.3 ポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 3.4 モデルクラスからボイラープレートを取り除く . . . . . . . . . . . . . . . . 71 3.4.1 課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 3.4.2 Kotlin の答え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 3.4.3 ポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.5 拡張関数で Android の API を使いやすくする . . . . . . . . . . . . . . . . . 75 3.5.1 課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.5.2 Kotlin の答え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 3.5.3 ポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 3.6 null に強いプログラムをつくる . . . . . . . . . . . . . . . . . . . . . . . . 77 3.6.1 課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.6.2 Kotlin の答え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 3.6.3 ポイント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 アプリカティブなんとかみたいなことをする . . . . . . . . . . . . . . . . . 79 3.7 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 第 4 章 GCM Topic Messaging:C2DM 戦没 82 4.1 進化する GCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.2 GCM の構成概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.3 GCM の基本的な実装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 4.3.1 Configration ファイルの取得 . . . . . . . . . . . . . . . . . . . . . 83 4 目次 4.3.2 Configration ファイルを Android クライアントアプリケーションプ ロジェクトにコピー . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.3.3 Gradle の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 4.3.4 AndroidManifest.xml への追記 . . . . . . . . . . . . . . . . . . . . 87 4.3.5 registration トークンの取得 . . . . . . . . . . . . . . . . . . . . . . 88 4.3.6 GCM メッセージの受信 . . . . . . . . . . . . . . . . . . . . . . . . 91 4.4 Topic Messaging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.4.1 Topic Messaging とは . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.4.2 Topic Messaging の実装 . . . . . . . . . . . . . . . . . . . . . . . 92 4.4.3 Topic メッセージの受信と処理 . . . . . . . . . . . . . . . . . . . . 93 4.4.4 Topic メッセージの送信 . . . . . . . . . . . . . . . . . . . . . . . . 94 4.5 GCM Topic Messaging の使いどころ . . . . . . . . . . . . . . . . . . . . . 95 第 5 章 新パーミッションモデルを理解しよう 96 5.1 これまでの Android のセキュリティ . . . . . . . . . . . . . . . . . . . . . . 96 5.2 AppOps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3 新しいパーミッションモデル . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.3.1 新パーミッションモデルの対象 . . . . . . . . . . . . . . . . . . . . 98 5.3.2 新パーミッションモデルの設定画面 . . . . . . . . . . . . . . . . . . 99 5.3.3 従来アプリの動作と権限確認 . . . . . . . . . . . . . . . . . . . . . 101 PermissionChecker クラスと targetSdkVersion . . . . . . . . . . . . . . . 102 5.3.4 権限確認 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.3.5 権限要求 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 5.3.6 権限確認のコールバック . . . . . . . . . . . . . . . . . . . . . . . . 107 5.4 新パーミッションモデルのテスト . . . . . . . . . . . . . . . . . . . . . . . 108 5.5 新しいパーミッションモデルの課題 . . . . . . . . . . . . . . . . . . . . . . 109 5.6 サンプルコード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.7 最後に . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 第 6 章 マテリアルデザインのアイコンを作る! 112 6.1 プロダクトアイコンとは . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 6.2 アイコンデザインガイドライン . . . . . . . . . . . . . . . . . . . . . . . . 113 5 目次 6.3 必要なもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.3.1 Adobe Illustrator . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.4 現時点で必要でないもの . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.4.1 デザインセンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.5 手順 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.6 アイコンの形を決める . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.7 グリッドを作る . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 6.8 Material Background に色をつける . . . . . . . . . . . . . . . . . . . . . . 116 6.9 Material Foreground を置く . . . . . . . . . . . . . . . . . . . . . . . . . . 117 6.10 Material Foreground に影を追加する . . . . . . . . . . . . . . . . . . . . . 119 6.11 Shade を追加する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 6.12 Tint を追加する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.13 Finish を追加する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 6.14 おまけ: Foreground の影(ロングシャドウ) . . . . . . . . . . . . . . . . 123 6.15 おわりに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 第 7 章 Project Tango の進捗を確認する 125 7.1 Project Tango が目指すもの . . . . . . . . . . . . . . . . . . . . . . . . . . 125 7.2 ハードウェア面から Project Tango の現状を把握する . . . . . . . . . . . . 126 7.2.1 プロトタイプ端末(5 インチ携帯電話型) . . . . . . . . . . . . . . 127 7.2.2 Tango DevKit(7 インチタブレット型) . . . . . . . . . . . . . . . 129 7.3 ソフトウェア面から Project Tango の現状を把握する . . . . . . . . . . . . 131 7.3.1 アプリ開発者が Tango SDK から取得できるデータ . . . . . . . . . 131 7.4 Tango Service を使ったアプリ開発 . . . . . . . . . . . . . . . . . . . . . . 138 7.4.1 Tango Service の構造 . . . . . . . . . . . . . . . . . . . . . . . . . 138 7.4.2 Tango SDK のライフサイクル . . . . . . . . . . . . . . . . . . . . 139 7.4.3 Tango SDK のパーミッションモデル . . . . . . . . . . . . . . . . . 141 7.4.4 Tango Unity SDK を利用したポーズ情報の利用 . . . . . . . . . . . 142 7.5 Tango DevKit に関する所感 . . . . . . . . . . . . . . . . . . . . . . . . . . 145 7.5.1 Tango DevKit を使って得られたさまざまな感触 . . . . . . . . . . . 145 7.5.2 Tango DevKit 用アプリ開発でハマるところ . . . . . . . . . . . . . 146 7.5.3 既存の Project Tango 用アプリ . . . . . . . . . . . . . . . . . . . . 147 6 目次 7.5.4 エリア学習機能の実用性 . . . . . . . . . . . . . . . . . . . . . . . . 148 7.6 次世代 Tango を公式発表内容から読み解く . . . . . . . . . . . . . . . . . . 149 7.6.1 プロトタイプ版端末および Tango DevKit の課題点とその後 . . . . . 149 7.6.2 Google による公式の次世代発表 . . . . . . . . . . . . . . . . . . . 150 7.6.3 Project Tango の今後予想 . . . . . . . . . . . . . . . . . . . . . . . 150 本書の紙版発売(2015/08/16)後の動向 . . . . . . . . . . . . . . . . . . . 151 7.7 まとめ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 著者紹介 153 7 第 1 章 Introduction to RxJava 本稿は RxJava の入門書です。RxJava は、このところ話題を集めていますが、考え方が難 しいため学習コストがそれなりに高いフレームワークです。これは、いくつかの異なる利用 シーンに対して同じインターフェイスでデータを扱えるような設計になっているため、説明 しようとしてもどうしても抽象的な書き方になってしまうからではないかと筆者は考えてい ます。 そこで本稿では、RxJava の理念や概念には深入りせず、RxJava の使い方や利点・欠点に 集中します。また Android アプリケーションの開発経験者向けです。マルチスレッドプログ ラミングやイベントドリブンプログラミングなどの非同期プログラミングについての基礎知 識をすでに持っていることを前提とします。 なお、本稿のサンプルコードは https://github.com/gfx/RxJavaExample で公開しています。 1.1 RxJava とは何か RxJava*1は、Reactive Extension for JVM、つまり Reactive Extension の JVM 言語用の 実装です。Reactive Extension(ReactiveX, Rx)*2は、非同期プログラミングのためのフレー ムワーク*3です。オリジナルは Microsoft が開発した C#実装である Rx.NET で、現在はさら に JavaScript 用の RxJS などの実装もあります。 非同期プログラミングは Android アプリケーションのいたるところで使われます。Android アプリケーションは非同期プログラミングを多用するよう設計されているからです。 たとえば Android の UI の更新はメインスレッドで行いますが、すべての処理をメインス レッドで行うと、UI がブロックされてアプリケーションが反応しなくなります。この UI のブ ロックを避けるために、ネットワーク通信をメインスレッドで行うことが禁止されています。 *1 https://github.com/ReactiveX/RxJava *2 http://reactivex.io *3 "An API for asynchronous programming with observable streams"と説明されています 8
Description: