Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Androidアプリケーション開発
応用トレーニング

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-1
トレーニングの目的
• Androidのアプリケーション開発における実践的
な知識、技術を身につける
– Androidのコンポーネント
– 実践的開発

• 演習を通して、アプリケーション開発の実践力
を養う
– 開発力に主眼

This m...
トレーニングスケジュール
• 1日目
1章 はじめに
2章 Androidコンポーネント
3章 実践的開発

• 2日目
4章 実践的開発2
5章 外部連帯
6章 実践的デバッグ
※ 一部参考資料とし、講義では取り上げない場合があります
。
T...
受講するに当たって必要なスキル
• OESF公認Androidアプリケーション開発入門コー
スを 受講済または、下記に示すスキルを有す
ること
– Androidアプリケーションの基礎的なスキルを前提と
する
– 複数画面からなる簡単なアプリケ...
1. はじめに

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-5
1章の概要
• 開発環境
• 演習で用いるアプリケーション
• 演習概要

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-6
1.1. 開発環境
• 本トレーニングでは下記の開発ツールを用いる
• インストールはすでに終了している
• SDK付属のToolsにパスが通っている
ソフトウェア

バージョン

Eclipse

Eclipse IDE with built...
1.1. 開発環境
– Eclipseワークスペース
• C:android_training_appliedworkspace を指定のこと

– エミュレータ
• 演習で使用するエミュレータの作成方法は別ドキュメント参
照
• 6章実践的デ...
1.2.演習で用いるアプリケーション
• 初日の演習では、OESF公認Androidアプリケーシ
ョン開発入門コース で作成したRSSリーダーに
拡張を加える

• 2日目の演習では、各単元ごと、それぞれの挙動
を確認できるアプリケーションを作...
1.2.演習で用いるアプリケーション
• RSSリーダーの画面と機能概要
– 3画面で構成されている
・・・ 画面遷移の方向

RSSリーダー

起動

①
メニュー

画面

②
一覧画
面

③
詳細画
面

#

画面名

機能概要

1...
1.3.演習概要
サービスでの
取得処理

ブロードキャストレ
シーバでの処理開始

コンテントプロバイ
ダでのアクセス

インターネットから
RSSフィードを取得す
る

メニュー
画面

データベースに
RSSフィードを登
録

データベー...
1.3.演習概要
• テーブルレイアウト
– RSS_FEED テーブル
列名

型

備考

_id

INTEGER

GUID

TEXT

• RSSフィードに割り当てられる識別子

TITLE

TEXT

• タイトル

PUBLI...
2. Androidコンポーネント

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-13
2章の概要
•
•
•
•
•

アクティビティ
インテント
サービス
ブロードキャストレシーバ
コンテントプロバイダ
– ※ アクティビティとインテントは確認のみとなりま
すそれ以外は講義の後に、実習を行います

This material ...
2.1.アクティビティ
• アクティビティとは?
– Androidアプリケーションの画面は、アクティビティ
の上にボタン、チェックボックス等の部品を配置し
、画面を作成する
– 1画面は1つのアクティビティで構成する
– アクティビティは実行...
2.1.アクティビティ
• サンプルコード
package jp.oesf.mtgeduwg.training.rssreader;
import android.app.Activity;
import android.util.Log;
i...
2.1.アクティビティ
• AndroidManifest.xml のサンプルコード
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas....
2.1.アクティビティ
• [参考]通知されるイベントを含むライフサイクル
Activity起動

onCreate()
・
"戻る"で元画面に復帰

onStart()

フ ア
ォ
グラ
ウンド

プ
ロセス破棄

onRestart()
...
2.1.アクティビティ
– [参考] AndroidManifest.xml の設定はリソースエディタ
でも可能

This material is licensed under the Creative
Commons License BY-...
2.2.インテント
• インテントとは?
– コンポーネント間で、処理の依頼や、メッセージを
やりとりする為の仕組み
• インテントを利用できるコンポーネントは、アクティビティ
、ブロードキャストレシーバ、サービス

– インテントを利用する具...
2.2.インテント
• インテントにより、コンポーネントを呼び出す
には、インテントに、呼び出し先のコンポーネ
ントの情報を含めて、Androidに呼び出しを依頼
する
イ
ンテント
オブジェ
クト
を作成し 送信メ
て、
ソッ を実行する
ド...
2.2.インテント
• サンプルコード
package jp.oesf.mtgeduwg.training.rssreader;
import android.app.Activity;
import android.content.Inten...
2.3.サービス
• サービスとは?
– UIを持たないバックグラウンドで処理を行うコンポー
ネント

– サービスは画面とは独立して実行される。このため
、アクティビティが非表示になっても処理を続ける
音楽を再生(サービス未使用)
音楽を再生...
2.3.サービス
• サービスを実装する方法
– サービスを新規作成する
– 作成したサービスをAndroidManifest.xmlに登録する
– 作成したサービスをstartServiceメソッドにて起動する

This material ...
2.3.サービス
• サービスを実装する方法
– サービスのクラスを新規作成する
• 基底クラスとなるServiceクラスを継承したクラスを作成する
• onBindメソッドは抽象メソッドのため実装する必要がある。
– ここではバインドを用いな...
2.3.サービス
– 必要に応じてコールバックメソ
ッドを実装する
• onCreate, onStartCommand,onDestroy
の3つのメソッドがある
• ライフサイクルを意識し、適切に実
装をする
• onStartComman...
2.3.サービス
• onStartCommandメソッドの戻り値として以下の
4つの定数が用意されている
説明
• 戻り値
これらの戻り値のうちどれを選ぶかによって、
サービスを起動するペンディングインテントが存在しない限りサービスは再
ST...
2.3.サービス
• サンプルコード
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Int...
2.3.サービス
– 作成したサービスをAndroidManifest.xmlに登録する
• 作成手順
i.
ii.

AndroidManifest.xmlを開き、Applicationタブを選択する
Application Nodesの「A...
2.3.サービス
iii. 表示された画面からServiceを選択し「OK」ボタンをクリッ
クする
※すでに登録されているノードにカーソルがあたっている場合は
、階層を確認されるので、ラジオボタンの上を選択する

This material i...
2.3.サービス
iv. 追加されたServiceが選択されていることを確認した上で、
Nameの欄に作成したサービスのクラスの名前を入力する

Browseボタンをク
リックし、ブラウズ
するのが便利

This material is li...
2.3.サービス
– AndroidManifest.xmlには以下のように追加される
• これによりサービスのクラスとして登録されたことになる

・・・
<application ・・・>
・・・
<service android:name=...
2.3.サービス
– 作成したサービスをstartServiceメソッドにて起動する
• Intentの引数に、呼出元のオブジェクト、呼出先のサービス
のクラス情報を与えて生成する
• Context#startServiceを実行する。メソッ...
実
習

2.3.サービス
• 実習 1
• 実習のテーマ
– メニュー画面にて「menu」ボタン => 「RSS取得」メ
ニューを押したときに、RSSの取得メソッドがサービ
スで起動する処理を作成する
画面はそのまま
操作可能

This m...
実
習

2.3.サービス
– 実習の手順
1. サービスとなるRegisterServiceクラスを新規作成する
2. RegisterServiceのonStartCommandメソッドで、RSSを取得す
る
3. RegisterServ...
実
習

2.3.サービス
– 設定情報 1
• 以下のクラス、メソッドを実装する

対象

サービス

クラス

メソッド

• 新規作成する
• パッケージは
jp.oesf.mtgeduwg.training.rssreader
とする
...
実
習

2.3.サービス
– 設定情報 2
• 以下のファイルを編集する

ファイル名

AndroidManifest.xml

概要

• RegisterServiceをサービスとして登録する

This material is lic...
実
習

2.3.サービス
• 確認方法
– 「RSS取得」メニューを押したときに、下記のログ出
力されていることをLogCatで確認する
• RegisterService#onStartCommand
– 開始ログ
– 終了ログ

「onS...
実
習

2.3.サービス
• 実習 1
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-39
実
習

2.3.サービス
• 実習 1[補足]
• 実習のテーマ
– サービスの処理が終了したことをトーストを用いて
トーストは次頁以降に説明あり
知らせる

画面はそのまま
操作可能

サービスロジック

This material is ...
実
習

2.3. サービス
• トーストとは?
– 短時間だけメッセージを画面に表示する機能
– メッセージを表示する機能のみでカーソルを合わせ
て操作することはできない
– サービスなどUIのないコンポーネントで利用すると便
利

This...
実
習

