33
ANDROID HACKS #8 イイイイイイイ ( イイイ ) イイ イイ @M2 Twitter : @ginyutok 22/06/10 1

Android Hacks - 合宿インテント

Embed Size (px)

DESCRIPTION

「Android Hacks ―プロが教えるテクニック & ツール」(株式会社ブリリアントサービス 著)を教材とした勉強会でのまとめ資料です。http://www.oreilly.co.jp/books/9784873114569/

Citation preview

Page 1: Android Hacks - 合宿インテント

ANDROIDHACKS#8 インテント入門 ( 合宿編 )担当:伊草 @M2

Twitter : @ginyutok

23/04/12

1

Page 2: Android Hacks - 合宿インテント

この資料について• この資料は下記の本をベースに勉強会で作成した資料です。

• 『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊)

• この本の紹介ページが下記にあります。

• http://www.oreilly.co.jp/books/9784873114569/

23/04/12

2

Page 3: Android Hacks - 合宿インテント

アジェンダ• インテントとは

• 明示的インテント• 暗黙的インテント

• インテントフィルタ

• インテントフィルタの記述方法• サンプルコードの説明

• Hack をさらに Hack する

• BroadcastIntent とは• BroadcastReceiver を使う

• おまけ

• Java コード内にインテントフィルタを記述する

23/04/12

3

Page 4: Android Hacks - 合宿インテント

1. インテントとは

23/04/12

4

Page 5: Android Hacks - 合宿インテント

1. インテントとは• アクティビティやアプリケーション間でのやりとりを行うた

めの仕組み

• 自アプリケーション内での画面遷移• 他アプリケーションとの連携

• 標準のブラウザ、メール、マップ、カメラの機能を使うとか

• インテントには種類がある• 明示的インテント• 暗黙的インテント

23/04/12

5

Page 6: Android Hacks - 合宿インテント

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

インテントインスタンスの生成

起動先のパッケージとクラス名の指

定インテントを引数に渡してアクティビティを

起動

Page 7: Android Hacks - 合宿インテント

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

データを表示するアクション

データをインテントにセット

Page 8: Android Hacks - 合宿インテント

どう使い分ける?• 自アプリ内の画面遷移は明示的インテント

• 他アプリを利用するときは暗黙的インテント

• どうしても純正アプリ使う場合は明示的インテントも OK ?

23/04/12

8

Page 9: Android Hacks - 合宿インテント

2. インテントフィルタ

23/04/12

9

Page 10: Android Hacks - 合宿インテント

2. インテントフィルタ• Android システムがインテントを受け取った際に、どのアク

ティビティを実行するかを決定するために用いられるフィルタ

• 例)データを表示したい

23/04/12

10

インテントデータhttp://

インテントフィ

ルタ

アクティビティ

メール表示アクティビティ

Web ブラウザ

アクティビティ

電話発信

・・・・・・・・・・・・

Page 11: Android Hacks - 合宿インテント

2.1 インテントフィルタの記述方法

• マニフェストファイル内に <intent-filter> タグを用いて記述 (一般的 )

• ACTION

• 実際に実行する内容• CATEGORY

• ACTION 属性をカテゴライズすることで絞り込む• DATA

• このアプリケーションが対応するデータ

• プログラム内に Intent Filter クラスを使って java コードに直接記述

23/04/12

11

Page 12: Android Hacks - 合宿インテント

2.2 サンプルコードの説明• 目的: URL を表示するだけのアクティビティ (IntentFilter)

を作成し、暗黙的 INTENT ボタンを押したときにブラウザとIntentFilter を選択させるようにする

23/04/12

12IntentActivity IntentFilter

Page 13: Android Hacks - 合宿インテント

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 のシステムランチャーに表示されることを示す

Page 14: Android Hacks - 合宿インテント

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 であるとき

に起動

Page 15: Android Hacks - 合宿インテント

2.2 サンプルコードの補足• category.DEFAULT は暗黙的インテントを受け取る場

合は必ず記述しなくてはならない• その Activity に遷移できなくなる• 例外

• 明示的インテントを受け取る場合• ACTION.MAIN と Category.LAUNCHER の組み合わせ

23/04/12

15

Page 16: Android Hacks - 合宿インテント

3. Hack をさらに Hack する

23/04/12

16

Page 17: Android Hacks - 合宿インテント

3.1 BroadcastIntent とは• システムが発行するインテント

• 例:• 端末の起動・終了• バッテリー残量• 電話やメールの着信

• BroadcastIntent を利用したい場合、 BroadcastReceiver を実装する必要がある

23/04/12

17

Page 18: Android Hacks - 合宿インテント

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

アクティビティ以外からアクティビティを起動する場合に必要

Page 19: Android Hacks - 合宿インテント

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

Page 20: Android Hacks - 合宿インテント

おまけ

23/04/12

20

Page 21: Android Hacks - 合宿インテント

2.1 インテントフィルタの記述方法

• マニフェストファイル内に <intent-filter> タグを用いて記述 (一般的 )

• ACTION

• 実際に実行する内容• CATEGORY

• ACTION 属性をカテゴライズすることで絞り込む• DATA

• このアプリケーションが対応するデータ

• プログラム内に Intent Filter クラスを使って java コードに直接記述

23/04/12

21

Page 22: Android Hacks - 合宿インテント

Java コード内での Intent Filter の書き方( 例 )

@IT Android で動く携帯 Java アプリ作成入門( 7 )

常駐アプリが作成できる Android の“サービス”とは

http://www.atmarkit.co.jp/fsmart/articles/android07/android07_2.html

23/04/12

22

Page 23: Android Hacks - 合宿インテント

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 インスタンスを

生成レシーバとフィルタを設定

Page 24: Android Hacks - 合宿インテント

Java コード内での Intent Filter の書き方• あとから ACTION や CATEGORY や DATA を追加できます

• addAction(String action)• addCategory(String category)• addDataScheme(String scheme)

23/04/12

24

Page 25: Android Hacks - 合宿インテント

使い道は?• 動的にインテントフィルタの内容を決定したい時

• よっぽどのことがない限りはマニフェストファイルに書いたほうが簡単だと思われる

23/04/12

25

Page 26: Android Hacks - 合宿インテント

補足事項@pfkawara さんのパワポをコピペして枚数を稼ぐだけの簡単なお仕事です!!

23/04/12

26

Page 27: Android Hacks - 合宿インテント

参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 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”

Page 28: Android Hacks - 合宿インテント

参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 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”

Page 29: Android Hacks - 合宿インテント

参考 ( アクティビティアクション )• アクティビティ起動時に指定するアクションの一覧その 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”

Page 30: Android Hacks - 合宿インテント

参考 ( ブロードキャストアクション )

• インテントがブロードキャストされるときのアクションの一覧その 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”

Page 31: Android Hacks - 合宿インテント

参考 ( ブロードキャストアクション )

• インテントがブロードキャストされるときのアクションの一覧その 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”

Page 32: Android Hacks - 合宿インテント

参考 ( カテゴリ )

• インテントフィルタでアクションと共に使用するカテゴリの一覧

• 出典:「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”

Page 33: Android Hacks - 合宿インテント

参考 URL• Android Developers

• http://developer.android.com/intl/ja/index.html

23/04/12

33