android hacks - 合宿インテント
DESCRIPTION
「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。http://www.oreilly.co.jp/books/9784873114569/TRANSCRIPT
ANDROIDHACKS#8 インテント入門 ( 合宿編 )担当:伊草 @M2
Twitter : @ginyutok
23/04/12
1
この資料について• この資料は下記の本をベースに勉強会で作成した資料です。
• 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)
• この本の紹介ページが下記にあります。
• http://www.oreilly.co.jp/books/9784873114569/
23/04/12
2
アジェンダ• インテントとは
• 明示的インテント• 暗黙的インテント
• インテントフィルタ
• インテントフィルタの記述方法• サンプルコードの説明
• Hack をさらに Hack する
• BroadcastIntent とは• BroadcastReceiver を使う
• おまけ
• Java コード内にインテントフィルタを記述する
23/04/12
3
1. インテントとは
23/04/12
4
1. インテントとは• アクティビティやアプリケーション間でのやりとりを行うた
めの仕組み
• 自アプリケーション内での画面遷移• 他アプリケーションとの連携
• 標準のブラウザ、メール、マップ、カメラの機能を使うとか
• インテントには種類がある• 明示的インテント• 暗黙的インテント
23/04/12
5
1-1. 明示的インテントとは• インテントにクラス名とパッケージ名を指定して、アクティ
ビティを起動する方法
• 例 ) IntentActivity.java ( 64 ページ)
・・・・・・・・・・・・・・・・・・・・・・・
10: public void onClick(View arg0) {
11: Intent intent = new Intent();
12: intent.setClassName("com.android.browser",
13: "com.android.browser.BrowserActivity");
14: startActivity(intent);
15: }
23/04/12
6
インテントインスタンスの生成
起動先のパッケージとクラス名の指
定インテントを引数に渡してアクティビティを
起動
1-2. 暗黙的インテントとは• インテントのパラメータから推測して、起動するアクティビ
ティを決定する方法
• 例 ) IntentActivity.java ( 65 ~ 66 ページ)
・・・・・・・・・・・・・・・・・・・・・・・
19: public void onClick(View arg0) {
20: Url url = Url.parse(“http://www.google.co.jp”);
21: Intent intent = new Intent();
22: intent.setAction(Intent.ACTION_VIEW);
23: intent.setData(url);
24: startActivity(intent);
25: }23/04/12
7
データを表示するアクション
データをインテントにセット
どう使い分ける?• 自アプリ内の画面遷移は明示的インテント
• 他アプリを利用するときは暗黙的インテント
• どうしても純正アプリ使う場合は明示的インテントも OK ?
23/04/12
8
2. インテントフィルタ
23/04/12
9
2. インテントフィルタ• Android システムがインテントを受け取った際に、どのアク
ティビティを実行するかを決定するために用いられるフィルタ
• 例)データを表示したい
23/04/12
10
インテントデータhttp://
~
インテントフィ
ルタ
アクティビティ
メール表示アクティビティ
Web ブラウザ
アクティビティ
電話発信
・・・・・・・・・・・・
2.1 インテントフィルタの記述方法
• マニフェストファイル内に <intent-filter> タグを用いて記述 (一般的 )
• ACTION
• 実際に実行する内容• CATEGORY
• ACTION 属性をカテゴライズすることで絞り込む• DATA
• このアプリケーションが対応するデータ
• プログラム内に Intent Filter クラスを使って java コードに直接記述
23/04/12
11
2.2 サンプルコードの説明• 目的: URL を表示するだけのアクティビティ (IntentFilter)
を作成し、暗黙的 INTENT ボタンを押したときにブラウザとIntentFilter を選択させるようにする
23/04/12
12IntentActivity IntentFilter
2.2 サンプルコードの説明• AndroidManifest.xml ( 68 ページ)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
6: <activity android:name=".IntentActivity“
android:label="@string/app_name">
7: <intent-filter>
8: <action android:name="android.intent.action.MAIN" />
9: <category
android:name="android.intent.category.LAUNCHER" />
10: </intent-filter>
11: </activity>23/04/12
13
IntentActivityについての記
述
アプリ起動時に立ち上がることを示す
Andorid のシステムランチャーに表示されることを示す
2.2 サンプルコードの説明
つづき
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
12: <activity android:name=".FilterActivity“
android:label="@string/app_name">
13: <intent-filter>
14: <action android:name="android.intent.action.VIEW" />
15: <category android:name="android.intent.category.DEFAULT" />
16: <category android:name="android.intent.category.BROWSABLE" />
17: <data android:scheme="http" />
18: </intent-filter>
19: </activity>
23/04/12
14
FilterActivityについての記
述
データを表示するアクショ
ン
ブラウザから起動可能であることを
示す受け取ったデータが http であるとき
に起動
2.2 サンプルコードの補足• category.DEFAULT は暗黙的インテントを受け取る場
合は必ず記述しなくてはならない• その Activity に遷移できなくなる• 例外
• 明示的インテントを受け取る場合• ACTION.MAIN と Category.LAUNCHER の組み合わせ
23/04/12
15
3. Hack をさらに Hack する
23/04/12
16
3.1 BroadcastIntent とは• システムが発行するインテント
• 例:• 端末の起動・終了• バッテリー残量• 電話やメールの着信
• BroadcastIntent を利用したい場合、 BroadcastReceiver を実装する必要がある
23/04/12
17
3.2 BroadcastReceiverを使う• 起動時に IntentActivity が立ち上がるようにする
• 起動完了を知らせる BOOT_COMPLETED アクションを受け取る BrroadcastReceiver を実装( 70 ページ)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
1: public class BootReceiver extends BroadcastReceiver {
2: @Override
3: public void onReceive(Context context, Intent rIntent) {
4: Intent intent=new Intent(context,IntentActivity.class);
5: intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
6: context.startActivity(intent);
7: }
8: }23/04/12
18
アクティビティ以外からアクティビティを起動する場合に必要
3.2 BroadcastReceiverを使う
• マニフェストファイルにレシーバを登録( 71 ページ)
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
23/04/12
19
おまけ
23/04/12
20
2.1 インテントフィルタの記述方法
• マニフェストファイル内に <intent-filter> タグを用いて記述 (一般的 )
• ACTION
• 実際に実行する内容• CATEGORY
• ACTION 属性をカテゴライズすることで絞り込む• DATA
• このアプリケーションが対応するデータ
• プログラム内に Intent Filter クラスを使って java コードに直接記述
23/04/12
21
Java コード内での Intent Filter の書き方( 例 )
@IT Android で動く携帯 Java アプリ作成入門( 7 )
常駐アプリが作成できる Android の“サービス”とは
http://www.atmarkit.co.jp/fsmart/articles/android07/android07_2.html
23/04/12
22
Java コード内での Intent Filter の書き方(Main.java)
36: private final KitchenTimerReceiver receiver
= new KitchenTimerReceiver();
(略)
78: IntentFilter filter
= new IntentFilter(KitchenTimerService.ACTION);
79: registerReceiver(receiver, filter);
23/04/12
23
BroadcastReceiver を継承したクラス
指定した ACTION をフィルタとした IntentFilter インスタンスを
生成レシーバとフィルタを設定
Java コード内での Intent Filter の書き方• あとから ACTION や CATEGORY や DATA を追加できます
• addAction(String action)• addCategory(String category)• addDataScheme(String scheme)
23/04/12
24
使い道は?• 動的にインテントフィルタの内容を決定したい時
• よっぽどのことがない限りはマニフェストファイルに書いたほうが簡単だと思われる
23/04/12
25
補足事項@pfkawara さんのパワポをコピペして枚数を稼ぐだけの簡単なお仕事です!!
23/04/12
26
参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 1
23/04/12
27
Intent クラスの定数名 説明 実際の文字列
ACTION_MAIN アプリケーション起動時のアクションです。通常は、エントリポイントとなるアクティビティに対して設定します。
“android.intent.action.MAIN”
ACTION_VIEW データをユーザーに表示するアクションです。 “android.intent.action.VIEW”
ACTION_DEFAULT ACTION_VIEW の別名です。 “android.intent.action.VIEW”
ACTION_INSERT 空の要素を新たに作成することを示すアクションです。
“android.intent.action.INSERT”
ACTION_EDIT 与えられたデータに対して変更を加えることを示すアクションです。
“android.intent.action.EDIT”
ACTION_DELETE データを削除することを示すアクションです。 “android.intent.action.DELETE”
ACTION_ATTACH_DATA 当該データを他のデータに添付することを示すアクションです。 ( コンタクトに画像を添付するなど。 )
“android.intent.action.ATTACH_DATA”
ACTION_PICK_ACTIVITY 与えられたインテントからアクティビティを選択し、そのクラスを返すことを示すアクションです。
“android.intent.action.PICK_ACTIVITY”
参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 2
23/04/12
28
Intent クラスの定数名 説明 実際の文字列
ACTION_PICK データの中から一見選択し、その情報を取得するアクションです。
“android.intent.action.PICK”
ACTION_GET_CONTENT 任意の一件のデータを取得するアクションです。ACTION_PICK との違いは送信元のアクティビティが希望するデータの種類をユーザーに対して示す点です。
“android.intent.action.GET_CONTENT”
ACTION_CHOOSER ユーザーにアクティビティを選択させることを示すアクションです。
“android.intent.action.CHOOSER”
ACTION_RUN データを実行するアクション全般を指します。 “android.intent.action.RUN”
ACTION_SYNC データの同期を行うことを示すアクションです。 “android.intent.action.SYNC”
ACTION_CALL 与えられたデータを元に電話をかけるアクションです。セキュリティ上、 ACTION_DIAL のみしか許されないこともあります。
“android.intent.action.CALL”
参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 3
• 出典:「 Google アンドロイド Android プログラミング入門」 p.105
23/04/12
29
Intent クラスの定数名 説明 実際の文字列
ACTION_DIAL 電話をかける画面を表示するアクションです。実際に電話はかけません。
“android.intent.action.DIAL”
ACTION_SEND テキストやデータストリームを他のオブジェクトへ渡すアクションです。
“android.intent.action.SEND”
ACTION_SENDTO 与えられたデータを元にメッセージを贈るアクションです。
“android.intent.action.SENDTO”
ACTION_ANSWER 電話の呼び出しがあったときにそれをハンドルするアクションです。
“android.intent.action.ANSWER”
参考 ( ブロードキャストアクション )
• インテントがブロードキャストされるときのアクションの一覧その 1
23/04/12
30
Intent クラスの定数名 説明 実際の文字列
ACTION_BATTERY_CHANGED
充電中かどうかや、電池残量の状態が変わったときに送られるアクションです。
“android.intent.action.BATTERY_CHANGED”
ACTION_BATTERY_LOW 電池残量が残り少なくなったことを示すアクションです。
“android.intent.action.BATTERY_LOW”
ACTION_BOOT_COMPLETED
システムの起動が完了したことを示すアクションです。
“android.intent.action.BOOT_COMPLETED”
ACTION_PACKAGE_ADDED
新しいアプリケーションパッケージが追加されたことを示すアクションです。
“android.intent.action.PACKAGE_ADDED”
ACTION_PACKAGE_CHANGED
存在するアプリケーションパッケージが変更されたことを示すアクションです。
“android.intent.action.PACKAGE_CHANGED”
ACTION_PACKAGE_REMOVED
アプリケーションパッケージが削除されたことを示すアクションです。
“android.intent.action.PACKAGE_REMOVED”
参考 ( ブロードキャストアクション )
• インテントがブロードキャストされるときのアクションの一覧その 2
• 出典:「Google アンドロイド Android プログラミング入門」 p.106
23/04/12
31
Intent クラスの定数名 説明 実際の文字列
ACTION_TIMEZONE_CHANGED
タイムゾーンが変更されたことを示すアクションです。
“android.intent.action.TIMEZONE_CHANGED”
ACTION_TIME_CHANGED
時刻がセットされたっことを示すアクションです。
“android.intent.action.TIME_SET”
ACTION_TIME_TICK 現在時刻が変わったときに、毎分送られるアクションです(このアクションに応答するには、プログラム内でのハードコーディングが必要です。マニフェストファイルでの定義はできません)。
“android.intent.action.TIME_TICK”
ACTION_HEADSET_PLUG
ハンドっセットのプラグが抜き差しされたことを示すアクションです。
“android.intent.action.HEADSET_PLUG”
参考 ( カテゴリ )
• インテントフィルタでアクションと共に使用するカテゴリの一覧
• 出典:「Google アンドロイド Android プログラミング入門」 p.107
23/04/12
32
Intent クラスの定数名 説明 実際の文字列
CATEGORY_DEFAULT 標準のカテゴリです。 “android.intent.category.DEFAULT”
CATEGORY_BROWSABLE ブラウザから起動可能なことを示すカテゴリです。
“android.intent.category.BROWSABLE”
CATEGORY_ALTERNATIVE ユーザーが現在参照しているデータに対する代替手段を提供できることを示すカテゴリです。
“android.intent.category.ALTERNATIVE”
CATEGORY_SELECTED_ALTERNATIVE
ユーザーが選択したデータに対する代替手段を提供できることを示すカテゴリです。
“android.intent.category.SELECTED_ALTERNATIVE”
CATEGORY_HOME デバイスが起動されたときに一番最後に起動されるものであることを示すカテゴリです。
“android.intent.category.HOME”
CATEGORY_LAUNCHER トップレベルのランチャーに表示されるものであることを示すカテゴリです。
“android.intent.category.LAUNCHER”
CATEGORY_TAB TabActivity の中のタブであることを示すカテゴリです。
“android.intent.category.TAB”
参考 URL• Android Developers
• http://developer.android.com/intl/ja/index.html
23/04/12
33