Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Androidアプリケーション開発中級研修 前編

 Androidアプリケーション開発中級研修 前編

NTTソフトウェア社内のソフト道場研修で実施した、Android研修テキスト前半です。

More Decks by NTTテクノクロス株式会社

Other Decks in Technology

Transcript

  1. Copyright © 2016, NTT Software Corporation. 2 本スライドは、NTTソフトウェア社内技術者育成研修(ソフト道場研修)テキストです。 ※ 実際の研修では演習を実施しますが、本テキストには演習に関する内容は含まれていません。

    【著作権・免責事項】 • 本セミナーコースの内容、本資料のすべての著作権は、NTTソフトウェア株式会社に帰属します。 • 無断での本資料の複写、複製、再利用、転載、転用を禁じます。 • 本資料と演習等で利用するすべての教材は、NTTソフトウェア株式会社からの保証なしに提供されます。 • 本書に記載されている会社名および製品名は、一般に各社の商標または登録商標です。
  2. Copyright © 2016, NTT Software Corporation. 3 他Android研修と本研修の関連 本研修を含め、3つのAndroid研修を実施しています。 レベル

    高 低 対象 タブレット スマホ ①アプリ開発入門 ③Androidテスティング実践 ②アプリ開発中級
  3. Copyright © 2016, NTT Software Corporation. 研修目的と到達目標 本研修をベースに自己学習が継続して行えるための ベースとなる知識を、実践を通して身につける。 ★

    0 知識 • ▪ 現時点 (保有スキルにより異なる) 研修受講後 (知識おさらい+実践) ゴール (1人称でのアプリ開発) 自己学習 +OJT 実践 Android Java Java Android
  4. Copyright © 2016, NTT Software Corporation. 研修目的と到達目標 入門研修の カバー範囲 中級研修の

    カバー範囲 • Android概要 • 4大要素1 Activity 基礎 • 4大要素2 Intent 基礎 • 4大要素3 Service 基礎 • 4大要素4 Content Provider 基礎 • UI/国際化/アニメーション 基礎 • センサー/ネイティブ連携基礎 • アプリ配信方法(Google Play等) 知識 実践 • Android開発環境構築 • Androidエミュレータ操作 • Hello Android開発 • Intent利用アプリ開発 • 上記に関連する演習 • 総合演習 • 4大要素1/4:Activity復習 • 4大要素2/4:Intent復習 • 4大要素3/4:Service復習 • 4大要素4/4:Content Provider復習 • データ永続化(DB、Shared Preference等) • 非同期処理 • ロケーション・地図 • タブレット向け開発 • Android最新機能 本書で利用しているAndroidのマスコット画像は、米国Google社が作成、提供しているコンテンツをベースに複製したもので、クリエイティブ・ コモンズの表示 3.0 ライセンスに記載の条件に従って使用しています。 http://creativecommons.org/licenses/by/3.0/deed.ja Androidアプリケーション開発 中級研修での目標 Androidアプリケーション開発 入門研修での目標
  5. Copyright © 2016, NTT Software Corporation. スケジュール 1日目 2日目 午前

    9:30~ 12:00 • Android概要・開発手順 • エミュレータ操作 • Activity • Intent • ロケーション • タブレット向け開発 • Android最新機能 昼休憩 12:00~13:00 午後 13:00~ 17:00 • Shared Preference • DB、Content Provider • 非同期処理 • Service • 地図 • 総合演習 • アプリ配信方法 ※小休憩は、約1~1.5時間毎に設けます。 入門研修範囲のActivity、Intent、Service、Content Providerについては、 演習を交えた復習を中心に実施。その他は、講義+演習を実施。
  6. Copyright © 2016, NTT Software Corporation. 携帯電話 Android端末 コンセプト キャリアが品質を保証してくれる世界

    利用者が”選択”する世界 アプリの自由度 低 高 セキュリティ 高(キャリアによる保証) 中(Linuxのパーミッションベース) アプリからの通信 アプリのダウンロード元 ※iアプリの場合 制限はなし 端末アプリ間データ共有 できない ※iアプリの場合 アプリ間でのデータ共有が可能 (Content Provider) アプリ連携起動 ブラウザ、メール本文の特定タグのみ ※iアプリの場合 アプリ間で自由に連携(Intent) 端末DB なし あり(SQLite) 導入①Androidの可能性(1) Androidは開発自由度が高く、 今まで実現不可だったソリューション構築が可能
  7. Copyright © 2016, NTT Software Corporation. 導入②Androidの可能性(2) iPhone(iOS) Android 開発主体

    Apple Google 開発環境(OS) OS X Windows OS X Linux 開発環境(SW) Xcode 無料 AndroidStudio + SDK 無料 開発ライセンス (マーケット利用) 99米ドル/年 299米ドル/年(企業向け) 25米ドル/初回 開発ライセンス (アプリ登録費用) なし なし Android は開発環境が多様で、 アプリ公開費用が安価なプラットフォーム
  8. Copyright © 2016, NTT Software Corporation. 導入③Androidの歴史 2008年09月 Android SDK

    1.0提供開始、世界初の端末T-Mobile G1 2009年04月 Android SDK 1.5(Cupcake)提供開始 2009年07月 日本初のAndroid搭載端末HT-03A発表(NTTドコモ)※当時1.5搭載 2009年09月 Android SDK 1.6(Donut)提供開始 2009年10月 Android SDK 2.0(Eclair)提供開始 2010年05月 Android SDK 2.2(Froyo)提供開始 2010年12月 Android SDK 2.3(Gingerbread)提供開始 2011年02月 Android SDK 3.0(Honeycomb)提供開始 2011年11月 Android SDK 4.0(Ice Cream Sandwich)提供開始 2012年06月 Android SDK 4.1(Jelly Bean)提供開始 2013年10月 Android SDK 4.4(Kit Kat)提供開始 2014年04月 Android Wear 提供開始 (4.4 Kit Kat ベース) 2014年10月 Android SDK 5.0(Lollipop)提供開始 2015年03月 Android SDK 5.1(Lollipop)提供開始 2015年10月 Android SDK 6.0(Marshmallow)提供開始 本研修の対象は、Android 5.1 ドコモ2015年夏モデル以降の多くに端末に搭載
  9. Copyright © 2016, NTT Software Corporation. ①OSバージョンの多様化 ②スクリーンサイズや解像度の多様化 Androidを取り巻く状況 4.1

    Jelly Bean 3.X Honeycomb 4.0 ICS 2.3 Gingerbread 4.4 Kit Kat 5.X Lollipop ③ウェアラブル端末の登場 (Android Wear) スクリーンサイズ 解像度 360×640dp 360×960dp 960×600dp 等… hdpi xhdpi xxhdpi 等… 従来のAndroid端末とは異なる画面サイズ、操作性。 ユースケースも異なる。 6.0 Marshmallow
  10. Copyright © 2016, NTT Software Corporation. 画面密度分布 hdpi tvdpi xhdpi

    xxhdpi ldpi mdpi 【出展】http://developer.android.com/about/dashboards/index.html(2016.5.2)
  11. Copyright © 2016, NTT Software Corporation. 画面密度:低 画面密度:中 画面密度:高 「dp(density-independent

    pixels」で指定した矩形+画像 【補足】画面密度とは? 一定の物理サイズに含まれるピクセル数
  12. Copyright © 2016, NTT Software Corporation. Androidのソフトウェアスタック ③ライブラリ ②Androidランタイム ①Linuxカーネル

    Androidアプリ (本研修の対象) ⑤アプリケーション ④アプリケーション フレームワーク 【出展】https://source.android.com/source/index.html
  13. Copyright © 2016, NTT Software Corporation. Android SDKの構成 Androidエミュレータ以外にも、 DDMS、ADBなど開発に役立つツールが含まれている!

    Android エミュレータ ADB (Android Debug Bridge) その他ツール AAPT sqlite3 draw9patch PC向け Android端末 エミュレータ デバッグ支援 mksdcard Device Monitor DDMS Hierarchy Viewer Systrace Traceview Tracer for OpenGL ES 端末の状態確認 モニター UI画面確認 性能解析
  14. Copyright © 2016, NTT Software Corporation. 環境構築 開発 公開 Androidアプリ公開までの流れ

    ※「開発」に、要件定義、設計フェーズ、試験フェーズも含んでいます。 STEP1 STEP2 STEP3
  15. Copyright © 2016, NTT Software Corporation. Androidの最重要キーワード Androidの4大要素 (ぜひ修得したいキーワード) 基本的に1画面=1Activity。

    UIやイベント処理などを定義する。 ⇒HelloAndroidで利用済。 ⇒1画面内の子画面はFragmentとして扱う (タブレットなどの2ペイン画面など) アクティビティやサービス間でやりとり する時に利用するメッセージ。 ⇒HelloAndroidからブラウザ起動。 画面表示と独立して行われる処理。 バックグラウンドでの操作に使う。 ⇒HelloAndroidの動作とは無関係に バックグラウンドでの音楽再生。 アプリのデータは、アプリ別の管理。 自アプリのデータへの別アプリからの アクセスを可能とする仕組み。 ⇒HelloAndroidから電話帳アプリの データにアクセス。 Activity Intent Service Content Provider
  16. Copyright © 2016, NTT Software Corporation. ▪≒Androidアプリの画面  基本的に1画面=1Activity/UIにひも付く 

    イベント処理の役割もある(Button押下⇒別画面表示等) 【Activity】概要 それぞれが 1つのActivity それぞれが 1つのActivity それぞれが 1つのActivity
  17. Copyright © 2016, NTT Software Corporation. ▪ ウィジェットを組み合わせて作成  ウィジェットとはAndroidで用意されたGUI部品のこと

     ウィジェットを用いる事で、効率的な画面開発が可能  ウィジェットを使用しない開発も可能 (性能を重視するゲームアプリなど) 【Activity】画面の構成要素(ウィジェット) ウィジェットを使う方式 ウィジェットを使わない方式
  18. Copyright © 2016, NTT Software Corporation. 【Activity】ウィジェット(GUI部品)の紹介 分類 クラス名 表示イメージ

    概要 ラベル TextView ラベル (文字列の表示) ImageVIew 画像の表示 テキスト ボックス EditText テキスト入力欄 AutoComplet e テキスト入力欄 (入力補完機能 あり) ボタン Button ボタン ImageButton 画像ボタン (画像を表示) チェック ボックス CheckBox チェックボックス ラジオ ボタン RadioButton ラジオボタン RadioGroup チェックボックス とラジオボタンを 収納するコンテ ナ 分類 クラス名 表示イメージ 概要 リストボックス Spinner ドロップダウ ンリスト ListView リスト表示 その他 ProgressBar プログレス バー(ぐるぐる 回転) AnalogClock アナログ時計 DatePicker 日付選択 TimePicker 時間選択 Gallery ギャラリー(複 数画像表示) 多くのGUI部品が標準提供されている
  19. Copyright © 2016, NTT Software Corporation. 【Activity】画面の構成要素(レイアウト)  ウィジェットの並べ方 

    LinearLayout  垂直方向もしくは水平方向に並べる  TableLayout  格子状に並べる  GridLayout(Android4.0以上)  格子状に並べ、細かなレイアウト制御も行う  FrameLayout  1つの部品のみを配置する/画面を重ね合わせる  RelativeLayout  ある部品をベースに他の部品を並べる/相対位置指定 ※AbsoluteLayout(絶対座標指定)も存在するが、非推奨。
  20. Copyright © 2016, NTT Software Corporation. 【Activity】レイアウト① LinearLayout  垂直方向もしくは水平方向に並べる

     最もシンプルなレイアウト  HelloAndroidでも利用  方向は、android:orientation属性で指定 垂直方向 水平方向
  21. Copyright © 2016, NTT Software Corporation. 【Activity】レイアウト② TableLayout  HTMLのテーブル状に並べる

     2次元のマス目上に配置する  1行を示すTableRowを組み合わせて構成 TableRow TableRow TableRow マス目上に配置
  22. Copyright © 2016, NTT Software Corporation. 【Activity】レイアウト③ GridLayout  HTMLのテーブル状に並べる(4.0以上)

     2次元のマス目上に配置する  幅や高さを何マス分取るかの指定可能 0,0 0,1 0,2 0,3 1,0 1,1 1,2 1,3 rowSpan=2 2,0 2,1 2,2 3,0 3,1 3,2 3,3 rowSpan=2 4,0 colSpan=2 4,2 column row
  23. Copyright © 2016, NTT Software Corporation. 【Activity】レイアウト④ FrameLayout  1画面に1部品/重ね合わせ可能

     画面の上に重ねて表示する場合に利用 ※カメラのプレビュー画面上への重畳表示等 下に置く画面 上に重ねる画面 重ねて表示される
  24. Copyright © 2016, NTT Software Corporation. 【Activity】レイアウト⑤RelativeLayout  基準部品を元に相対的に配置を行う 

    使い方が複雑だが、 うまく使えばイメージ通りの画面を作り易い [基準]画面の中央 テキストのベースを合わせる 左端を揃える 左下と右上を揃える 左右中央の上端 画面の右下
  25. Copyright © 2016, NTT Software Corporation. 【Activity】非推奨レイアウトAbsoluteLayout x=77,y=51 x=165,y=151 x=30,y=227

     絶対座標を指定して並べる  任意の位置に部品を配置可能  画面サイズに依存してしまう&クラス自体が非推奨 ⇒特別な理由がない限り、使用すべきでない。
  26. Copyright © 2016, NTT Software Corporation. 【Activity】ライフサイクル onPause() onStop() onDestroy()

    onCreate() onStart() onResume() 実行中 強制終了 onRestart() foreground visible entire 終了 開始 ライフサイクル全体 onCreate()~onDestroy() 画面表示状態 onStart()~onStop() アクティブ onResume() ~onPause()
  27. Copyright © 2016, NTT Software Corporation. 高レベル 低レベル XMLファイル (今までの演習方式)

    ・UIとビジネスロジックを分離可能 ・UIはXMLファイル、 ビジネスロジックは Javaコード内に記述 ・×(本方式では実現不可) Javaコード ・実現可能だが、 XML方式より工数が必要 ・動的に変化するUIの実装が可能 UIをXMLファイルで定義する以外に、 Javaコードで定義する方法もあり 【Activity】画面の作り方(応用) LinearLayout linearLayout = new LinearLayout(this); // レイアウト生成 linearLayout.setOrientation(LinearLayout.VERTICAL); // 縦方向に setContentView(linearLayout); TextView textView = new TextView(this); textView.setText(R.string.hello); // リソースから文字設定 linearLayout.addView(textView); // 追加 ▪Javaコード方式によるHello World
  28. Copyright © 2016, NTT Software Corporation. 【Activity】まとめ  Activity≒画面 (Activityは画面とユーザ操作間のコントローラ)

     基本的に1画面=1Activity  ボタンやテキストエリアなど豊富な標準ウィジェットを利用可能  画面はXMLで定義  Javaで直接記述する実装も可能  Activityには、ライフサイクルがある  ライフサイクルは、品質確保の意味でも考慮必須  ライフサイクルを意識すれば、 バッテリー持ちの良いアプリを開発可能
  29. Copyright © 2016, NTT Software Corporation. 【Intent】概要  Activity間のやり取りのためのメッセージ 

    アクティビティ名やアクションを指定し、Activity起動  Service等(後述)とのやり取りにも用いる 暗黙的Intentによる他アプリ(ブラウザ)の起動 明示的IntentによるActivityの起動
  30. Copyright © 2016, NTT Software Corporation. 【Intent】①明示的Intent Intent i =

    new Intent(MainActivity.this, Report1Activity.class); startActivity(i); MainActivity Report1Activity 起動元Activity 起動するActivity 明示的Intentは、呼出先のActivityを指定して送信する。 アクティビティ名 を指定した起動
  31. Copyright © 2016, NTT Software Corporation. 【Intent】②暗黙的Intent(1/2) Intent i =

    new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.ntts.co.jp/")); startActivity(i); 標準ブラウザ アクション URI アクション+URIを 指定した起動 処理可能なActivityが複数ある場合 (例.標準ブラウザ+勝手ブラウザ) 処理可能なActivityが1つだけの場合 (例.標準ブラウザのみ)
  32. Copyright © 2016, NTT Software Corporation. 【Intent】②暗黙的Intent(2/2) 動作 アクション Uri

    Webブラウザ起動 android.intent.action.VIEW ・http://Webサイトアドレス ・https://Webサイトアドレス 地図アプリ起動 ・geo:latitude,longitude ・geo:latitude,longitude?z=zoom ・geo:0,0?q=my+street+address ・geo:0,0?q=business+near+city 電話発信 android.intent.action.CALL ・tel:電話番号 ダイヤル画面表示 android.intent.action.DIAL ・tel:電話番号 ※URI/アクション以外に、カテゴリという概念もある URI+アクション指定により、アプリ連携可能
  33. Copyright © 2016, NTT Software Corporation. 43 【Intent】明示的Intentと暗黙的Intentの復習 ①明示的Intent ②暗黙的Intent

    概要 起動したいアクティビティ(クラス)名を 具体的に指定する 特定アクション(+URI)を処理可能なアプリ を起動する 利用例 ▪HogeActivityを起動する Intent i = new Intent(MainActivity.this, HogeActivity.class); startActivity(i); ▪ACTION_VIEW+Webアドレス(Webブラ ウズ)を処理可能なアプリを起動する Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.ntts.co.jp/")); startActivity(i); 振舞い 必ずHogeActivityが起動される アプリ一覧画面(ブラウザA、ブラウザB等) を表示し、ユーザが使いたいアプリを選択する 長所 起動アクティビティは1つに絞られるため、 開発者が意図した操作が行われる 実行時にユーザが使いたいアプリを選択するな ど、ユーザビリティを高められる 短所 アプリ間の結合度が強く、実行時に最適な アクティビティの起動はできない 開発者が意図しないアプリが起動された場合の 品質確保が難しい 特徴を押さえて、使い分けることが重要!
  34. Copyright © 2016, NTT Software Corporation. 【Intent】 Intentフィルタ  暗黙的Intentを処理できることを宣言する仕組み

     Androidマニフェスト内に、受けるIntentを予め定義  IntentとIntentフィルタがマッチングされるイメージ <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> </intent-filter> Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.ntts.co.jp/")); startActivity(intent); ▪Intentを受ける側のActivity ▪Intentを投げる側のActivity Activity A Activity B
  35. Copyright © 2016, NTT Software Corporation. ▪Intentの宛先が複数(ブロードキャスト)  通常のIntentの宛先が1つであるのに対し、システムが宛先 

    システムで受信したIntentは、複数のアプリに送信される 【Intent】ブロードキャストIntent ブロードキャストIntentの送信イメージ アプリ アプリA ブロードキャストIntent (インテントX) システム アプリB アプリC アプリR … ブロードキャストIntentを受信するには、 その設定が必要。 (この例では、A、CがXの受信設定をしている。) ※ブロードキャストIntent受信には、BroadcastReceiverを用いる
  36. Copyright © 2016, NTT Software Corporation. ▪BroadcastIntentを受信するテストアプリによる検証 BroadcastIntent (端末が起動した/タイムゾーンが変更された/SMSが届いた) システム

    IntentFilter BOOT_COMPLETED TIMEZONE_CHANGED SMS_RECEIVED BroadcastReceiver onReceive()メソッド AndroidManifest内に 処理対象とするIntentを記述 処理対象のBroadcastIntentが 届くと、onReceiveが呼ばれる 【Intent】ブロードキャストIntentの動作イメージ
  37. Copyright © 2016, NTT Software Corporation. 【Intent】まとめ  Intent≒Activity間のやり取りのためのメッセージ (Serviceや、BroadcastReceiver間でも利用)

    指定する内容 投げ先 受信側の対応 明示的Intent Activity(クラス名) Activity 特になし 暗黙的Intent アクション システム (Intentフィルタで マッチング) Intentフィルタを 定義する ブロードキャスト Intent 特になし システム全体 BroadcastReceiverを 実装する(※) ※3.1以降は、初回起動済であること
  38. Copyright © 2016, NTT Software Corporation. 【データ入出力と永続化】概要 長所 短所 ①Shared

    Preference ◦Key=Valueで簡単に使える ◦パーミッション設定可能 ×データ型が少ない ②DB ◦大量データを扱いやすい ×利用準備が煩雑 ×SQLを覚える必要あり ③Content Provider (※2) ◦アプリ間のデータ共有可能 ◦データ構造の詳細を把握する ことなく、利用可能 ×利用準備が煩雑 ④File ◦J2SEのAPIと同じで簡単に使 える ◦自由度が高い ×自由度が高い反面、フォー マット規定が必要 ※1:上記以外に、Network上にデータを配置して通信で取得する方式もあり ※2:Content Provider自体はデータ形式を握っているのではなく、①②④の形式のデータを 別アプリに公開するための機構(ラッパー的なもの)だとイメージすると良い。 データ入出力には、4つの方式(※1)あり (状況に応じた適切な使い分けが必要)
  39. Copyright © 2016, NTT Software Corporation. ▪簡単にデータを永続化する手段  key=value形式でデータを永続化 

    boolean,int,float,long,String型のデータを管理可能 【Shared Preference】概要 アプリ内で入力した 値を保存したい int型のデータ String型のデータ boolean型のデータ
  40. Copyright © 2016, NTT Software Corporation. 【SharedPreferece】実装例 ▪データの格納方法 SharedPreferences sp

    = getSharedPreferences("sampledata", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); editor.putString("KEY_PHONE_NAME", "アンドロ太郎"); editor.commit(); ファイル名 アクセスレベル(後述) データ格納時にのみ 必要なオブジェクト SharedPreferences sp = getSharedPreferences("sampledata", MODE_PRIVATE); String phoneName = sp.getString("KEY_PHONE_NAME", "名無し"); ▪データの取得方法 データ格納実行 データの取得 データの格納 (予約まで) “名無し”は、同キーで値を取得 できなかった場合のデフォルト値
  41. Copyright © 2016, NTT Software Corporation. 【SharedPreferece】アクセス権 定数 意味 MODE_PRIVATE

    同一アプリ内からのみアクセス可能 MODE_WORLD_READABLE 同一アプリだけでなく、他アプリからも 読み込み可能 MODE_WORLD_WRITEABLE 同一アプリだけでなく、他アプリからも 書き込み可能 ▪データのアクセス権を3つモードから選択可能 -getSharedPreferenceの第2引数 ※基本的には、SharedPreferenceは同一アプリ内でのみ使うのがお勧め →MODE_PRIVATEを使った方が良い。 (他アプリからのアクセスを許すのは、セキュリティ的に望ましくない。 また、MODE_WORLD_READABLE、 MODE_WORLD_WRITEABLEは、 Android4.2~非推奨となった。)
  42. Copyright © 2016, NTT Software Corporation. 58 ▪軽量RDBMS(SQLite)を利用可能  データアクセスはSQLを利用

     レコードタイプのデータ管理が可能 【DB】概要 ID NAME1 NAME2 1 東京都 東京 0 氷 かき氷 1 アイスクリーム アイス SQLIte データ型が 意識されない (DATEやVARCHARは未 サポート) C/S方式ではない データアクセスは、 SQLiteOpenHelperを継承 して、必要なメソッドを オーバーライド
  43. Copyright © 2016, NTT Software Corporation. 【DB】実装例(1/2) ▪ SQLiteOpenHelperの継承クラスの実装 public

    DBAccessHelper(Context context) { super(context, “sampleDb”, null, 1); } public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE sampleTable (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "name TEXT);"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS sampleTable"); onCreate(db); } DBのversion DB名 DBのversionが上がった場合に呼び出されるメソッド DBのテーブル生成
  44. Copyright © 2016, NTT Software Corporation. 【DB】実装例(2/2) ▪ DBヘルパークラスを利用するActivityの実装 private

    SQLiteDatabase db; private Button buttonAdd; public void onCreate(SQLiteDatabase db) { db = (new DBAccessHelper(this)).getWritableDatabase(); .... buttonAdd.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { addRecord(“山田”); } }); } private void addRecord(String name) { ContentValues values = new ContentValues(); values.put(“name”, name); db.insert(“sampleTable”, null, values); } データのinsert処理 DBヘルパークラス経由でSQLiteDatabaseインスタンスを取得
  45. Copyright © 2016, NTT Software Corporation. 【DB】SQL発行のためのAPI  SELECT系 (戻り値としてCursorが返る)

     rawQuery(String sql, String[] selectionArgs)  SQLで書きたい人向け。途中に?を書ける。  query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)  SQL書きたくない人向け。WHERE句にだけ?を書ける。  INSERT/UPDATE/DELETE  insert(String table, String nullColumnHack, ContentValues values)  update(String table, ContentValues values, String whereClause, String[] whereArgs)  delete(String table, String whereClause, String[] whereArgs)  その他のSQL  execSQL(String sql, String[] bindArgs) rawQuery(“SELECT _id, unit, name FROM addressbook WHERE unit = ? ORDER BY name ASC”, new String[] {“総務部"}); query("addressbook", new String[] {"_id", "unit", "name"}, "unit = ?", new String[] {“総務部"}, null, null, "name ASC");
  46. Copyright © 2016, NTT Software Corporation. 【DB】便利ライブラリの紹介 ActiveAndroid SQLを書かずにレコードの保存、検索等が可能 データベース、テーブル作成等のセットアップも簡単な設定のみで自動実行

    入手先:https://github.com/pardom/ActiveAndroid/wiki 項目 概要 実装イメージ テーブル定義 Modelのサブクラスを定義する。 ・テーブルの生成は自動実行 ・このクラスがDBとの インターフェースになる @Table(name = “Samples") public class Sample extends Model { @Column(name = "Age") public int age; @Column(name = "Name") public String name; } Insert Sampleインスタンスを生成し て「save()」を実行する。 Sample sample = new Sample(); sample.age = 2; sample.name = “hoge”; sample.save(); Query 条件を指定して、 「execute()」を実行する。 List<Sample> sample = new Select() .from(Sample.class) .where(“name = ?”, “hoge”).execute();
  47. Copyright © 2016, NTT Software Corporation. 65 【Content Provider】概要 

    アプリ間でデータを共有するための仕組み  アプリごとにデータ領域は別管理  アプリ間でデータを共有する場合に必要となる アプリA アプリB アプリAのデータ領域 アプリB→アプリAのデータ領域へのアクセス ファイル DB × コンテンツ プロバイダー コンテンツプロバイダー経由 であれば、アプリAのデータ やDBにアクセスできる
  48. Copyright © 2016, NTT Software Corporation. 66 【Content Provider】データの扱い 

    データのありか=URI形式による区別  具体的には、content://xxx(URI形式)  Android標準のもの以外にアプリ独自の定義も可能 Content Providerイメージ アプリA アプリB アプリAのデータ領域 ファイル DB 独自コンテンツ プロバイダー content://jp.co.ntts.provider OSのデータ領域 標準コンテンツ プロバイダー(電話帳) content://contacts/people/ 電話帳 Android OS
  49. Copyright © 2016, NTT Software Corporation. 67 【Content Provider】実装例 

    サンプルソース import android.provider.ContactsContract.CommonDataKinds.Phone; ... Cursor c = null; try { String name = "未取得"; c = getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); int nameColumn = c.getColumnIndex(Phone.DISPLAY_NAME); while (c.moveToNext()) { name = c.getString(nameColumn); } } catch (Exception e) { } finally { if (c != null) c.close(); } 電話帳のContent Providerを用いて 検索用のカーソルを取得 カラム特定のための インデックス カラムインデックスを指定して 内容取得
  50. Copyright © 2016, NTT Software Corporation. 68 【Content Provider】queryメソッドのパラメータ 

    サンプルソース Cursor c = getContentResolver().query( uri, projection, selection, selectionArgs, sortOrder); 引数 内容 型 uri 操作対象のContentProviderのURI 例. android.provider.ContactsContract.CommonDataKinds.Phone. CONTENT_URI Uri projection 取得する列名(nullの場合、全ての列を取得する) 例.String[] projection = {"DISPLAY_NAME"}; String[] selection SQLのwhere句に該当する文字列(nullの場合、絞込みしない) 例.String selection = "DISPLAY_NAME=Yamada"; String selectionArgs selectionに含まれる"?"を置換するための文字列 例.String selection = "DISPLAY_NAME=?" String[] selectionArgs = {"Hanako"}; String[] sortOrder SQLのORDER BY句に該当する文字列 (nullの場合、順番を指定しない) 例.String sortOrder = "DISPLAY_NAME ASC" String 5つのパラメータあり
  51. Copyright © 2016, NTT Software Corporation. 70 【Content Provider】まとめ 

    Content Provider=アプリ間のデータ共有 (アプリ間におけるデータ共有には、必須)  Content Providerを利用する側と利用される側  利用する側 :URI指定でのアクセス(DB的な使い方)  利用される側:CotentProviderを継承したクラス実装等 ※Intent経由でデータ共有することや、 強制的なファイルパーミッション変更による共有は可能だが、 アプリ間のデータ共有にはContent Providerの利用を推奨
  52. Copyright © 2016, NTT Software Corporation. 71 【データ入出力と永続化】まとめ(再掲)  データ入出力には、4つの方式あり。

    状況に応じての使い分けが必要。  ①Shared Preference  ②DB  ③Content Provider  ④File
  53. Copyright © 2016, NTT Software Corporation. 74 【非同期処理】NG対処① メインスレッド (UIスレッド)

    通信処理 UI反映 ▪通信で取得したデータを画面に表示  メインスレッド内で通信処理を行い、通信処理が 完了した時点でUIに反映
  54. Copyright © 2016, NTT Software Corporation. 75 × 【非同期処理】NG対処① メインスレッド

    (UIスレッド) 通信処理 UI反映 ▪通信で取得したデータを画面に表示  メインスレッド内で通信処理を行い、通信処理が 完了した時点でUIに反映 メインスレッド(UIスレッド)を、 5秒以上停止させるのはNG。 (Androidのルール)。 ANR (Application Not Responding)
  55. Copyright © 2016, NTT Software Corporation. 76 メインスレッド (UIスレッド) 通信スレッド

    通信スレッド起動 通信処理 (情報取得) UI反映 【非同期処理】NG対処② ▪通信で取得したデータを画面に表示  通信スレッドを起こして、同スレッド内で情報を 取得しUI反映
  56. Copyright © 2016, NTT Software Corporation. 77 メインスレッド (UIスレッド) 通信スレッド

    通信スレッド起動 通信処理 (情報取得) UI反映 × 他のスレッドから、UIを 直接変更することはできない。 【非同期処理】NG対処② ▪通信で取得したデータを画面に表示  通信スレッドを起こして、同スレッド内で情報を 取得しUI反映
  57. Copyright © 2016, NTT Software Corporation. 78 ▪HandlerとAsyncTaskの2種類あり 【非同期処理】OK対処①・② OK対処①(Handlerを用いる方式)

    OK対処②(AsyncTaskを用いる方式) ・メインスレッドと通信スレッドの仲介役 「Handler」を用いる。 ・バックグランド処理を実行するための専用クラス 「AsyncTask」を用いる。
  58. Copyright © 2016, NTT Software Corporation. 【HTTP通信】便利ライブラリの紹介 ライブラリ 用途 リポジトリ

    OkHttp ひとまず通信処理を実装したい、細かい 処理まで自分で実装したい場合に有効。 同期版APIと非同期版APIの両方が用意さ れている。 HTTPクライアントのライブラリで、 HTTP、HTTPSに加えて、HTTP/2、 SPDY、WebSocketにも対応している。 https://github.com/square/okhttp Retrofit 共通的な通信処理を行う場合に有効。 RESTクライアントのライブラリで、処 理の共通化などにより簡潔な実装が可能 となっている。 https://github.com/square/retrofit Picasso 画像ファイルの取得に有効。 画像読み込みのライブラリで、画像ファ イルの取得処理が抽象化されている。 https://github.com/square/picasso ▪通信処理で利用できる便利なライブラリをピックアップ。 用途に応じて最適なライブラリを利用、もしくは組み合わ せて利用することも可能となっている。
  59. Copyright © 2016, NTT Software Corporation. 82 【Service】概要  画面表示とは独立して行う処理にはServiceを用いる

     バックグラウンドで動作させたい処理(音楽再生等)  外部から制御させたい処理に利用(開始以外に停止等) アクティビティ→サービスの起動方法 アクティビティ サービス ①Intentによる起動 ②Bindを用いた起動 ①利用する側 ②利用される側 例①音楽再生 例②ログアップロード 例③定期アラート通知
  60. Copyright © 2016, NTT Software Corporation. 83 【Service】ServiceとActivityの比較  ServiceとActivityは、対称的な存在

    双方を適材適所で利用するのが望ましい ①Service ②Activity 特徴 画面表示することなく、 バックグラウンドで 常駐動作可能。 ユーザに見える画面と 密接に連動して動作。 注意点 原則、UIの制御はできない。 -(省略)
  61. Copyright © 2016, NTT Software Corporation. 84 【Service】様々なService起動  Service起動の方法には、2種類ある

    ①Intentによる起動 ②Bindを用いた起動 概要 使い方が容易な分、 できることに制限あり 使い方が複雑だが、 できることに制限なし 長所 使い方が簡単 Intentを渡すだけ 細かな制御が可能 リモートメソッド呼び出し 短所 細かな制御が不可 起動指示のみ 使い方が複雑 インタフェース(AIDL)作成が必要
  62. Copyright © 2016, NTT Software Corporation. 85 【Service】Intentによる起動 /概要 

    startService()を用いた起動  長所:使い方が簡単(Intentを渡すだけ)  短所:細かな制御ができない(Serviceには起動指示のみ) public class HelloService extends Service { public int onStartCommand( Intent intent, int flags, int startId) { 【実行したい処理】 return 【サービスの挙動を決める定数】 } ▪ Serviceソース例 ▪ Serviceを起動する側のActivityソース例 Intent i = new Intent(MainActivity.this, HelloService.class); startService(i); 起動元Activity 起動先Service onStartCommand() startService()時に呼び出される
  63. Copyright © 2016, NTT Software Corporation. 86 【Service】 Intentによる起動 /サービス実装例

     サンプルソース【HelloService.java】 public class HelloService extends Service { public void onCreate() { } public void onDestroy() { } public IBinder onBind(Intent intent) { return null; } public int onStartCommand( Intent intent, int flags, int startId) { // ①Intentによる起動 【実行したい処理】 return 【サービスの挙動を決める定数】 } } Serviceとは? バックグラウンドで 動作させたい処理 onBind() 必須メソッド (①Intentによる起動の場合は、 return null;の実装でOK) onStartCommand() ①Intentによる起動の場合の 必須メソッド
  64. Copyright © 2016, NTT Software Corporation. 87 【Service】 Intentによる起動 /onStartCommand()

     onStartCommand()の戻り値は以下から選択  サービスが強制終了した場合の挙動を決める定数 戻り値 (Serviceクラスの定数) 内容 START_NOT_STICKY ・サービスが強制終了した場合でも、再起動しない (次回startService()されたら、その時に起動する) START_STICKY ・サービスが強制終了した場合、再起動する ・onStartCommand()のintent引数にはnullが渡される START_REDELIVER_INTENT ・サービスが強制終了した場合、再起動する ・onStartCommand()のintent引数には、 直前に渡されたものと同じインテントが渡される ※どの場合でも、未配送のインテントが失われることはない。
  65. Copyright © 2016, NTT Software Corporation. 88 【Service】ライフサイクル  Serviceのライフサイクル

    Activityと比較して、単純なライフサイクル 一時停止状態が存在しない onDestroy() onCreate() onStart() 実行中 終了 開始
  66. Copyright © 2016, NTT Software Corporation. 89 【Service】Service登録に必要な作業  AndroidManifestに公開するService定義が必要

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hello.sample.ntts.co.jp.helloservice“ > <application android:icon="@mipmap/ic_launcher “ android:label="@string/app_name"> <service android:name=“.HelloService“></service> </application> </manifest> Serviceを登録する ために記述
  67. Copyright © 2016, NTT Software Corporation. 90 【Service】②Bindを用いた起動/概要 ▪bindService()を用いた起動 

    長所:細かな制御が可能(リモートメソッド呼び出し)  短所:使い方が複雑(AIDL(インタフェース)作成が必要)) ブロードキャストレシーバから呼び出せない 概要 ファイル 内容 サービスイン タフェース ISampleService.aidl (AIDLファイル) ・サービス実装クラスのインタフェース定義 (中身は、Javaのインタフェースと同じ/拡張子はaidl) サービス実装 SampleService.java ・アクティビティから接続された場合に呼び出される処理 ・サービス実装 サービス利用 アクティビ ティ MainActivity.java ・サービスへ接続する処理 ・サービスで定義されているメソッドを呼び出す処理 マニフェスト AndroidManifest.xml ・サービスを登録するための記述 ・サービスのアクションとしてサービスインタフェースを記述 サービスBindに必要となるファイル例
  68. Copyright © 2016, NTT Software Corporation. 91 【Service】②Bind方式/AIDL例  ソース【ISampleService.aidl】

    interface ISampleService { void sampleMethod(String musicName); void sampleMethod2(); } 外部から呼び出しを 可能とするサービスの メソッドインタフェース インタフェースのため、 空実装で問題なし 拡張子はaidlとするが、 中身はJavaのインタフェースと 同じ
  69. Copyright © 2016, NTT Software Corporation. 92 【Service】②Bind方式/サービス実装例  ソース【SampleService.java】

    public class SampleService extends Service { public IBinder onBind(Intent intent) { return sampleServiceIf; } private ISampleService.Stub sampleServiceIf = new ISampleService.Stub() { public void sampleMethod(String musicName) throws RemoteException { Log.i(TAG, "sampleMethod() has called."); } public void sampleMethod2() throws RemoteException { Log.i(TAG, "sampleMethod2() has called."); } }; } 外部からサービス接続された 場合に呼び出される 外部に公開する メソッドの実装
  70. Copyright © 2016, NTT Software Corporation. 93 【Service】②Bind方式/サービス呼び出し例  ソース【MainActivity.java】

    private ISampleService sampleIServiceIf; private ServiceConnection sampleServiceConn = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { sampleIServiceIf = ISampleService.Stub.asInterface(service); } public void onServiceDisconnected(ComponentName name) { sampleIServiceIf = null; } }; サービスに接続したときに 呼び出される Intent intent = new Intent(this, SampleService.class); bindService(intent, sampleServiceConn, BIND_AUTO_CREATE); sampleIServiceIf.sampleMethod("test"); sampleIServiceIf.sampleMethod2(); サービスに接続するための 処理 サービスの メソッド呼び出し
  71. Copyright © 2016, NTT Software Corporation. 95 【Service】まとめ  Service=バックグラウンドで動作させるための仕組み

    (長いライフサイクルを持つ処理に用いることが多い)  画面は持たず動作させたい処理(音楽再生等)  外部から制御させたい処理に利用(開始以外に停止等)  Serviceにもライフサイクルあり(一時停止状態なし)  Serviceを利用する側と利用される側  利用する側 :Intent起動とBind起動  利用される側:AndroidManifestへのService定義