2.3. サービス
• トーストの実装
– 以下の2つのメソッドのうちどちらかを利用する
• public static Toast makeText (Context context, CharSequence text,
int ...
実
習

2.3. サービス
• 実習 1[補足]
– サービスのロジックが終了したところで、好きなメ
ッセージをトーストで表示してみる
– durationを変えて表示時間が変わるか確認する
– 第二引数が違うmakeTextメソッドをいずれ...
実
習

2.3.サービス
• 実習 1 [補足]
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.
...
2.4.ブロードキャストレシーバ
• ブロードキャストレシーバとは?
– ブロードキャストされたインテントに応答する為の
仕組みがブロードキャストレシーバである

– ブロードキャストレシーバクラスを継承して独自の
ブロードキャストレシーバを作...
2.4.ブロードキャストレシーバ
• ブロードキャストレシーバの使用例
– Android端末起動時にメールをチェックする
• ブロードキャストレシーバでAndroid端末起動完了時のブロ
ードキャストインテントを受信する
– どのブロードキャ...
2.4.ブロードキャストレシーバ
• ブロードキャストレシーバを実装する方法
– ブロードキャストレシーバのクラスを新規作成する
– 作成したブロードキャストレシーバを
AndroidManifest.xmlに登録する

This materi...
2.4.ブロードキャストレシーバ
• ブロードキャストレシーバを実装する方法
– ブロードキャストレシーバのクラスを新規作成する
• 基底クラスとなるBroadcastReceiverクラスを継承したクラス
を作成する
• onReceiveメ...
2.4.ブロードキャストレシーバ
– ※ 受け取るインテントによって処理を分岐したい場
合は
Intent#getActionによりアクションを確認することによ
り
どのインテントを受け取っているのかを確認し、分
import android....
2.4.ブロードキャストレシーバ
– 作成したブロードキャストレシーバを
AndroidManifest.xmlに登録する
• 作成手順
i. AndroidManifest.xmlを開き、Applicationタブを選択する
ii. Appl...
2.4.ブロードキャストレシーバ
iv. 追加されたReceiverが選択されていることを確認した上で、
Nameの欄に作成したブロードキャストレシーバの名前を入力
する

Browseボタンをク
リックし、ブラウズ
するのが便利

This ...
2.4.ブロードキャストレシーバ
v.

追加されたReceiverが選択されていることを確認した上で、
「Add」ボタンをクリックする

This material is licensed under the Creative
Commons...
2.4.ブロードキャストレシーバ
vi. 表示された画面から下のラジオボタンが選択されているのを
確認した上で、Intent Filterを選択し「OK」ボタンをクリック
する

This material is licensed under ...
2.4.ブロードキャストレシーバ
vii. 追加されたIntentFilterが選択されていることを確認した上で
、「Add」ボタンをクリックする

This material is licensed under the Creative
Co...
2.4.ブロードキャストレシーバ
viii. 表示された画面から下のラジオボタンが選択されているのを
確認した上で、Actionを選択し「OK」ボタンをクリックする

This material is licensed under the Cr...
2.4.ブロードキャストレシーバ
ix. 追加されたReceiverが選択されていることを確認した上で、
Nameの欄に作成したアクションの名前を入力する

プルダウンより選択可能

This material is licensed unde...
2.4.ブロードキャストレシーバ
※ AndroidManifest.xmlには以下のように追加される
• 下記の例ではandroid.intent.action.BOOT_COMPLETEDのブロー
ドキャストインテントを捕捉し、サービスのク...
実
習

2.4.ブロードキャストレシーバ
• 実習 2
• 実習のテーマ
– システム起動完了時に、RSSの取得メソッドがサービ
スで起動する処理を作成する

システム起動完了

This material is licensed under...
実
習

2.4.ブロードキャストレシーバ
• 実習の手順
1. ブロードキャストレシーバとなる
RegisterServiceStarterクラスを新規作成する
2. RegisterServiceStarterのonReceiveメソッドで...
実
習

2.4.ブロードキャストレシーバ
– 設定情報
• 以下のクラス、メソッドを実装する

対象
ブロード
キャスト
レシー
バー

クラス

メソッド

概要
• 新規作成する
• パッケージは
jp.oesf.mtgeduwg.tra...
実
習

2.4.ブロードキャストレシーバ
– 設定情報 2
• 以下のファイルを編集する
ファイル名

概要

AndroidManifest.xml

• RegisterServiceStarterをレシーバとして登録する
• Inten...
実
習

2.4.ブロードキャストレシーバ
• 確認方法
– 一度アプリケーションを起動した後に、エミュレー
タを一度落とし、再度立ち上げる その際に以下の
ログが出力されているのを確認する
• RegisterService#onStartC...
実
習

2.4.ブロードキャストレシーバ
• 実習 2
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-SA 4....
実
習

2.4.ブロードキャストレシーバ
• 実習 2[補足]
– SendBroadcastプロジェクトのコードを確認し、この
アプリケーションはボタンを押すと、あるアクショ
ンのブロードキャストを投げるものであることを確
認する
– その...
実
習

2.4.ブロードキャストレシーバ
• 実習 2 [補足]
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-...
2.5.コンテントプロバイダ
• コンテントプロバイダとは?
– アプリケーションが保持しているデータ※を他アプ
リケーションからアクセス(検索、追加、更新、削
除)できるようにする仕組み
– 具体的な例
• アプリケーションから通話ログを参照...
2.5.コンテントプロバイダ
• コンテントプロバイダは、安全なアクセスを実
現する為に、インターフェースを取り決めてい
る
– 主なインターフェース
# イベント名

内容

1 検索(query)

データを検索し、
検索結果を返す

イン...
2.5.コンテントプロバイダ
• コンテントプロバイダを実装する方法
– コンテントプロバイダのクラスを新規作成する
– 必要に応じてコンテントプロバイダの抽象メソッド
を実装する
– 作成したコンテントプロバイダをAndroidManifes...
2.5.コンテントプロバイダ
• コンテントプロバイダを実装する方法
– コンテントプロバイダのクラスを新規作成する
• 基底クラスとなるContentProviderクラスを継承したクラスを
作成する
• 以下の6つのメソッドがContent...
2.5.コンテントプロバイダ
・サンプルコード
import android.content.ContentProvider;
import android.content.ContentValues;
import android.datab...
2.5.コンテントプロバイダ
・サンプルコード (続き)
@Override
public boolean onCreate() {
return false;
}

@Override
public Cursor query(Uri uri,...
2.5.コンテントプロバイダ
– 必要に応じてコンテントプロバイダの抽象メソッド
を実装する
• onCreateでは通常SQLiteOpenHelperのオブジェクトを生成し
、インスタンス変数として保持する
コンストラクタの引数に指定するC...
2.5.コンテントプロバイダ
• サンプルコード
・・・
private SampleSqliteOpenHelper sqliteOpenHelper;
private SQLiteDatabase db;
@Override
public ...
2.5.コンテントプロバイダ
– 作成したコンテントプロバイダをAndroidManifest.xml
に登録する
• 作成手順
i.
ii.

AndroidManifest.xmlを開き、Applicationタブを選択する
Applica...
2.5.コンテントプロバイダ
iii. 表示された画面からProviderを選択し「OK」ボタンをクリッ
クす
※ すでに登録されているノードにカーソルがあたっている
場合は、階層を確認されるので、ラジオボタンの上を選択す
る

This ma...
2.5.コンテントプロバイダ
iv. 追加されたProviderが選択されていることを確認した上で、
Nameの欄に作成したコンテントプロバイダのクラスの名前を
入力する

Browseボタンをク
リックし、ブラウズ
するのが便利

This ...
2.5.コンテントプロバイダ
v.

Attribute for Providerを下にスクロールし、Authoritiesタグに一
意となるコンテントプロバイダ名を指定する
通常はパッケージ名と同じにすることが多い

This materia...
2.5.コンテントプロバイダ
– ※ AndroidManifest.xmlには以下のように追加される
• これによりコンテントプロバイダのクラスとして登録された
ことになる
• サンプルコード

・・・
<application ・・・>
・...
2.5.コンテントプロバイダ
– 作成したコンテントプロバイダをContentResolverオブ
ジェクトを用いて利用する
1. コンテントプロバイダにアクセスするためのURIをUriオブジ
ェクトのparseメソッドに渡して、Uriオブジェ...
実
習

2.5.コンテントプロバイダ
• 実習 3
• 実習のテーマ
– RssReaderアプリにコンテントプロバイダを作成し、
外部アプリケーションからRSS_FEEDテーブルの情報
を検索できるようにする

ボタン クリック

This...
実
習

2.5.コンテントプロバイダ
• 実習の手順
1. コンテントプロバイダとなるRssProviderクラスを新
規作成する
2. RssProvider のonCreateメソッドで、
SQLiteOpenHelperオブジェクトを取...
実
習

2.5.コンテントプロバイダ
– 設定情報 1
• 以下のクラス、メソッドを実装する

対象
コンテン
トプロバ
イダ

クラス

メソッド

概要
• 新規作成する
• パッケージは
jp.oesf.mtgeduwg.trainin...
実
習

2.5.コンテントプロバイダ
– 設定情報 2
• 以下のファイルを編集する

ファイル名

AndroidManifest.xml

概要

• RssProviderをコンテントプロバイダとして登録する
• android:aut...
実
習

2.5.コンテントプロバイダ
• 確認方法
– TestContentProviderアプリを立ち上げ、「GET LIST」ボ
タンを押すと、コンテントプロバイダ経由でデータ
ベースより値を取得し、画面に一覧を表示するよう
にする

...
実
習

2.5.コンテントプロバイダ
• 実習 3
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-SA 4.0....
実
習

2.5.コンテントプロバイダ
• 実習 3[補足]
– URIを使って処理を分岐させる
• RssProviderではqueryメソッド内で固定でRSS_FEEDテーブルに
アクセスしているが、アプリケーションによってはアクセス
する...
2.5.コンテントプロバイダ
• UriMatcherクラスを使って処理を分岐させる

– 連結された文字を判定する処理ではUriMatcherクラス
を使用するとよい
– UriMatcherに用意されているaddURIメソッドとmatch
...
実
習

2.5.コンテントプロバイダ
• 実習 3[補足]
• 実習のテーマ
– URIを使って処理を分岐させる
• テーブルをコード内の固定せず、URIで指定するようにする
– RssProviderにUriMatcherを使った分岐処理を...
実
習

2.5.コンテントプロバイダ
• 実習 3 [補足]
• 実習の答え
– 別ドキュメント参照

This material is licensed under the Creative
Commons License BY-NC-SA...
3. 実践的開発

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-90
3章の概要
•
•
•
•

ノーティフィケーション
複数解像度対応
多言語対応
adbツール

This material is licensed under the Creative
Commons License BY-NC-SA 4.0...
3.1.ノーティフィケーション
• ノーティフィケーションとは?
– 画面上端のステータスバーに一定時間情報を表示する機能
– ステータスバーを開いた際には、ノーティフィケーションの一
覧画面が表示され、そちらからアクティビティを起動すること
...
3.1.ノーティフィケーション
• ノーティフィケーションを実装する方法
1.
2.
3.
4.
5.

ノーティフィケーションを扱うためのNotificationManagerクラ
スを取得する
Notificationオブジェクトを生成する...
3.1.ノーティフィケーション
• ノーティフィケーションを実装する方法
1. ノーティフィケーションを扱うためのNotificationManagerクラ
スを取得する
– NotificationManagerはContext#getSys...
3.1.ノーティフィケーション
2. Notificationオブジェクトを生成する
• コンストラクタを呼び出しオブジェクトを生成する
• コンストラクタの引数には アイコンのリソースID,ステータ
スバーに表示するメッセージ、一覧に表示され...
3.1.ノーティフィケーション
3. ノーティフィケーションの一覧からクリックされた
際に起動するペンディングインテントを生成する
• PendingIntentのgetActivityメソッド(staticメソッド)により
PendingIn...
3.1.ノーティフィケーション
4. Notificationオブジェクトにイベント情報を設定する
• Notification#setLatestEventInfoによりイベント情報を設定する
• setLatestEventInfoの引数は...
3.1.ノーティフィケーション
5. ノーティフィケーションを表示する
• NotificationManager#notifyにより、実際にノーティフィケー
ションを表示をする
• notifyの引数は2つあり、id(アプリ内でそのノーティフ...
3.1.ノーティフィケーション
1-5までのサンプルコードを一つにまとめると以下のようになる
import android.app.Notification;
import android.app.NotificationManager;
im...
実
習

3.1.ノーティフィケーション
実習 4
• 実習のテーマ
– サービスでRSS取得ロジックが終了した際に、ノーテ
ィフィケーションを用いて終了した旨を知らせる処
理を作成する
– ノーティフィケーションの一覧画面にて該当のノー
ティ...
実
習

3.1.ノーティフィケーション
実習 4
• 実習の手順
1. RegisterService#onStartCommandのRSS取得ロジックの
後に以下を実装する
i. NotificationManager を取得する
ii. ...
実
習

3.1.ノーティフィケーション
実習 4
– 設定情報 1
• 以下のクラス、メソッドを実装する
対象

クラス

メソッド

RSS取得

RegisterService

onStartCommand

概要
• ノーティフィケー...
実
習

3.1.ノーティフィケーション
実習 4
– 設定情報 2

「RssReader」と表
• 以下のように表示されるようにする
示

R.drawable.icon
の画像を表示

「RSS取得でき
ました」と表
示
「RSS取得完
...
実
習

3.1.ノーティフィケーション
実習 4
• 確認方法
– 「RSS取得」メニューを押す等によりRSS取得を行った
際に、以下のようなノーティフィケーションが表示さ
れる
– ノーティフィケーションの一覧から、該当のノーティ
フィケー...
実
習

3.1.ノーティフィケーション
実習 4
• 実習の答え
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onSta...
実
習

3.1.ノーティフィケーション
実習 4[補足]
• 実習のテーマ
– 一覧画面に遷移した際にnotificationを削除するように
する

• 実習の答え
– 別ドキュメント参照

This material is license...
3.2. 複数解像度対応
• 複数解像度対応
– Androidではバージョン1.6より複数解像度に正式に対応している
– どのAndroid端末にインストールされるかわからない場合は、複
数解像度対応をしなければ、正しく表示されない可能性があ...
3.2. 複数解像度対応
•
•
•
•

Densityとスクリーンサイズ
DIP (Density Independent Pixel)
スケーリング
複数解像度対応Tips

This material is licensed under...
3.2. 複数解像度対応
• Densityとスクリーンサイズ
– AndroidではDensity(密度)とスクリーンサイズにより端末をカテ
ゴライズしている
– DensityはDPI(Dots Per Inch/1インチ当たりのドット数)...
3.2. 複数解像度対応
– スクリーンサイズは以下に分類されている
– 以下の分類により、呼び出すレイアウトファイルの
ディレクトリが分かれることにより、その画面サイ
ズに適したレイアウトファイルを呼び出すことがで
きる
名称

画面のサイズ...
3.2. 複数解像度対応
– 2つの分類をまとめると、以下の表のようになる

This material is licensed under the Creative
参考 http://developer.android.com/intl/j...
3.2.複数解像度対応
• DIP (Density Independent Pixel)
– サイズを直接指定する際に、通常はピクセル(Pixel/px)を使うが、ピク
セルだとDensityにより意図しないUIとなる
– Androidでは...
3.2.複数解像度対応
• スケーリング
– 画像ファイルはDensityによって呼び出すディレクトリが用意されているが
、すべてが用意されていない、res/drawableのみしか用意されていない等の
場合がありうる
– 上記の場合に、Med...
3.2.複数解像度対応
• 複数解像度対応Tips
–
–
–
–

レイアウトのwidthやheightのサイズ指定はwrap_contentやmatch_parent
数値指定が必要な場合はpxではなくdpを用いる
画像ファイルはDensi...
3.2.複数解像度対応
• 複数解像度対応Tips(続き)
– スクリーンサイズの区分のうち対応しないスクリーンを設ける際は、
AndroidManifest.xmlのsupports-screensの設定を記載すればよい

AndroidMa...
実
習

3.2.複数解像度対応
実習 5
• 実習のテーマ
– MultiResolutionプロジェクトのアプリを、スクリーンサイズとDensityの
違うエミュレータでそれぞれ動かし、その画面とソースを確認する

ldpi

mdpi
T...
実
習

3.2.複数解像度対応
実習 5
• 実習の確認ポイント
– Small-Screenではボタンが2段組みとなっていることを
確認
=> res/layout-small/main.xmlが読み込まれている
– R.drawable....
実
習

3.2.複数解像度対応
• 実習の確認ポイント(続き)
– R.drawable.droid_scalingはスケーリングされて、解像
度に合わせてサイズが拡大縮小されて表示されてい
ることを確認
=> res/drawable/dr...
実
習

3.2.複数解像度対応
Small-Screenではボタンが
2段に分かれて表示され
る

R.drawable.droid
Densityごとに別画
像が用意されてい
る

上はpx指定
下はdp,sp指定
上は解像度によりサ
イズ...
実
習

3.2.複数解像度対応
実習 5
• 実習の手順
1. 以下の3つのエミュレータが用意されているので、
それを起動させMultiResolutionプロジェクトのアプ
リを起動し表示された画面とソースを確認する
エミュレータ名

スク...
実
習

3.2.複数解像度対応
実習 5
• 確認方法
– 実習の確認ポイントを確認する

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.
...
3.3. 多言語対応
• 多言語対応
– Androidのアプリケーションは世界各国で使われる可能性がある
ため多言語に対応するべきである
– Androidには文字列をリソースファイルとして記述しておけば、
簡単に多言語対応できる仕組みが用意...
3.3. 多言語対応
例

• English(Australia)の場合はvalues-en-rAU
• Australia以外のEnglishの場合はvaluesen
• 日本語の場合はvalues-ja
• 上記以外の場合はvalues
...
実
習

3.3. 多言語対応
実習6
• 実習のテーマ
– エミュレータの言語設定を変更すると、それに応じ
て呼び出される文字列リソースファイルが変更され
ることを確認する

This material is licensed under t...
実
習

3.3. 多言語対応
実習 6
• 実習の手順
1. res/values-en, res/values-en-rAU, res/values-ja を作成す
る
2. res/values/strings.xml を 作成した3ディ...
実
習

3.3. 多言語対応
実習 6
• 確認方法
– RssReaderをエミュレータで起動する
言語設定を変更するとメニュー画面のボタンの表示テ
キストが変更されることを確認する
言語

表示文字列

値

日本語

go_to_lis...
実
習

3.3. 多言語対応
実習 6
• 言語設定方法
i. ホーム画面で「menu」ボタン => 「Settings」を押す
ii. Settings画面にて「Language & keyboard」 を押す

This material...
実
習

3.3. 多言語対応
iii. Language & keyboard settings画面で「Select language」
を押す
iv. Locale画面にて対象の言語を押す

This material is license...
実
習

3.3. 多言語対応
実習 6
• 実習の答え (該当部のみ)
– res/values/strings.xml

<string name=“go_to_list_page_button_label”>一覧表示(デフォルト)</st...
3.4.adbツール
• adbツールとは?
– SDKに付属しているデバイスやエミュレータの状態を管理するツ
ール
– コマンドプロンプトにて、コマンドを打ち利用する
– <SDK_ROOT>/platform-toolsにPathを通してい...
実
習

3.4.adbツール
実習 7
• 実習のテーマ
– 説明に合わせて載っている操作を実際に行い、adbツ
ールの使い方を学ぶ

1. adb -help
adbツールのヘルプが表示される
C:¥>adb -help
Android D...
実
習

3.4.adbツール
実習 7
2. adb devices
実行中のエミュレータと実機の一覧を表示する
C:¥>adb devices
List of devices attached
emulator-5554 device

3...
実
習

3.4.adbツール
実習 7
5. adb logcat
ログを出力する (終了:Ctrl + C)
C:¥>adb logcat
D/dalvikvm( 149): GC_EXTERNAL_ALLOC freed 135K, 50...
実
習

3.4.adbツール
実習 7 (ここからシェルでの操作)
8. cd <ディレクトリパス>
カレントディレクトリの移動する
# cd /data/data/jp.oesf.mtgeduwg.training.rssreader
cd...
実
習

3.4.adbツール
実習7 (ここからsqlite3コマンド)
11.sqlite3 <データベースファイルのパス>
カレントディレクトリの移動する

12. .help
ヘルプを表示する

13..dump
ダンプファイルを表示す...
実
習

3.4.adbツール
実習 7
11..schema
CREATE文を表示する

12. <SQL文>;
SQL文を発行する

13..exit
sqlite3コマンドを抜ける
This material is licensed un...
3.5.JUnit
• JUnitとは
– Javaプログラムのユニットテスト(単体テスト)を行うためのテ
スティングフレームワーク
– 作成したプログラムが、意図した挙動をするのか確認するテス
トコードを作成し、それを実行することにより検証を...
3.5.JUnit
• Android用に拡張されたJUnitとは
– AndroidではJUnit3を元にして、Android用にカスタマイズされ提
供されている
– ユーザーの画面操作やライフサイクルのイベント(onCreate等)を
発行...
3.5.JUnit
• JUnit 基底クラスの構造
– JUnitのテストクラスはjunit.framework.TestCaseクラス
を基底クラスとして、拡張したクラスとする必要が
ある
– Androidでは上記TestCaseクラスを...
3.5.JUnit
– TestCaseクラスとAndroidが提供しているテスト用クラ
スの関係
junit.framework.TestCase
InstrumentationTestCase
ActvitivtTestCase
Activ...
3.5.JUnit
– 各基底クラスの概要
• ActivityInstrumentationTestCase2
– ボタンを押す等の画面の操作が可能

• ActivityUnitTestCase
– アクティビティのライフサイクル上のイベン...
3.5.JUnit
• JUnit実コード例
– まずはAndroidと関係なく、一般的なJUnitのコード
• テスト対象のコード 引数2つを足し算をして返すメソッド
public class Foo {
public int add(int...
3.5.JUnit
• テストコード
import junit.framework.TestCase;
public class FooTest extends TestCase {

・・・1

private Foo foo = null;...
3.5.JUnit
1.
2.

3.

4.
5.

junit.framework.TestCaseを継承し、クラスを作成する
クラス名は「テスト対象のクラス名」 + “Test”とすることが通例
setUpメソッドは、テストが開始される前...
3.5.JUnit
• ActivityInstrumentationTestCase2の例

テスト対象
のActivity

public class FooActivityTest
extends ActivityInstrumentat...
3.5.JUnit
• ActivityInstrumentationTestCase2の例
package jp.oesf.mtgeduwg.training.test;

テスト対象
のActivity

public class AddA...
3.5.JUnit
• ActivityInstrumentationTestCase2の例 (画面遷移)
public void testAddButtonClick() {
遷移先Activityをモニターする
ActivityMonito...
3.5.JUnit
• ActivityUnitTestCaseの例
package jp.oesf.mtgeduwg.training.test;

テスト対象
のActivity

public class AddActivityUnitT...
3.5.JUnit
• ServiceTestCaseの例
package jp.oesf.mtgeduwg.training.test;

テスト対象
のService

public class AddServiceTest extends...
3.5.JUnit
• メモ

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-150
3.5.JUnit
• JUnitプロジェクトの作り方
1. Eclipseのメニュー[File]から[New]->[Other]を選択する

This material is licensed under the Creative
Commo...
3.5.JUnit
2. Androidフォルダ内の「Android Test Project」を選択
し、「Next」ボタンを押す
3. Project Nameの欄にテストプロジェクト名を指定し
て「Next」ボタンを押す

This ma...
3.5.JUnit
4. TestTargetのプロジェクトを選択して「Finish」ボタ
ンをクリックする

This material is licensed under the Creative
Commons License BY-NC...
3.5.JUnit
5. 次にTestCaseを作成する。4.で作成したテストプロジ
ェクトを選択した状態で、 [File]から[New]->[Other]
を選択する
6. Javaフォルダ->JUnitフォルダ内の「JUnit Test C...
3.5.JUnit
7. New JUnit 3 のボタンが選ばれていることを確認し、
Nameにクラス名、Superclassに親クラスを入力、
Class under testにはTestTargetのクラス名を指定して
「Finish」ボ...
3.5.JUnit
• AndroidManifest.xml
– Eclipseを用いてテストプロジェクトを作成すると、自動で以下
の太字2か所が追加される (テスト実行のためには必須)
<?xml version="1.0" encodin...
3.5.JUnit
– テストの実行方法
•

テストプロジェクトを右クリック Run as -> Android JUnit
Test を選択する
エミュレータ or 実機を接続している必要がある

This material is lice...
3.5.JUnit
– テストの成功/失敗の確認
•

JUnitビューにて確認可能
失敗

成功

This material is licensed under the Creative
Commons License BY-NC-SA 4...
実
習

3.5.JUnit
実習 8
• 実習のテーマ
– JUnitのテストケースを実際に作成する
– 2つのテストケースを作成する
– 上記を通して、Androidでの単体テストの方法を習得
する

This material is li...
実
習

3.5.JUnit
実習 8
• 実習の手順
1. RssReaderをテスト対象とするRssReaderTestプロジェ
クトを作成する
2. RssReaderActivity と RegisterService をテストするクラ...
実
習

3.5.JUnit
実習 8
• 確認方法
– テストを実行し、グリーンになる

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

...
実
習

3.5.JUnit
実習 8
• 実習の答え
– RssReaderActivityTest.java

package jp.oesf.mtgeduwg.training.rssreader.test;

import jp.oes...
実
習

3.5.JUnit
– RssReaderActivityTest.java (続き)

public void testOnClickListButton(){
ActivityMonitor monitor = new
Activ...
実
習

3.5.JUnit
– RegisterServiceTest.java

package jp.oesf.mtgeduwg.training.rssreader.test;
import jp.oesf.mtgeduwg.train...
実
習

3.5.JUnit
– RegisterServiceTest.java (続き)

private int countDb() {
int result = 0;
Cursor cursor = null;
DatabaseOpen...
実
習

3.5.JUnit
• 実習 8[補足]
• 実習のテーマ
– 他のメソッドもテストする

This material is licensed under the Creative
Commons License BY-NC-SA 4...
4. 実践的開発2

This material is licensed under the Creative
Commons License BY-NC-SA 4.0.

Ⅰ-167
4章の概要
• アクティビティとタスク
– タスク
– アフィニティ
– 起動モード

• タスクの管理

This material is licensed under the Creative
Commons License BY-NC-S...
4.1.アクティビティとタスク
• アプリケーションのタスク
– Androidのタスクとはアクティビティを管理する仕組みである
– タスクとは、アクティビティをスタック構造で管理している
– 違うアプリケーションのアクティビティを起動した際も...
4.1.アクティビティとタスク
• アフィニティ
– 直訳すると 親和性
– アプリケーション内のすべてのアクティビティは、デフォルト
ではすべて同一タスクになるような親和性(アフィニティ)が
ある
– 通常は同じアプリケーションのアクティビテ...
4.1.アクティビティとタスク
• アフィニティの設定と挙動
– アフィニティの値はAndroidManifest.xmlに登録可能である
– アフィニティを設定してもデフォルトの振る舞いでは、各アク
ティビティは同一のタスクとなる
– 別タス...
4.1.アクティビティとタスク
• インテントのフラグ
– インテントのフラグはandroid.content.Intentに用意されている
– Intent#setFlagsにフラグの値を渡せばよい
– 別タスクで起動する場合は、startA...
4.1.アクティビティとタスク
– FLAG_ACTIVITY_NEW_TASK

C:foo
X:foo

A:foo
タス
ク:foo

B

B:bar
タス
A:xxx
ク:bar
タス
ク:foo

X

Y:bar

X:foo

...
4.1.アクティビティとタスク
– FLAG_ACTIVITY_NEW_TASK

C:bar
A:foo
タス
ク:foo

B

B:bar
タス
A:xxx
ク:bar
タス
ク:foo

C

C:bar

B:bar
タス
A:xxx...
4.1.アクティビティとタスク
– FLAG_ACTIVITY_MULTIPLE_TASK

A:foo
タス
ク:foo

B

B:bar
タス
A:xxx
ク:bar
タス
ク:foo

C

C:bar
タス
ク:bar
B:bar
タ...
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Android アプリケーション開発応用
Upcoming SlideShare
Loading in …5
×

Android アプリケーション開発応用

3,615 views

Published on

OESF公認
Androidアプリケーション開発応用
公式トレーニングテキスト(日本語)

Contributed by:
【作成】株式会社トップゲート
【改訂】株式会社リーディング・エッジ社
    株式会社カサレアル

【ご注意】
本テキストは、Creative Commons License BY-NC-SA 4.0のもとで提供されます。OESF会員またはコンソーシアムメンバーでない場合、本編の改変の有無にかかわらず、いかなる形態でも商用目的での利用は禁止されています。

Published in: Technology
  • Be the first to comment

Android アプリケーション開発応用

  1. 1. Androidアプリケーション開発 応用トレーニング This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-1
  2. 2. トレーニングの目的 • Androidのアプリケーション開発における実践的 な知識、技術を身につける – Androidのコンポーネント – 実践的開発 • 演習を通して、アプリケーション開発の実践力 を養う – 開発力に主眼 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-2
  3. 3. トレーニングスケジュール • 1日目 1章 はじめに 2章 Androidコンポーネント 3章 実践的開発 • 2日目 4章 実践的開発2 5章 外部連帯 6章 実践的デバッグ ※ 一部参考資料とし、講義では取り上げない場合があります 。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-3
  4. 4. 受講するに当たって必要なスキル • OESF公認Androidアプリケーション開発入門コー スを 受講済または、下記に示すスキルを有す ること – Androidアプリケーションの基礎的なスキルを前提と する – 複数画面からなる簡単なアプリケーションの作成が できる – JavaSEの文法に関しては一通り理解し、実経験を有し ている – Eclipseの基本的な操作を理解している This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-4
  5. 5. 1. はじめに This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-5
  6. 6. 1章の概要 • 開発環境 • 演習で用いるアプリケーション • 演習概要 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-6
  7. 7. 1.1. 開発環境 • 本トレーニングでは下記の開発ツールを用いる • インストールはすでに終了している • SDK付属のToolsにパスが通っている ソフトウェア バージョン Eclipse Eclipse IDE with built-in ADT Java SDK JDK 6 Update 23 Android SDK platform 2.3.3 Android Plug-in Android Development Tools (ADT) Ver.21 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-7
  8. 8. 1.1. 開発環境 – Eclipseワークスペース • C:android_training_appliedworkspace を指定のこと – エミュレータ • 演習で使用するエミュレータの作成方法は別ドキュメント参 照 • 6章実践的デバッグではエミュレータの設定に依存するため 、必ず指定した方法で作成すること – SDKパス • C:android_training_appliedadt-bundle-windows-x86-[日付]sdk となっている – 解答ドキュメント • 実習解答の一部は別ドキュメントとして提供しています。 • 場所: C:android_training_appliedanswer_docs_appliedhtml This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-8
  9. 9. 1.2.演習で用いるアプリケーション • 初日の演習では、OESF公認Androidアプリケーシ ョン開発入門コース で作成したRSSリーダーに 拡張を加える • 2日目の演習では、各単元ごと、それぞれの挙動 を確認できるアプリケーションを作成する ※一部の実習には時間に余裕のある人向け用に補足実習 を用意しています This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-9
  10. 10. 1.2.演習で用いるアプリケーション • RSSリーダーの画面と機能概要 – 3画面で構成されている ・・・ 画面遷移の方向 RSSリーダー 起動 ① メニュー 画面 ② 一覧画 面 ③ 詳細画 面 # 画面名 機能概要 1 メニュー画面 • 一覧画面を起動する • オプションメニューを表示する • オプションメニューがクリックされた時に、インターネットからRSSフィー ドを取得してデータベースに登録する • RSSフィード取得後、完了メッセージをダイアログで表示する 2 一覧画面 • データベースに登録されているRSSフィードを一覧形式で表示する 3 詳細画面 • 一覧画面で選択されたRSSフィードのタイトル、配信日時、配信元名、詳細 内容を表示する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-10
  11. 11. 1.3.演習概要 サービスでの 取得処理 ブロードキャストレ シーバでの処理開始 コンテントプロバイ ダでのアクセス インターネットから RSSフィードを取得す る メニュー 画面 データベースに RSSフィードを登 録 データベース データベースから RSSフィードを検索 データベースへ登 録が完了した後、 ダイアログを表示 する 取得終了のノーティ フィケーションでの 表示 インター ネット 一覧画面 一覧表示ボタンをク リックする 複数解像度 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 一覧データ を 選択する 詳細画面 多言語対応 Ⅰ-11
  12. 12. 1.3.演習概要 • テーブルレイアウト – RSS_FEED テーブル 列名 型 備考 _id INTEGER GUID TEXT • RSSフィードに割り当てられる識別子 TITLE TEXT • タイトル PUBLISH_DATE TEXT • 配信日時 DESCRIPTION TEXT • 詳細内容 LINK TEXT • リンク SENDER_NAME TEXT • 配信元の名前 • プライマリキー • オートインクリメント This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-12
  13. 13. 2. Androidコンポーネント This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-13
  14. 14. 2章の概要 • • • • • アクティビティ インテント サービス ブロードキャストレシーバ コンテントプロバイダ – ※ アクティビティとインテントは確認のみとなりま すそれ以外は講義の後に、実習を行います This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-14
  15. 15. 2.1.アクティビティ • アクティビティとは? – Androidアプリケーションの画面は、アクティビティ の上にボタン、チェックボックス等の部品を配置し 、画面を作成する – 1画面は1つのアクティビティで構成する – アクティビティは実行中、一時停止といった状態を 持っている This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-15
  16. 16. 2.1.アクティビティ • サンプルコード package jp.oesf.mtgeduwg.training.rssreader; import android.app.Activity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; public class RssReaderActivity extends Activity implements OnClickListener { public void onClick(View view) { Log.v("RssReaderActivity","Clicked"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); View listButton = findViewById(R.id.list_button); listButton.setOnClickListener(this); } } •Activityクラスをスーパークラスとしている •必要に応じてコールバックメソッドを実装している This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-16
  17. 17. 2.1.アクティビティ • AndroidManifest.xml のサンプルコード <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.oesf.mtgeduwg.training.rssreader" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> ・・・ <activity android:label="@string/app_name" android:name="RssListActivity"></activity> </application> <uses-sdk android:minSdkVersion=“7" /> <uses-permission android:name="android.permission.INTERNET"></uses-permission> </manifest> •タグ名がactivityのタグを作成する •android:name=“アクティビティ名”の属性を指定する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-17
  18. 18. 2.1.アクティビティ • [参考]通知されるイベントを含むライフサイクル Activity起動 onCreate() ・ "戻る"で元画面に復帰 onStart() フ ア ォ グラ ウンド プ ロセス破棄 onRestart() onResume() 実行中 ・ 他Activityの割込み ・ 端末スリ ープ ・ 長時間無操作状態が続いた onPause() ・ 他アプリ ケーショ ンから メ を モリ 要求さ れる 一時停止 ・ Activityがフ アグラ ォ ウンド ビジブル ・ 他Activityの割込み ・ 長時間無操作状態が続いた に表示( 戻るボタ ン等) onStop() ・ 他アプリ ケーショ ンから メ を モリ 要求さ れる 終了 ・ Activityがフ アグラ ォ ウンド に表示( 戻るボタ ン等) バッ ク グラ ウンド 状態遷移方向 onDestroy() 状態 This material is Activity破棄 under the Creative licensed Commons License BY-NC-SA 4.0. Activityのイ ベント Ⅰ-18
  19. 19. 2.1.アクティビティ – [参考] AndroidManifest.xml の設定はリソースエディタ でも可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-19
  20. 20. 2.2.インテント • インテントとは? – コンポーネント間で、処理の依頼や、メッセージを やりとりする為の仕組み • インテントを利用できるコンポーネントは、アクティビティ 、ブロードキャストレシーバ、サービス – インテントを利用する具体例 • アクティビティAからアクティビティBを起動する(画面遷移 ) • アドレス帳アプリケーションから電話をかけるアプリケーシ ョンへ電話発信を依頼する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-20
  21. 21. 2.2.インテント • インテントにより、コンポーネントを呼び出す には、インテントに、呼び出し先のコンポーネ ントの情報を含めて、Androidに呼び出しを依頼 する イ ンテント オブジェ クト を作成し 送信メ て、 ソッ を実行する ド "B"が起動する – コンポーネントAからコンポーネントBを呼び出す例 インテント • "B"を呼び出す イ ンテント イ ンテント Android This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-21
  22. 22. 2.2.インテント • サンプルコード package jp.oesf.mtgeduwg.training.rssreader; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class RssReaderActivity extends Activity implements OnClickListener { ・・・・・・・・ public void onClick(View view) { if (R.id.list_button == view.getId()) { Intent intent = new Intent(this, RssListActivity.class); startActivity(intent); } } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-22
  23. 23. 2.3.サービス • サービスとは? – UIを持たないバックグラウンドで処理を行うコンポー ネント – サービスは画面とは独立して実行される。このため 、アクティビティが非表示になっても処理を続ける 音楽を再生(サービス未使用) 音楽を再生(サービス使用) ことができる 割込み 割込み メ ール受信により メ ール受信により 中断 中断 アクティ ビティ アクティ ビティ サービス開始 再生開始 サービス 音楽再生 中断に関係なく 処理を 完了 再生開始 アクティビティから直接音楽再生した場合と、サービ ス経由で音楽再生した場合で、メール受信によるアク ティビティの割込みが発生した時の動作の違い 音楽再生 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-23
  24. 24. 2.3.サービス • サービスを実装する方法 – サービスを新規作成する – 作成したサービスをAndroidManifest.xmlに登録する – 作成したサービスをstartServiceメソッドにて起動する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-24
  25. 25. 2.3.サービス • サービスを実装する方法 – サービスのクラスを新規作成する • 基底クラスとなるServiceクラスを継承したクラスを作成する • onBindメソッドは抽象メソッドのため実装する必要がある。 – ここではバインドを用いないためnullを返すようにしておく。 import android.app.Service; • サンプルコード import android.content.Intent; import android.os.IBinder; public class SampleService extends Service { @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. ・・・1 Ⅰ-25
  26. 26. 2.3.サービス – 必要に応じてコールバックメソ ッドを実装する • onCreate, onStartCommand,onDestroy の3つのメソッドがある • ライフサイクルを意識し、適切に実 装をする • onStartCommandは起動される度に 呼び出される • 他の2つのイベントはオブジェクト の生成と破棄の際に1回だけ呼び出 イベント名 される 内容 Service起動 onCreate() onStartCommand() 実行中 ・停止命令 onDestroy() onCreate onStartCommand サービスが起動される前に発生する イベント onDestroy サービスが破棄される前に発生する イベント This material is licensed under the Creative Commons License BY-NC-SA 4.0. 状態遷移方向 最初の起動時に発生するイベント 状態 Activityのイベン ト Service破棄 Ⅰ-26
  27. 27. 2.3.サービス • onStartCommandメソッドの戻り値として以下の 4つの定数が用意されている 説明 • 戻り値 これらの戻り値のうちどれを選ぶかによって、 サービスを起動するペンディングインテントが存在しない限りサービスは再 START_NOT_STICKY 起動 サービス強制終了時の振る舞いを制御すること されない。強制終了によりサービスが終了した場合、勝手な再起動を防ぐ場 合 が可能となっている。 に使用する START_STICKY システムはサービスを新たにインスタンス化し、サービスの再起動を行う。 サービスを起動するペンディングインテントが存在しない場合、システムは Intent をnullにしてonStartCommandを呼び出す。 startServiceによりサービスを複数回起動していたとしても再起動は1度しか 行わ れない。 START_REDELIVER_INTENT システムはサービスを新たにインスタンス化し、サービスの再起動を行う。 再起動時のonStartCommandには強制終了前と同じ内容のIntentが渡される。 再起動手順が強制終了前の起動手順と同じ。(A=>Bで起動した場合、A=>Bで 再起動) startServiceによりサービスを複数回起動していた場合は、起動した 回数分onStartCommandが呼ばれる PendingIntent・・・タイミングを指定して発行することができるIntent。システムで管理されて システムに再起動される保証がない。START_STICKYとの互換性のために START_STICKY_COMPATIBILITY This material is licensed under the Creative いる。 Ⅰ-27 用意 Commons License BY-NC-SA 4.0. されている。このモードが指定された場合、onStartCommandの引数Intentに
  28. 28. 2.3.サービス • サンプルコード @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId){ Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 5; i++) { Log.v(getClass().getSimpleName(), "i:" + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); return START_STICKY; } @Override public void onDestroy() { Toast.makeText(this, "Service end", Toast.LENGTH_SHORT).show(); This material is licensed under the Creative } Commons License BY-NC-SA 4.0. Ⅰ-28
  29. 29. 2.3.サービス – 作成したサービスをAndroidManifest.xmlに登録する • 作成手順 i. ii. AndroidManifest.xmlを開き、Applicationタブを選択する Application Nodesの「Add」ボタンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-29
  30. 30. 2.3.サービス iii. 表示された画面からServiceを選択し「OK」ボタンをクリッ クする ※すでに登録されているノードにカーソルがあたっている場合は 、階層を確認されるので、ラジオボタンの上を選択する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-30
  31. 31. 2.3.サービス iv. 追加されたServiceが選択されていることを確認した上で、 Nameの欄に作成したサービスのクラスの名前を入力する Browseボタンをク リックし、ブラウズ するのが便利 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-31
  32. 32. 2.3.サービス – AndroidManifest.xmlには以下のように追加される • これによりサービスのクラスとして登録されたことになる ・・・ <application ・・・> ・・・ <service android:name=“SampleService"></service> ・・・ </application> ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-32
  33. 33. 2.3.サービス – 作成したサービスをstartServiceメソッドにて起動する • Intentの引数に、呼出元のオブジェクト、呼出先のサービス のクラス情報を与えて生成する • Context#startServiceを実行する。メソッドの引数には1.で作 成したIntentオブジェクトを与える • Intent intent = new Intent(this, SampleService.class); サンプルコード (アクティビティのコードより抜粋) ・・・ⅰ startService(intent); This material is licensed under the Creative Commons License BY-NC-SA 4.0. ・・・ⅱ Ⅰ-33
  34. 34. 実 習 2.3.サービス • 実習 1 • 実習のテーマ – メニュー画面にて「menu」ボタン => 「RSS取得」メ ニューを押したときに、RSSの取得メソッドがサービ スで起動する処理を作成する 画面はそのまま 操作可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. サービスとして起動 画面への影響はなし Ⅰ-34
  35. 35. 実 習 2.3.サービス – 実習の手順 1. サービスとなるRegisterServiceクラスを新規作成する 2. RegisterServiceのonStartCommandメソッドで、RSSを取得す る 3. RegisterService#onStartCommandに開始と終了のログを出力 する – タグ:「 RegisterService 」 – メッセージ:開始時「onStartCommand start」 及び終了時 「 onStartCommand end」 4. RegistarService#onStartCommandの戻り値に「START_STICKY」 を指定する 5. RssReaderActivityのonOptionsItemSelectedメソッドにある既 存のRSS取得のロジックを削除し、 RegisterServiceをIntentを 用いて呼び出す 6. RssReaderActivity#onOptionsItemSelectedに開始と終了のログ This material is licensed under the Creative Ⅰ-35 を出力する Commons License BY-NC-SA 4.0.
  36. 36. 実 習 2.3.サービス – 設定情報 1 • 以下のクラス、メソッドを実装する 対象 サービス クラス メソッド • 新規作成する • パッケージは jp.oesf.mtgeduwg.training.rssreader とする RegisterService onStartCommand メニュー画面 概要 RssReaderActivity onOptionsItemSelected • RSS取得する • 開始と終了のログの出力する • 既存のRSS取得ロジックの削除する • RegisterServiceを起動する • 開始と終了のログの出力する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-36
  37. 37. 実 習 2.3.サービス – 設定情報 2 • 以下のファイルを編集する ファイル名 AndroidManifest.xml 概要 • RegisterServiceをサービスとして登録する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-37
  38. 38. 実 習 2.3.サービス • 確認方法 – 「RSS取得」メニューを押したときに、下記のログ出 力されていることをLogCatで確認する • RegisterService#onStartCommand – 開始ログ – 終了ログ 「onStartCommand start 」 「onStartCommand end」 • RssReaderActivity#onOptionsItemSelected – 開始ログ – 終了ログ 「onOptionsItemSelected start 」 「 onOptionsItemSelected end」 – RssReaderActivity#onOptionsItemSelectedのクローズロ グがRegisterService#onStartCommandのクローズログよ り先に出力されていることを確認する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-38
  39. 39. 実 習 2.3.サービス • 実習 1 • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-39
  40. 40. 実 習 2.3.サービス • 実習 1[補足] • 実習のテーマ – サービスの処理が終了したことをトーストを用いて トーストは次頁以降に説明あり 知らせる 画面はそのまま 操作可能 サービスロジック This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-40
  41. 41. 実 習 2.3. サービス • トーストとは? – 短時間だけメッセージを画面に表示する機能 – メッセージを表示する機能のみでカーソルを合わせ て操作することはできない – サービスなどUIのないコンポーネントで利用すると便 利 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-41
  42. 42. 実 習 2.3. サービス • トーストの実装 – 以下の2つのメソッドのうちどちらかを利用する • public static Toast makeText (Context context, CharSequence text, int duration) • public static Toast makeText (Context context, int resId, int duration – context: コンテキスト – text or resId: » 表示させるテキスト or 表示させるテキストのリソースID – duration: » Toast.LENGTH_SHORT (短時間) » Toast.LENGTH_LONG(長時間) – 上記2メソッドの戻り値に対してToast#showメソッド Toast.makeText(this, “TEST", Toast.LENGTH_SHORT).show(); を実行すると表示される Toast.makeText(this, R.string.test, Toast.LENGTH_LONG).show(); This material is licensed under the Creative Ⅰ-42 サンプルコード Commons License BY-NC-SA 4.0.
  43. 43. 実 習 2.3. サービス • 実習 1[補足] – サービスのロジックが終了したところで、好きなメ ッセージをトーストで表示してみる – durationを変えて表示時間が変わるか確認する – 第二引数が違うmakeTextメソッドをいずれも利用して みる This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-43
  44. 44. 実 習 2.3.サービス • 実習 1 [補足] • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-44
  45. 45. 2.4.ブロードキャストレシーバ • ブロードキャストレシーバとは? – ブロードキャストされたインテントに応答する為の 仕組みがブロードキャストレシーバである – ブロードキャストレシーバクラスを継承して独自の ブロードキャストレシーバを作ることができる This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-45
  46. 46. 2.4.ブロードキャストレシーバ • ブロードキャストレシーバの使用例 – Android端末起動時にメールをチェックする • ブロードキャストレシーバでAndroid端末起動完了時のブロ ードキャストインテントを受信する – どのブロードキャストインテントを受信するかは AndroidManifest.xmlにIntentFilterとして設定を記載する • ブロードキャストレシーバからメールチェックサービスを呼 び出す – ブロードキャストレシーバから直接メールチェック処理を実行 ② メールチェック メールチェッ する事も可能だが、時間のかかる処理の場合はサービスを使用 クサービス サービス実行 する方が効率が良い ① 起動完了メッセージ インテン ト ブロードキャス ト レシーバ インテン ト ブロードキャストインテント送 信 This material is licensed under the Creative インテント送信 Ⅰ-46 Commons License BY-NC-SA 4.0.
  47. 47. 2.4.ブロードキャストレシーバ • ブロードキャストレシーバを実装する方法 – ブロードキャストレシーバのクラスを新規作成する – 作成したブロードキャストレシーバを AndroidManifest.xmlに登録する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-47
  48. 48. 2.4.ブロードキャストレシーバ • ブロードキャストレシーバを実装する方法 – ブロードキャストレシーバのクラスを新規作成する • 基底クラスとなるBroadcastReceiverクラスを継承したクラス を作成する • onReceiveメソッドは抽象メソッドのため実装する必要がある • onReceiveメソッドには実際に行いたい処理を実装する import android.content.BroadcastReceiver; • サンプルコード import android.content.Context; import android.content.Intent; ・・・1 public class SampleServiceStarter extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context, SampleService.class); context.startService(serviceIntent); } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-48
  49. 49. 2.4.ブロードキャストレシーバ – ※ 受け取るインテントによって処理を分岐したい場 合は Intent#getActionによりアクションを確認することによ り どのインテントを受け取っているのかを確認し、分 import android.content.BroadcastReceiver; 岐処理を記載する import android.content.Context; import android.content.Intent; public class SampleServiceStarter extends BroadcastReceiver { • サンプルコード @Override ・・・※ public void onReceive(Context context, Intent intent) { if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){ Intent serviceIntent = new Intent(context, SampleService.class); context.startService(serviceIntent); } } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-49
  50. 50. 2.4.ブロードキャストレシーバ – 作成したブロードキャストレシーバを AndroidManifest.xmlに登録する • 作成手順 i. AndroidManifest.xmlを開き、Applicationタブを選択する ii. Application Nodesの「Add」ボタンをクリックする iii. 表示された画面からReceiverを選択し「OK」ボタンをクリッ クする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-50
  51. 51. 2.4.ブロードキャストレシーバ iv. 追加されたReceiverが選択されていることを確認した上で、 Nameの欄に作成したブロードキャストレシーバの名前を入力 する Browseボタンをク リックし、ブラウズ するのが便利 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-51
  52. 52. 2.4.ブロードキャストレシーバ v. 追加されたReceiverが選択されていることを確認した上で、 「Add」ボタンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-52
  53. 53. 2.4.ブロードキャストレシーバ vi. 表示された画面から下のラジオボタンが選択されているのを 確認した上で、Intent Filterを選択し「OK」ボタンをクリック する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-53
  54. 54. 2.4.ブロードキャストレシーバ vii. 追加されたIntentFilterが選択されていることを確認した上で 、「Add」ボタンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-54
  55. 55. 2.4.ブロードキャストレシーバ viii. 表示された画面から下のラジオボタンが選択されているのを 確認した上で、Actionを選択し「OK」ボタンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-55
  56. 56. 2.4.ブロードキャストレシーバ ix. 追加されたReceiverが選択されていることを確認した上で、 Nameの欄に作成したアクションの名前を入力する プルダウンより選択可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-56
  57. 57. 2.4.ブロードキャストレシーバ ※ AndroidManifest.xmlには以下のように追加される • 下記の例ではandroid.intent.action.BOOT_COMPLETEDのブロー ドキャストインテントを捕捉し、サービスのクラスである SampleServiceStartを起動する • サンプルコード ・・・ <application ・・・> ・・・ <receiver android:name=“SampleServiceStarter"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> </intent-filter> </receiver> ・・・ </application> ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-57
  58. 58. 実 習 2.4.ブロードキャストレシーバ • 実習 2 • 実習のテーマ – システム起動完了時に、RSSの取得メソッドがサービ スで起動する処理を作成する システム起動完了 This material is licensed under the Creative Commons License BY-NC-SA 4.0. サービスとして起動 画面への影響はなし Ⅰ-58
  59. 59. 実 習 2.4.ブロードキャストレシーバ • 実習の手順 1. ブロードキャストレシーバとなる RegisterServiceStarterクラスを新規作成する 2. RegisterServiceStarterのonReceiveメソッドで、 RegisterServiceを呼び出す 3. RegisterServiceStarterの設定をAndroidManifest.xmlに 追加する • RegisterServiceStarterをブロードキャストレシーバとして登録 する • RegisterServiceStarterのIntent Filterの設定として、Actionに android.intent.action.BOOT_COMPLETED(起動完了)を設定す る This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-59
  60. 60. 実 習 2.4.ブロードキャストレシーバ – 設定情報 • 以下のクラス、メソッドを実装する 対象 ブロード キャスト レシー バー クラス メソッド 概要 • 新規作成する • パッケージは jp.oesf.mtgeduwg.training.rssreader とする RegisterServiceStarter onReceive • RegisterServiceを起動する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-60
  61. 61. 実 習 2.4.ブロードキャストレシーバ – 設定情報 2 • 以下のファイルを編集する ファイル名 概要 AndroidManifest.xml • RegisterServiceStarterをレシーバとして登録する • Intent Filterの設定として、Actionに android.intent.action.BOOT_COMPLETED(起動完了)を設定す る ※API Lv 14以上の端末で動作確認する場合は以下の値を設定する 必要があります(エミュレータの場合は不要) <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-61
  62. 62. 実 習 2.4.ブロードキャストレシーバ • 確認方法 – 一度アプリケーションを起動した後に、エミュレー タを一度落とし、再度立ち上げる その際に以下の ログが出力されているのを確認する • RegisterService#onStartCommand – 開始ログ – 終了ログ 「onStartCommand start 」 「onStartCommand end」 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-62
  63. 63. 実 習 2.4.ブロードキャストレシーバ • 実習 2 • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-63
  64. 64. 実 習 2.4.ブロードキャストレシーバ • 実習 2[補足] – SendBroadcastプロジェクトのコードを確認し、この アプリケーションはボタンを押すと、あるアクショ ンのブロードキャストを投げるものであることを確 認する – そのアクションに対してRegisterServiceStarterが起動 するようにRssReaderプロジェクトのファイルを修正 する • アクションに対応する処理 – Toastを表示させるようにする • 確認 – RssReader起動後、SendBroadcastを起動させボタンを 押すと、RegisterServiceStarterでToastを表示されるの This material is licensed under the Creative Ⅰ-64 Commons License BY-NC-SA 4.0. を確認する
  65. 65. 実 習 2.4.ブロードキャストレシーバ • 実習 2 [補足] • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-65
  66. 66. 2.5.コンテントプロバイダ • コンテントプロバイダとは? – アプリケーションが保持しているデータ※を他アプ リケーションからアクセス(検索、追加、更新、削 除)できるようにする仕組み – 具体的な例 • アプリケーションから通話ログを参照する • アプリケーションからブラウザのブックマークにWebサイト を追加する • アプリケーションから連絡帳を参照する • アプリケーションからカレンダーを参照する • データとはアプリケーションが、ファイル、データベースに 永続化している情報を示す This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-66
  67. 67. 2.5.コンテントプロバイダ • コンテントプロバイダは、安全なアクセスを実 現する為に、インターフェースを取り決めてい る – 主なインターフェース # イベント名 内容 1 検索(query) データを検索し、 検索結果を返す インターフェー スが決まってい る コンテント プロバイダ query 2 追加(insert) データを追加す る insert 3 更新 (update) データを更新す る update 4 削除 (delete) データを削除す る 外部アプリ ケーション delete ■詳細はAndroid Developersの開発ガイドを参照 http://developer.android.com/intl/ja/reference/android/content/ContentProvider.html This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-67
  68. 68. 2.5.コンテントプロバイダ • コンテントプロバイダを実装する方法 – コンテントプロバイダのクラスを新規作成する – 必要に応じてコンテントプロバイダの抽象メソッド を実装する – 作成したコンテントプロバイダをAndroidManifest.xml に登録する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-68
  69. 69. 2.5.コンテントプロバイダ • コンテントプロバイダを実装する方法 – コンテントプロバイダのクラスを新規作成する • 基底クラスとなるContentProviderクラスを継承したクラスを 作成する • 以下の6つのメソッドがContentProviderクラスの抽象メソッ ドとして定義されているため、仮に全メソッドを実装してお メソッド 戻り値の型 概要 く。 • コンテントプロバイダの起動時に、実行される • プロバイダの初期化処理が正しく終了した場合は trueを返す onCreate boolean getType String • 取り扱うMIMEタイプの文字列を返す query cursor • 検索をする • 結果をCursorオブジェクトとして返す Insert int • 挿入をする • 挿入件数を返す update int • 更新する • 更新件数を返す delete • 削除する int This material is licensed under the Creative • 削除件数を返す Commons License BY-NC-SA 4.0. Ⅰ-69
  70. 70. 2.5.コンテントプロバイダ ・サンプルコード import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; public class SampleProvider extends ContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-70
  71. 71. 2.5.コンテントプロバイダ ・サンプルコード (続き) @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-71
  72. 72. 2.5.コンテントプロバイダ – 必要に応じてコンテントプロバイダの抽象メソッド を実装する • onCreateでは通常SQLiteOpenHelperのオブジェクトを生成し 、インスタンス変数として保持する コンストラクタの引数に指定するContextはgetContextメソッ ドを用いる • データベースを操作する4メソッドでは、 SQLiteOpenHelper のオブジェクトからSQLiteDatabaseのオブジェクトを取得す る 取得したSQLiteDatabaseのオブジェクトを利用して、データ ベースに対して操作を行う ※ SQLiteDatabaseオブジェクトの取得は、onCreateで行う実 装者もいる • getTypeはMIMEタイプを返すメソッドであり、指定されたURI によって種別を分けたい場合に、利用者にその種別を知らせ This material is licensed under the Creative る手段として実装する Ⅰ-72 Commons License BY-NC-SA 4.0. 複雑でない場合は通常未使用(return null;)で良い
  73. 73. 2.5.コンテントプロバイダ • サンプルコード ・・・ private SampleSqliteOpenHelper sqliteOpenHelper; private SQLiteDatabase db; @Override public boolean onCreate() { sqliteOpenHelper = new SampleSqliteOpenHelper(getContext()); return true; } ・・・ⅰ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { db = sqliteOpenHelper.getReadableDatabase(); return db.query("RSS_FEED", projection, selection, selectionArgs, null, null, sortOrder); } ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-73 ・・・ⅱ
  74. 74. 2.5.コンテントプロバイダ – 作成したコンテントプロバイダをAndroidManifest.xml に登録する • 作成手順 i. ii. AndroidManifest.xmlを開き、Applicationタブを選択する Application Nodesの「Add」ボタンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-74
  75. 75. 2.5.コンテントプロバイダ iii. 表示された画面からProviderを選択し「OK」ボタンをクリッ クす ※ すでに登録されているノードにカーソルがあたっている 場合は、階層を確認されるので、ラジオボタンの上を選択す る This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-75
  76. 76. 2.5.コンテントプロバイダ iv. 追加されたProviderが選択されていることを確認した上で、 Nameの欄に作成したコンテントプロバイダのクラスの名前を 入力する Browseボタンをク リックし、ブラウズ するのが便利 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-76
  77. 77. 2.5.コンテントプロバイダ v. Attribute for Providerを下にスクロールし、Authoritiesタグに一 意となるコンテントプロバイダ名を指定する 通常はパッケージ名と同じにすることが多い This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-77
  78. 78. 2.5.コンテントプロバイダ – ※ AndroidManifest.xmlには以下のように追加される • これによりコンテントプロバイダのクラスとして登録された ことになる • サンプルコード ・・・ <application ・・・> ・・・ <provider android:authorities="jp.oesf.sample.sampleprovider“ android:name=“SampleProvider"> </provider> ・・・ </application> ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-78
  79. 79. 2.5.コンテントプロバイダ – 作成したコンテントプロバイダをContentResolverオブ ジェクトを用いて利用する 1. コンテントプロバイダにアクセスするためのURIをUriオブジ ェクトのparseメソッドに渡して、Uriオブジェクトを生成す る 指定するURIは content://コンテントプロバイダの Authorities の値 となる 2. Context#getContentResolverメソッドを用いてContentResolver オブジェクトを取得する ContentResolverにはContentProviderと同じ書式でquery, Uri Insert, update, delete, getTypeメソッドが用意されている・・・1 uri = Uri.parse("content:// jp.oesf.sample.sampleprovider”); ・・・2 Cursor cursor = getContentResolver().query(uri, null, null, null, null); • サンプルコード This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-79
  80. 80. 実 習 2.5.コンテントプロバイダ • 実習 3 • 実習のテーマ – RssReaderアプリにコンテントプロバイダを作成し、 外部アプリケーションからRSS_FEEDテーブルの情報 を検索できるようにする ボタン クリック This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-80
  81. 81. 実 習 2.5.コンテントプロバイダ • 実習の手順 1. コンテントプロバイダとなるRssProviderクラスを新 規作成する 2. RssProvider のonCreateメソッドで、 SQLiteOpenHelperオブジェクトを取得する 3. RssProviderのqueryメソッドで、 SQLiteDatabaseオブ ジェクトをSQLiteOpenHelper#getReadableDatabaseメ ソッドで取得する 4. RssProviderのqueryメソッドで、 SQLiteDatabase#queryを呼び出し、Cursorを戻す。 5. RssProviderの設定をAndroidManifest.xmlに追加する 6. TestContentProviderプロジェクトのMain# This material is licensed under the Creative onClickGetListメソッドを確認する (すでに実装さ Ⅰ-81 Commons License BY-NC-SA 4.0.
  82. 82. 実 習 2.5.コンテントプロバイダ – 設定情報 1 • 以下のクラス、メソッドを実装する 対象 コンテン トプロバ イダ クラス メソッド 概要 • 新規作成する • パッケージは jp.oesf.mtgeduwg.training.rssreader とする RssProvider onCreate • SQLiteOpenHelperオブジェクトを取 得する query • RSS_FEEDテーブルから、引数の条件 をそのままに検索を実行し、その結 果を返す This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-82
  83. 83. 実 習 2.5.コンテントプロバイダ – 設定情報 2 • 以下のファイルを編集する ファイル名 AndroidManifest.xml 概要 • RssProviderをコンテントプロバイダとして登録する • android:authoritiesにはjp.oesf.mtgeduwg.training.rssreaderと設 定する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-83
  84. 84. 実 習 2.5.コンテントプロバイダ • 確認方法 – TestContentProviderアプリを立ち上げ、「GET LIST」ボ タンを押すと、コンテントプロバイダ経由でデータ ベースより値を取得し、画面に一覧を表示するよう にする ボタン クリック This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-84
  85. 85. 実 習 2.5.コンテントプロバイダ • 実習 3 • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-85
  86. 86. 実 習 2.5.コンテントプロバイダ • 実習 3[補足] – URIを使って処理を分岐させる • RssProviderではqueryメソッド内で固定でRSS_FEEDテーブルに アクセスしているが、アプリケーションによってはアクセス するテーブルを振り分ける必要がある。 • ContentProviderでは通常query,insert,update,deleteなどのメソ ッドに与えられている引数Uriを使って処理を分岐させるこ とが可能 / テーブル名 content://xxx.xxx.xx – URIに参照するためのテーブル名相当の文字列を連結する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-86
  87. 87. 2.5.コンテントプロバイダ • UriMatcherクラスを使って処理を分岐させる – 連結された文字を判定する処理ではUriMatcherクラス を使用するとよい – UriMatcherに用意されているaddURIメソッドとmatch メソッドを使用し連結された文字列を判定する • addURI サンプルコード – uriに連結された文字列と一致したときの数値を設定 import android.content.UriMatcher; • match private static final UriMatcher uriMatcher; – 引数で指定したuriにaddURIで設定した文字列と一致しているか static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 確認 uriMatcher.addURI("jp.oesf.mtgeduwg.training.rssreader", "TABLE_1", 1); uriMatcher.addURI("jp.oesf.mtgeduwg.training.rssreader", "TABLE_2", 2); uriMatcher.addURI("jp.oesf.mtgeduwg.training.rssreader", “TABLE_1/#", 3); } // queryなどのメソッドの中では以下のように判定する #には数字が入る switch(uriMatcher.match(uri)){ 特定のカラムのみ検索 case 1: ・・・ jp.oesf.mtgeduwg.training.rssreader/TABLE_1 する場合などにIDを指 case 2: ・・・ jp.oesf.mtgeduwg.training.rssreader/TABLE_2 This material is licensed under the Creative case 3: ・・・ jp.oesf.mtgeduwg.training.rssreader/TABLE_1/5 定する Ⅰ-87 Commons License BY-NC-SA 4.0. default: ・・・
  88. 88. 実 習 2.5.コンテントプロバイダ • 実習 3[補足] • 実習のテーマ – URIを使って処理を分岐させる • テーブルをコード内の固定せず、URIで指定するようにする – RssProviderにUriMatcherを使った分岐処理を追加する – TestContentProviderで作成したURIにRSS_FEEDを連結させる » content://jp.oesf.mtgeduwg.training.rssreader/RSS_FEED This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-88
  89. 89. 実 習 2.5.コンテントプロバイダ • 実習 3 [補足] • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-89
  90. 90. 3. 実践的開発 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-90
  91. 91. 3章の概要 • • • • ノーティフィケーション 複数解像度対応 多言語対応 adbツール This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-91
  92. 92. 3.1.ノーティフィケーション • ノーティフィケーションとは? – 画面上端のステータスバーに一定時間情報を表示する機能 – ステータスバーを開いた際には、ノーティフィケーションの一 覧画面が表示され、そちらからアクティビティを起動すること ができる This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-92
  93. 93. 3.1.ノーティフィケーション • ノーティフィケーションを実装する方法 1. 2. 3. 4. 5. ノーティフィケーションを扱うためのNotificationManagerクラ スを取得する Notificationオブジェクトを生成する ノーティフィケーションの一覧からクリックされた際に起動す るペンディングインテントを生成する Notificationオブジェクトにイベント情報を設定する ノーティフィケーションを表示する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-93
  94. 94. 3.1.ノーティフィケーション • ノーティフィケーションを実装する方法 1. ノーティフィケーションを扱うためのNotificationManagerクラ スを取得する – NotificationManagerはContext#getSystemServiceにて取得可能 – 上記メソッドの引数にはContext.NOTIFICATION_SERVICE の定数を 指定する – 戻り値はObject型なのでNotificationManager型にキャストする サンプルコード import android.app.NotificationManager; import android.content.Context; ・・・ NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-94 ・・・1
  95. 95. 3.1.ノーティフィケーション 2. Notificationオブジェクトを生成する • コンストラクタを呼び出しオブジェクトを生成する • コンストラクタの引数には アイコンのリソースID,ステータ スバーに表示するメッセージ、一覧に表示される時間 (ミリ サンプルコード 秒)を指定する import android.app.Notification; ・・・ Notification notification = new Notification(R.drawable.icon,"RSS取得できました", System.currentTimeMillis()); This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-95 ・・・2
  96. 96. 3.1.ノーティフィケーション 3. ノーティフィケーションの一覧からクリックされた 際に起動するペンディングインテントを生成する • PendingIntentのgetActivityメソッド(staticメソッド)により PendingIntentを生成する • getActivityの引数は4つあり、コンテキスト、リクエストコー ド(現在未使用のため、通常0)、インテント、フラグ(使 用しないなら0) を指定する サンプルコード import android.app.PendingIntent; import android.content.Intent; ・・・ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,RssListActivity.class), 0); ・・・3 フラグはPendingIntent.FLAG_UPDATE_CURRENTなど 詳細は http://developer.android.com/reference/android/app/PendingIntent.html This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-96
  97. 97. 3.1.ノーティフィケーション 4. Notificationオブジェクトにイベント情報を設定する • Notification#setLatestEventInfoによりイベント情報を設定する • setLatestEventInfoの引数は4つあり、コンテキスト、タイト ル、テキスト、ペンディングインテント を指定する サンプルコード notification.setLatestEventInfo(this, "RssReader", "RSS取得完了", pendingIntent); This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-97 ・・・4
  98. 98. 3.1.ノーティフィケーション 5. ノーティフィケーションを表示する • NotificationManager#notifyにより、実際にノーティフィケー ションを表示をする • notifyの引数は2つあり、id(アプリ内でそのノーティフィケ ーションを一意にする数字), Notificationオブジェクト を指 定する サンプルコード nm.notify(0,notification); This material is licensed under the Creative Commons License BY-NC-SA 4.0. ・・・5 Ⅰ-98
  99. 99. 3.1.ノーティフィケーション 1-5までのサンプルコードを一つにまとめると以下のようになる import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; ・・・ NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.icon,"RSS取得できました", System.currentTimeMillis()); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,RssListActivity.class), 0); notification.setLatestEventInfo(this, "RssReader", "RSS取得完了", pendingIntent); nm.notify(0,notification); ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-99
  100. 100. 実 習 3.1.ノーティフィケーション 実習 4 • 実習のテーマ – サービスでRSS取得ロジックが終了した際に、ノーテ ィフィケーションを用いて終了した旨を知らせる処 理を作成する – ノーティフィケーションの一覧画面にて該当のノー ティフィケーションをクリックすると、一覧画面 ロジック終 (RssListActivity)に遷移する クリック 了 サービスとして起動 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-100
  101. 101. 実 習 3.1.ノーティフィケーション 実習 4 • 実習の手順 1. RegisterService#onStartCommandのRSS取得ロジックの 後に以下を実装する i. NotificationManager を取得する ii. Notificationオブジェクトを生成する iii. 一覧画面(RssListActivity)に遷移するようなPendingIntentを 生成する iv. Notificationオブジェクトにイベント情報を設定する v. ノーティフィケーションを表示する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-101
  102. 102. 実 習 3.1.ノーティフィケーション 実習 4 – 設定情報 1 • 以下のクラス、メソッドを実装する 対象 クラス メソッド RSS取得 RegisterService onStartCommand 概要 • ノーティフィケーションを表示する • PendingIntentのフラグは0とする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-102
  103. 103. 実 習 3.1.ノーティフィケーション 実習 4 – 設定情報 2 「RssReader」と表 • 以下のように表示されるようにする 示 R.drawable.icon の画像を表示 「RSS取得でき ました」と表 示 「RSS取得完 了」と表示 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 表示時点での 時刻を表示 Ⅰ-103
  104. 104. 実 習 3.1.ノーティフィケーション 実習 4 • 確認方法 – 「RSS取得」メニューを押す等によりRSS取得を行った 際に、以下のようなノーティフィケーションが表示さ れる – ノーティフィケーションの一覧から、該当のノーティ フィケーションを押すとRSSリーダーの一覧画面に遷移 する クリック This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-104
  105. 105. 実 習 3.1.ノーティフィケーション 実習 4 • 実習の答え @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build()); Log.v("RegisterService", "onStartCommand start"); new RssFeedRegister(this) .registration("http://www.oesf.jp/modules/news/index.php?page=rss"); // TODO ネットワーク接続が出来ない場合は上記の処理をコメントアウトし、下のコメントアウトを外す // new RssFeedRegister(this).registration("android.xml"); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.icon, "RSS取得できました", System.currentTimeMillis()); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, RssListActivity.class), 0); notification.setLatestEventInfo(this, "RssReader","Rss取得完了",pendingIntent); nm.notify(0, notification); Log.v("RegisterService", "onStartCommand end"); return START_STICKY; } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-105
  106. 106. 実 習 3.1.ノーティフィケーション 実習 4[補足] • 実習のテーマ – 一覧画面に遷移した際にnotificationを削除するように する • 実習の答え – 別ドキュメント参照 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-106
  107. 107. 3.2. 複数解像度対応 • 複数解像度対応 – Androidではバージョン1.6より複数解像度に正式に対応している – どのAndroid端末にインストールされるかわからない場合は、複 数解像度対応をしなければ、正しく表示されない可能性がある – Androidがどのような仕組みで1つのアプリが複数の解像度に対 応しているのかを知っておく必要がある This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-107
  108. 108. 3.2. 複数解像度対応 • • • • Densityとスクリーンサイズ DIP (Density Independent Pixel) スケーリング 複数解像度対応Tips This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-108
  109. 109. 3.2. 複数解像度対応 • Densityとスクリーンサイズ – AndroidではDensity(密度)とスクリーンサイズにより端末をカテ ゴライズしている – DensityはDPI(Dots Per Inch/1インチ当たりのドット数)の値によ り以下のように分類している – 以下の分類により、呼び出す画像ファイルのディレクトリが分 かれることにより、そのDensityに適した画像を表示することが できる Density DPIの範囲 みなしDPI値 対応する画像ファイルディレクトリ Low-Density 100dpi-140dpi 120dpi res/drawable-ldpi Medium-Density 140dpi-180dpi 160dpi res/drawable-mdpi High-Density 190dpi-250dpi 240dpi res/drawable-hdpi Extra High-Density 250dpi以上 320dpi res/drawable-xhdpi ※ みなしDPI値 例 Low-Densityの端末は、すべてDPIが120dpiだとして扱われる This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-109
  110. 110. 3.2. 複数解像度対応 – スクリーンサイズは以下に分類されている – 以下の分類により、呼び出すレイアウトファイルの ディレクトリが分かれることにより、その画面サイ ズに適したレイアウトファイルを呼び出すことがで きる 名称 画面のサイズ 対応するレイアウトファイルディレクトリ Small screen 426dp x 320dp res/layout-small Normal screen 470dp x 320dp res/layout Large screen 640dp x 480dp res/layout-large Extra Large screen 960dp x 720dp res/layout-xlarge This material is licensed under the Creative 参考 http://developer.android.com/intl/ja/guide/topics/resources/providingⅠ-110 Commons License BY-NC-SA 4.0. resources.html#AlternativeResources
  111. 111. 3.2. 複数解像度対応 – 2つの分類をまとめると、以下の表のようになる This material is licensed under the Creative 参考 http://developer.android.com/intl/ja/guide/topics/resources/providingⅠ-111 Commons License BY-NC-SA 4.0. resources.html#AlternativeResources
  112. 112. 3.2.複数解像度対応 • DIP (Density Independent Pixel) – サイズを直接指定する際に、通常はピクセル(Pixel/px)を使うが、ピク セルだとDensityにより意図しないUIとなる – AndroidではDIP(Density Independent Pixel)という仮想的なピクセル単位 の概念を導入し、それに対応できるようにしている – DIPの単位はdipないしdpと表記するが、dpが推奨されている – pixels = dips * (density / 160) の式で計算される つまり160dpi= Medium-Densityでは1px=1dpとなる – DIPと似た概念としてScale-independent Pixels (sp)があるが、Densityだけで なくユーザーのフォントサイズ設定を加味した値となる。 – [補足]Androidで用意されているJavaの各メソッドでのサイズの値を渡す引 数はpxなのかdpなのかを意識する必要がある。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-112
  113. 113. 3.2.複数解像度対応 • スケーリング – 画像ファイルはDensityによって呼び出すディレクトリが用意されているが 、すべてが用意されていない、res/drawableのみしか用意されていない等の 場合がありうる – 上記の場合に、Medium-DensityのScale Densityを1として、Densityによって画 像のサイズを拡大縮小して表示するスケーリング機能が用意されている – スケーリングしたくない画像はres/drawable-nodpiに配置すれば、スケーリ ングされずそのままの解像度で表示される Scale Density Density Scale Density Extra-High-Density 2.0 High-Density 1.5 Medium-Density 1 Low-Density 0.75 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-113
  114. 114. 3.2.複数解像度対応 • 複数解像度対応Tips – – – – レイアウトのwidthやheightのサイズ指定はwrap_contentやmatch_parent 数値指定が必要な場合はpxではなくdpを用いる 画像ファイルはDensityによって適切に用意する スクリーンサイズの違いを意識し、横方向には詰め込みすぎない どうしても詰め込みたい場合はSmall Screenのみレイアウトファイルを別 途用意する – Javaのコードでピクセル値をハードコードしない。dpに変換する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-114
  115. 115. 3.2.複数解像度対応 • 複数解像度対応Tips(続き) – スクリーンサイズの区分のうち対応しないスクリーンを設ける際は、 AndroidManifest.xmlのsupports-screensの設定を記載すればよい AndroidManifest.xmlのサンプル (Small Screenに対応していない) ・・・ <application> ・・・ <supports-screens android:xlargeScreens="true" android:largeScreens=“true” android:normalScreens=“true” android:smallScreens=“false” /> ・・・ </application> ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-115
  116. 116. 実 習 3.2.複数解像度対応 実習 5 • 実習のテーマ – MultiResolutionプロジェクトのアプリを、スクリーンサイズとDensityの 違うエミュレータでそれぞれ動かし、その画面とソースを確認する ldpi mdpi This material is licensed under the Creative Commons License BY-NC-SA 4.0. hdpi Ⅰ-116
  117. 117. 実 習 3.2.複数解像度対応 実習 5 • 実習の確認ポイント – Small-Screenではボタンが2段組みとなっていることを 確認 => res/layout-small/main.xmlが読み込まれている – R.drawable.droidは解像度ごとに用意された別画像が表 示されていることを確認 => res/drawable-Xdpi/droid.jpg が表示されている – R.drawable.droid_nodpi はスケーリングされずに1つの 画像が表示されていることを確認 => res/drawable-nodpi/droid_nodpi.jpgが表示されてい This material is licensed under the Creative Ⅰ-117 Commons License BY-NC-SA 4.0. る
  118. 118. 実 習 3.2.複数解像度対応 • 実習の確認ポイント(続き) – R.drawable.droid_scalingはスケーリングされて、解像 度に合わせてサイズが拡大縮小されて表示されてい ることを確認 => res/drawable/droid_scaling.jpgがスケーリングされ て表示されている – 表示されているテキストは上はpx指定、下はdp、sp指 定であるため、下のテキストは解像度に合わせてサ イズが変わっているのを確認する => res/layout/main.xmlが読み込まれている – 画像のマージンはdp指定されているため、解像度に This material is licensed under the Creative Ⅰ-118 Commons License BY-NC-SA 4.0. 合わせてサイズが変わっているのを確認する
  119. 119. 実 習 3.2.複数解像度対応 Small-Screenではボタンが 2段に分かれて表示され る R.drawable.droid Densityごとに別画 像が用意されてい る 上はpx指定 下はdp,sp指定 上は解像度によりサ イズが変わる R.drawable.droid_scaling スケーリングされて表示 される R.drawable.droid_nodpi スケーリングされず、 すべて同じ解像度で 表示される This material is licensed under the Creative Commons License BY-NC-SA 4.0. 画像のマージンはdp 指定している Ⅰ-119
  120. 120. 実 習 3.2.複数解像度対応 実習 5 • 実習の手順 1. 以下の3つのエミュレータが用意されているので、 それを起動させMultiResolutionプロジェクトのアプ リを起動し表示された画面とソースを確認する エミュレータ名 スクリーンサイズとDensity QVGA-small-ldpi Small Screen, Low-Density HVGA-normal-mdpi Normal Screen, Medium-Density WVGA-normal-hdpi Normal Screen, High-Density This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-120
  121. 121. 実 習 3.2.複数解像度対応 実習 5 • 確認方法 – 実習の確認ポイントを確認する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-121
  122. 122. 3.3. 多言語対応 • 多言語対応 – Androidのアプリケーションは世界各国で使われる可能性がある ため多言語に対応するべきである – Androidには文字列をリソースファイルとして記述しておけば、 簡単に多言語対応できる仕組みが用意されている – 端末での言語設定に合わせてres/values-[言語コード], ないし res/values-[言語コード]-r[地域コード] のディレクトリ配下のリソ ースファイルを読みにいくようになっている – 端末設定言語固有のディレクトリが存在しない場合は、 res/values配下を読み込む This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-122
  123. 123. 3.3. 多言語対応 例 • English(Australia)の場合はvalues-en-rAU • Australia以外のEnglishの場合はvaluesen • 日本語の場合はvalues-ja • 上記以外の場合はvalues が読み込まれる 言語コードの指定 ISO 639-1形式 http://www.loc.gov/standards/iso639-2/php/code_list.php 地域コードの指定 ISO 3166-1-alpha-2形式 http://www.iso.org/iso/country_codes/iso_3166_code_lists/ english_country_names_and_code_elements.htm This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-123
  124. 124. 実 習 3.3. 多言語対応 実習6 • 実習のテーマ – エミュレータの言語設定を変更すると、それに応じ て呼び出される文字列リソースファイルが変更され ることを確認する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-124
  125. 125. 実 習 3.3. 多言語対応 実習 6 • 実習の手順 1. res/values-en, res/values-en-rAU, res/values-ja を作成す る 2. res/values/strings.xml を 作成した3ディレクトリにコ ピーする 対象 キー 値 res/values/strings.xml go_to_list_page_button_label 一覧表示(デフォルト) 3. 各strings.xmlのgo_to_list_page_button_labelキーの値 res/values-en/strings.xml go_to_list_page_button_label 一覧表示(英語) を以下のように変更する res/values-en-rAU/strings.xml go_to_list_page_button_label 一覧表示(オーストラリア) res/values-ja/strings.xml go_to_list_page_button_label 一覧表示(日本) This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-125
  126. 126. 実 習 3.3. 多言語対応 実習 6 • 確認方法 – RssReaderをエミュレータで起動する 言語設定を変更するとメニュー画面のボタンの表示テ キストが変更されることを確認する 言語 表示文字列 値 日本語 go_to_list_page_button_label 一覧表示(日本) English(Australia) go_to_list_page_button_label 一覧表示(オーストラリア) English ※Australia以外 go_to_list_page_button_label 一覧表示(英語) 上記どれでもない go_to_list_page_button_label 一覧表示(デフォルト) This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-126
  127. 127. 実 習 3.3. 多言語対応 実習 6 • 言語設定方法 i. ホーム画面で「menu」ボタン => 「Settings」を押す ii. Settings画面にて「Language & keyboard」 を押す This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-127
  128. 128. 実 習 3.3. 多言語対応 iii. Language & keyboard settings画面で「Select language」 を押す iv. Locale画面にて対象の言語を押す This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-128
  129. 129. 実 習 3.3. 多言語対応 実習 6 • 実習の答え (該当部のみ) – res/values/strings.xml <string name=“go_to_list_page_button_label”>一覧表示(デフォルト)</string> – res/values-en/strings.xml <string name=“go_to_list_page_button_label”>一覧表示(英語)</string> <string name=“go_to_list_page_button_label”>一覧表示(オーストラリア)</string> – res/values-en-rAU/strings.xml <string name="go_to_list_page_button_label">一覧表示(日本)</string> – res/values-ja/strings.xml This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-129
  130. 130. 3.4.adbツール • adbツールとは? – SDKに付属しているデバイスやエミュレータの状態を管理するツ ール – コマンドプロンプトにて、コマンドを打ち利用する – <SDK_ROOT>/platform-toolsにPathを通している場合は、adbコマ ンドをどのディレクトリでも認識する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-130
  131. 131. 実 習 3.4.adbツール 実習 7 • 実習のテーマ – 説明に合わせて載っている操作を実際に行い、adbツ ールの使い方を学ぶ 1. adb -help adbツールのヘルプが表示される C:¥>adb -help Android Debug Bridge version 1.0.29 -d - directs command to the only connected USB device returns an error if more than one USB device is present. -e - directs command to the only running emulator. returns an error if more than one emulator is running. -s <serial number> - directs command to the USB device or emulator with the given serial number. Overrides ANDROID_SERIAL This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-131
  132. 132. 実 習 3.4.adbツール 実習 7 2. adb devices 実行中のエミュレータと実機の一覧を表示する C:¥>adb devices List of devices attached emulator-5554 device 3. adb uninstall <パッケージ名> C:¥>adb uninstall jp.oesf.mtgeduwg.training.testcontentprovider パッケージ名 に該当するアプリケーションをアンインストールする Success 4. adb install <apkのパス> C:¥>adb install C:¥android_training_applied¥workspace¥TestContentProvider¥bin¥Te アプリケーションをインストールする stContentProvider.apk 72 KB/s (15719 bytes in 0.210s) pkg: /data/local/tmp/TestContentProvider.apk This material is licensed under the Creative Success Commons License BY-NC-SA 4.0. Ⅰ-132
  133. 133. 実 習 3.4.adbツール 実習 7 5. adb logcat ログを出力する (終了:Ctrl + C) C:¥>adb logcat D/dalvikvm( 149): GC_EXTERNAL_ALLOC freed 135K, 50% free 2972K/5895K, external 4730K/5582K, paused 62ms W/KeyCharacterMap( 149): No keyboard for id 0 W/KeyCharacterMap( 149): Using default keymap: /system/usr/keychars/ 6. adb logcat -c C:¥>adb logcat -c ログをクリアする 7. adb shell C:¥>adb shell 端末(エミュレータ)に接続しシェルを起動する # This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-133
  134. 134. 実 習 3.4.adbツール 実習 7 (ここからシェルでの操作) 8. cd <ディレクトリパス> カレントディレクトリの移動する # cd /data/data/jp.oesf.mtgeduwg.training.rssreader cd /data/data/jp.oesf.mtgeduwg.training.rssreader 9. pwd カレントディレクトリを表示する # pwd pwd /data/data/jp.oesf.mtgeduwg.training.rssreader 10.lsls # ファイルやディレクトリの情報を表示する ls databases lib This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-134
  135. 135. 実 習 3.4.adbツール 実習7 (ここからsqlite3コマンド) 11.sqlite3 <データベースファイルのパス> カレントディレクトリの移動する 12. .help ヘルプを表示する 13..dump ダンプファイルを表示する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-135
  136. 136. 実 習 3.4.adbツール 実習 7 11..schema CREATE文を表示する 12. <SQL文>; SQL文を発行する 13..exit sqlite3コマンドを抜ける This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-136
  137. 137. 3.5.JUnit • JUnitとは – Javaプログラムのユニットテスト(単体テスト)を行うためのテ スティングフレームワーク – 作成したプログラムが、意図した挙動をするのか確認するテス トコードを作成し、それを実行することにより検証を行える – テストがプログラム化しており、何度でも機械的に実行が可能 なため品質の担保に役立つ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-137
  138. 138. 3.5.JUnit • Android用に拡張されたJUnitとは – AndroidではJUnit3を元にして、Android用にカスタマイズされ提 供されている – ユーザーの画面操作やライフサイクルのイベント(onCreate等)を 発行することが可能 => ある程度は単体テストの枠を超えて、シナリオテストにも利 用可能 – 通常JUnitのランナーは開発マシン上のJava VMで動作するが、 AndroidのJUnitランナーはエミュレータや実機にTest用アプリケ ーションをインストールし実行することのより、テストを実施 している。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-138
  139. 139. 3.5.JUnit • JUnit 基底クラスの構造 – JUnitのテストクラスはjunit.framework.TestCaseクラス を基底クラスとして、拡張したクラスとする必要が ある – Androidでは上記TestCaseクラスを、テスト対象に合わ せて継承したクラスを用意している – 用途に合わせてその継承したクラスを利用すれば良 い This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-139
  140. 140. 3.5.JUnit – TestCaseクラスとAndroidが提供しているテスト用クラ スの関係 junit.framework.TestCase InstrumentationTestCase ActvitivtTestCase ActivityInstrumentationTestCase2 ActivityUnitTestCase SingleLaunchActivityTestCase AndroidTestCase ServiceTestCase ProviderTestCase2 ApplicationTestCase This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-140
  141. 141. 3.5.JUnit – 各基底クラスの概要 • ActivityInstrumentationTestCase2 – ボタンを押す等の画面の操作が可能 • ActivityUnitTestCase – アクティビティのライフサイクル上のイベント(onCreate等)を実行す ることが可能 • ServiceTestCase – サービスを実行することが可能 • ProviderTestCase2 – コンテントプロバイダを実行することが可能 • ApplicationTestCase – アプリケーションのテストに利用可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-141
  142. 142. 3.5.JUnit • JUnit実コード例 – まずはAndroidと関係なく、一般的なJUnitのコード • テスト対象のコード 引数2つを足し算をして返すメソッド public class Foo { public int add(int x, int y){ return x + y; } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-142
  143. 143. 3.5.JUnit • テストコード import junit.framework.TestCase; public class FooTest extends TestCase { ・・・1 private Foo foo = null; protected void setUp() throws Exception { super.setUp(); foo = new Foo(); } ・・・2 protected void tearDown() throws Exception { super.tearDown(); } ・・・3 public void testAdd(){ int actual = foo.add(4, 5); assertEquals(9, actual); } ・・・4 ・・・5 } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-143
  144. 144. 3.5.JUnit 1. 2. 3. 4. 5. junit.framework.TestCaseを継承し、クラスを作成する クラス名は「テスト対象のクラス名」 + “Test”とすることが通例 setUpメソッドは、テストが開始される前に実行される テストの準備(データの整備、オブジェクトの生成等)をこのメ ソッドで行う tearDownメソッドは、テストが終了した際に実行される テスト後のクリーンアップ(データを元に戻す等)をこのメソッ ドで行う テストメソッドとなる メソッド名はtestXXXとし、public void で引 数なしとする assertEqualsメソッドは、ここでテスト対象のコードが正しく振舞 っているかを確認する。第一引数に期待値、第二引数に実際のテ ストにより得た値をセットすることにより、2つが正しい場合はテ スト通過、そうでない場合はエラーとなる 他にassertTrue, assertFalse等がある This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-144
  145. 145. 3.5.JUnit • ActivityInstrumentationTestCase2の例 テスト対象 のActivity public class FooActivityTest extends ActivityInstrumentationTestCase2<FooActivity> { public FooActivityTest() { super(FooActivity.class); テスト対象クラスのクラス情 } 報 public void testUrlFieldKeyInput() { // キーの送信(“T",“E",“S",“T"と入力) sendKeys(KeyEvent.KEYCODE_T, KeyEvent.KEYCODE_E KeyEvent.KEYCODE_S, KeyEvent.KEYCODE_T); assertEquals(“test”, urlField.getText().toString()); キーの入力 } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-145
  146. 146. 3.5.JUnit • ActivityInstrumentationTestCase2の例 package jp.oesf.mtgeduwg.training.test; テスト対象 のActivity public class AddActivityTest extends ActivityInstrumentationTestCase2<AddActivity> { public AddActivityTest() { super(AddActivity.class); } public void testAddButtonClick() { UIスレッドへの処理の依頼 getActivity().runOnUiThread(new Runnable() { public void run() { urlField.setText("http://www.oesf.jp/modules/news/index.php?page=rss"); addButton.performClick(); ボタンのクリックを実行 }}); getInstrumentation().waitForIdleSync(); UIスレッドの処理終了を待 assertTrue(existsUrlAddressById(10)); つ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-146
  147. 147. 3.5.JUnit • ActivityInstrumentationTestCase2の例 (画面遷移) public void testAddButtonClick() { 遷移先Activityをモニターする ActivityMonitor monitor = new ActivityMonitor("jp.oesf.mtgeduwg.training.rssreader.RssListActivity", null, false); getInstrumentation().addMonitor(monitor); getActivity().runOnUiThread(new Runnable() { public void run() { addButton.performClick(); 遷移先Activityを取得 }}); Activity rssListActivity = getInstrumentation().waitForMonitor(monitor); if(rssListActivity != null){ rssListActivity.finish(); } } 遷移先Activityをfinish This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-147
  148. 148. 3.5.JUnit • ActivityUnitTestCaseの例 package jp.oesf.mtgeduwg.training.test; テスト対象 のActivity public class AddActivityUnitTest extends ActivityUnitTestCase<AddActivity> { public AddActivityUnitTest() { super(AddActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); } public void testSendResumeEvent() throws Exception { onResumeの実行 Intent intent = new Intent(Intent.ACTION_MAIN); startActivity(intent, null, null); getInstrumentation().callActivityOnResume(getActivity()); } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-148
  149. 149. 3.5.JUnit • ServiceTestCaseの例 package jp.oesf.mtgeduwg.training.test; テスト対象 のService public class AddServiceTest extends ServiceTestCase <AddService> { public AddServiceTest() { super(AddSer viceclass); } @Override protected void setUp() throws Exception { super.setUp(); Intentを生成し、それ } を元にServiceを起動 public void testService() { Intent intent = new Intent(AddService.class.getName()); int result = startService(intent); ・・・ } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-149
  150. 150. 3.5.JUnit • メモ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-150
  151. 151. 3.5.JUnit • JUnitプロジェクトの作り方 1. Eclipseのメニュー[File]から[New]->[Other]を選択する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-151
  152. 152. 3.5.JUnit 2. Androidフォルダ内の「Android Test Project」を選択 し、「Next」ボタンを押す 3. Project Nameの欄にテストプロジェクト名を指定し て「Next」ボタンを押す This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-152
  153. 153. 3.5.JUnit 4. TestTargetのプロジェクトを選択して「Finish」ボタ ンをクリックする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-153
  154. 154. 3.5.JUnit 5. 次にTestCaseを作成する。4.で作成したテストプロジ ェクトを選択した状態で、 [File]から[New]->[Other] を選択する 6. Javaフォルダ->JUnitフォルダ内の「JUnit Test Case」 を選択し、「Next」ボタンを押す 6 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-154
  155. 155. 3.5.JUnit 7. New JUnit 3 のボタンが選ばれていることを確認し、 Nameにクラス名、Superclassに親クラスを入力、 Class under testにはTestTargetのクラス名を指定して 「Finish」ボタンを押す 7 This material is licensed under the Creative Commons License BY-NC-SA 4.0. 注意 テストクラス生成後は そのクラスのコンストラ クタが未実装でコンパイ ルエラー状態なのでコン ストラクタを追加するこ Ⅰ-155 と。
  156. 156. 3.5.JUnit • AndroidManifest.xml – Eclipseを用いてテストプロジェクトを作成すると、自動で以下 の太字2か所が追加される (テスト実行のためには必須) <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.oesf.mtgeduwg.training.rssreader.test" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="android.test.runner" /> </application> <uses-sdk android:minSdkVersion="7" /> <instrumentation android:targetPackage="jp.oesf.mtgeduwg.training.rssreader" android:name="android.test.InstrumentationTestRunner" /> </manifest> This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-156
  157. 157. 3.5.JUnit – テストの実行方法 • テストプロジェクトを右クリック Run as -> Android JUnit Test を選択する エミュレータ or 実機を接続している必要がある This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-157
  158. 158. 3.5.JUnit – テストの成功/失敗の確認 • JUnitビューにて確認可能 失敗 成功 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-158
  159. 159. 実 習 3.5.JUnit 実習 8 • 実習のテーマ – JUnitのテストケースを実際に作成する – 2つのテストケースを作成する – 上記を通して、Androidでの単体テストの方法を習得 する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-159
  160. 160. 実 習 3.5.JUnit 実習 8 • 実習の手順 1. RssReaderをテスト対象とするRssReaderTestプロジェ クトを作成する 2. RssReaderActivity と RegisterService をテストするクラ スをそれぞれ作成する 3. それぞれに、一つずつテストメソッドを実装する i. ii. RssReaderActivityのテストでは 「一覧表示」ボタンを押し、一覧表示画面が表示される そ こに表示されているListViewの件数が0件より大きいことを 確認 するテストを記載する ヒント ListView#getCount()にてListViewの件数を取得可能 This material is licensed under Creative RegisterServiceのテストでは the4.0. Ⅰ-160 Commons License BY-NC-SA ResigsterServiceを実行する前後でDBのRSS_FEEDテーブルに
  161. 161. 実 習 3.5.JUnit 実習 8 • 確認方法 – テストを実行し、グリーンになる This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-161
  162. 162. 実 習 3.5.JUnit 実習 8 • 実習の答え – RssReaderActivityTest.java package jp.oesf.mtgeduwg.training.rssreader.test; import jp.oesf.mtgeduwg.training.rssreader.R; import jp.oesf.mtgeduwg.training.rssreader.RssReaderActivity; import android.app.Activity; import android.app.Instrumentation.ActivityMonitor; import android.test.ActivityInstrumentationTestCase2; import android.widget.Button; import android.widget.ListView; public class RssReaderActivityTest extends ActivityInstrumentationTestCase2<RssReaderActivity>{ public RssReaderActivityTest(){ super(RssReaderActivity.class); } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-162
  163. 163. 実 習 3.5.JUnit – RssReaderActivityTest.java (続き) public void testOnClickListButton(){ ActivityMonitor monitor = new ActivityMonitor("jp.oesf.mtgeduwg.training.rssreader.RssListActivity", null, false); getInstrumentation().addMonitor(monitor); final Button button = (Button) getActivity().findViewById(R.id.list_button); getActivity().runOnUiThread(new Runnable() { @Override public void run() { button.performClick(); } }); getInstrumentation().waitForIdleSync(); Activity rssListActivity = getInstrumentation().waitForMonitor(monitor); ListView listView = (ListView) rssListActivity.findViewById(android.R.id.list); assertTrue(listView.getCount() > 0); if(rssListActivity != null){ rssListActivity.finish(); } } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-163
  164. 164. 実 習 3.5.JUnit – RegisterServiceTest.java package jp.oesf.mtgeduwg.training.rssreader.test; import jp.oesf.mtgeduwg.training.rssreader.RegisterService; import jp.oesf.mtgeduwg.training.rssreader.helper.DatabaseOpenHelper; import android.content.Intent; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.test.ServiceTestCase; public class RegisterServiceTest extends ServiceTestCase<RegisterService> { public RegisterServiceTest() { super(RegisterService.class); } public void testRegisterService() { int before; int after; Intent intent = new Intent(RegisterService.class.getName()); before = countDb(); startService(intent); after = countDb(); assertTrue(after - before > 0); } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-164
  165. 165. 実 習 3.5.JUnit – RegisterServiceTest.java (続き) private int countDb() { int result = 0; Cursor cursor = null; DatabaseOpenHelper databaseOpenHelper = new DatabaseOpenHelper(getContext()); SQLiteDatabase database = null; try { database = databaseOpenHelper.getReadableDatabase(); cursor = database.query(“RSS_FEED”, null, null, null, null, null, null); result = cursor.getCount(); } finally { if (database != null) { database.close(); JUnitではCursorを明示的 } にcloseしなければ例外と if(cursor != null){ cursor.close(); なる } } return result; } } This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-165
  166. 166. 実 習 3.5.JUnit • 実習 8[補足] • 実習のテーマ – 他のメソッドもテストする This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-166
  167. 167. 4. 実践的開発2 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-167
  168. 168. 4章の概要 • アクティビティとタスク – タスク – アフィニティ – 起動モード • タスクの管理 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-168
  169. 169. 4.1.アクティビティとタスク • アプリケーションのタスク – Androidのタスクとはアクティビティを管理する仕組みである – タスクとは、アクティビティをスタック構造で管理している – 違うアプリケーションのアクティビティを起動した際も、その アクティビティは同一のタスクとして扱われる タスク 起動 タスク 起動 タスク 起動 ルートアクティビティ 戻る 戻る This material is licensed under the Creative Commons License BY-NC-SA 4.0. 戻る Ⅰ-169
  170. 170. 4.1.アクティビティとタスク • アフィニティ – 直訳すると 親和性 – アプリケーション内のすべてのアクティビティは、デフォルト ではすべて同一タスクになるような親和性(アフィニティ)が ある – 通常は同じアプリケーションのアクティビティは、同じアフィ ニティを持つが、個別のアクティビティにアフィニティを設定 することも可能 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-170
  171. 171. 4.1.アクティビティとタスク • アフィニティの設定と挙動 – アフィニティの値はAndroidManifest.xmlに登録可能である – アフィニティを設定してもデフォルトの振る舞いでは、各アク ティビティは同一のタスクとなる – 別タスクで起動する場合は、startActivityメソッドに渡すインテ ントにフラグの設定を記載する必要がある => taskAffinityを指定しても、フラグがなければ同一タスクとな る AndroidManifest.xml サンプルコード ・・・ <activity android:name=“TestActivity" android:taskAffinity=“jp.sample.test"></activity> ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-171
  172. 172. 4.1.アクティビティとタスク • インテントのフラグ – インテントのフラグはandroid.content.Intentに用意されている – Intent#setFlagsにフラグの値を渡せばよい – 別タスクで起動する場合は、startActivityメソッドに渡すインテ ントにフラグの設定を記載する必要がある – タスク関連のフラグは以下となる FLAG_ACTIVITY_NEW_TASK アフィニティに基づき新しいタスクを起動 FLAG_ACTIVITY_MULTIPLE_TASK 上記フラグと同時に用いて、多重に新しいタスクを起動 ・・・ Intent intent = new Intent(this, NextActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); ・・・ This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-172
  173. 173. 4.1.アクティビティとタスク – FLAG_ACTIVITY_NEW_TASK C:foo X:foo A:foo タス ク:foo B B:bar タス A:xxx ク:bar タス ク:foo X Y:bar X:foo A:foo タス ク:foo B:yyy タス X:xxx B:bar タス ク:bar タス B:yyy ク:foo A:foo タス Y:yyy B:yyy ク:foo タス ク:bar Y ク:bar C 新しく起動したアクティビティは、新しいタスクに配置されるが、 すでに同じアフィニティを持っているタスクがある場合は、 そのタスクに配置される。 This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-173
  174. 174. 4.1.アクティビティとタスク – FLAG_ACTIVITY_NEW_TASK C:bar A:foo タス ク:foo B B:bar タス A:xxx ク:bar タス ク:foo C C:bar B:bar タス A:xxx ク:bar タス B:bar タス A:xxx ク:bar タス ク:foo B ク:foo 但し、すでに同じアクティビティがタスクのルートアクティビティとして配置 されている場合は、新しいタスクは開始されず、そのアクティビティが存在 しているタスクがフォアグラウンドに移動する This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-174
  175. 175. 4.1.アクティビティとタスク – FLAG_ACTIVITY_MULTIPLE_TASK A:foo タス ク:foo B B:bar タス A:xxx ク:bar タス ク:foo C C:bar タス ク:bar B:bar タス A:xxx ク:bar タス ク:foo B:bar タス ク:bar タス B ク:bar B:bar タス A:xxx ク:bar タス ク:foo FLAG_ACTIVITY_NEW_TASKと共に指定すると、 同じアフィニティを持つタスクがすでに存在していても、新たにタスクが開始され This material is licensed under the Creative Commons License BY-NC-SA 4.0. Ⅰ-175

×