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 Hacks - 合宿インテント

4,351 views

Published on

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

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

Published in: Technology
  • Be the first to comment

Android Hacks - 合宿インテント

  1. 1. ANDROID HACKS #8 インテント入門 ( 合宿編 ) 担当:伊草 @M2 Twitter : @ginyutok 09/19/11
  2. 2. この資料について <ul><li>この資料は下記の本をベースに勉強会で作成した資料です。 </li></ul><ul><ul><li>『 Android Hacks 』(株式会社ブリリアントサービス著、オライリー・ジャパン刊) </li></ul></ul><ul><li>この本の紹介ページが下記にあります。 </li></ul><ul><ul><li>http://www.oreilly.co.jp/books/9784873114569/ </li></ul></ul>09/19/11
  3. 3. アジェンダ <ul><li>インテントとは </li></ul><ul><ul><li>明示的インテント </li></ul></ul><ul><ul><li>暗黙的インテント </li></ul></ul><ul><li>インテントフィルタ </li></ul><ul><ul><li>インテントフィルタの記述方法 </li></ul></ul><ul><ul><li>サンプルコードの説明 </li></ul></ul><ul><li>Hack をさらに Hack する </li></ul><ul><ul><li>BroadcastIntent とは </li></ul></ul><ul><ul><li>BroadcastReceiver を使う </li></ul></ul><ul><li>おまけ </li></ul><ul><ul><li>Java コード内にインテントフィルタを記述する </li></ul></ul>09/19/11
  4. 4. 1. インテントとは 09/19/11
  5. 5. 1. インテントとは <ul><li>アクティビティやアプリケーション間でのやりとりを行うための仕組み </li></ul><ul><ul><li>自アプリケーション内での画面遷移 </li></ul></ul><ul><ul><li>他アプリケーションとの連携 </li></ul></ul><ul><ul><ul><li>標準のブラウザ、メール、マップ、カメラの機能を使うとか </li></ul></ul></ul><ul><ul><li>インテントには種類がある </li></ul></ul><ul><ul><ul><li>明示的インテント </li></ul></ul></ul><ul><ul><ul><li>暗黙的インテント </li></ul></ul></ul>09/19/11
  6. 6. 1-1. 明示的インテントとは <ul><li>インテントに クラス名とパッケージ名を指定 して、アクティビティを起動する方法 </li></ul><ul><li>例 ) IntentActivity.java ( 64 ページ) </li></ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・ </li></ul><ul><li>10: public void onClick(View arg0) { </li></ul><ul><li>11: Intent intent = new Intent(); </li></ul><ul><li>12: intent.setClassName(&quot;com.android.browser&quot;, </li></ul><ul><li>13: &quot;com.android.browser.BrowserActivity&quot;); </li></ul><ul><li>14: startActivity(intent); </li></ul><ul><li>15: } </li></ul>09/19/11 インテントインスタンスの生成 起動先のパッケージとクラス名の指定 インテントを引数に渡してアクティビティを起動
  7. 7. 1-2. 暗黙的インテントとは <ul><li>インテントの パラメータから推測 して、起動するアクティビティを決定する方法 </li></ul><ul><li>例 ) IntentActivity.java ( 65 ~ 66 ページ) </li></ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・ </li></ul><ul><li>19: public void onClick(View arg0) { </li></ul><ul><li>20: Url url = Url.parse(“http://www.google.co.jp”); </li></ul><ul><li>21: Intent intent = new Intent(); </li></ul><ul><li>22: intent.setAction(Intent.ACTION_VIEW); </li></ul><ul><li>23: intent.setData(url); </li></ul><ul><li>24: startActivity(intent); </li></ul><ul><li>25: } </li></ul>09/19/11 データを表示するアクション データをインテントにセット
  8. 8. どう使い分ける? <ul><li>自アプリ内の画面遷移は明示的インテント </li></ul><ul><li>他アプリを利用するときは暗黙的インテント </li></ul><ul><ul><li>どうしても純正アプリ使う場合は明示的インテントも OK ? </li></ul></ul>09/19/11
  9. 9. 2. インテントフィルタ 09/19/11
  10. 10. 2. インテントフィルタ <ul><li>Android システムがインテントを受け取った際に、 どのアクティビティを実行するかを決定する ために用いられるフィルタ </li></ul><ul><li>例)データを表示したい </li></ul>09/19/11 インテント データ http:// ~ インテントフィルタ アクティビティ メール表示 アクティビティ Web ブラウザ アクティビティ 電話発信 ・・・・・・・・・・・・
  11. 11. 2.1 インテントフィルタの記述方法 <ul><ul><li>マニフェストファイル内に <intent-filter> タグを用いて記述 ( 一般的 ) </li></ul></ul><ul><ul><ul><li>ACTION </li></ul></ul></ul><ul><ul><ul><ul><li>実際に実行する内容 </li></ul></ul></ul></ul><ul><ul><ul><li>CATEGORY </li></ul></ul></ul><ul><ul><ul><ul><li>ACTION 属性をカテゴライズすることで絞り込む </li></ul></ul></ul></ul><ul><ul><ul><li>DATA </li></ul></ul></ul><ul><ul><ul><ul><li>このアプリケーションが対応するデータ </li></ul></ul></ul></ul><ul><ul><li>プログラム内に Intent Filter クラスを使って java コードに直接記述 </li></ul></ul>09/19/11
  12. 12. 2.2 サンプルコードの説明 <ul><li>目的: URL を表示するだけのアクティビティ (IntentFilter) を作成し、暗黙的 INTENT ボタンを押したときにブラウザと IntentFilter を選択させるようにする </li></ul>09/19/11 IntentActivity IntentFilter
  13. 13. 2.2 サンプルコードの説明 <ul><li>AndroidManifest.xml ( 68 ページ) </li></ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ </li></ul><ul><li>6: <activity android:name= &quot;.IntentActivity“ </li></ul><ul><li>android:label=&quot;@string/app_name&quot;> </li></ul><ul><li>7: <intent-filter> </li></ul><ul><li>8: < action android:name= &quot;android.intent. action.MAIN &quot; /> </li></ul><ul><li>9: < category </li></ul><ul><li>android:name= &quot;android.intent. category.LAUNCHER &quot; /> </li></ul><ul><li>10: </intent-filter> </li></ul><ul><li>11: </activity> </li></ul>09/19/11 IntentActivity についての記述 アプリ起動時に立ち上がることを示す Andorid のシステムランチャーに表示されることを示す
  14. 14. 2.2 サンプルコードの説明 <ul><li>つづき </li></ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ </li></ul><ul><li>12: <activity android:name= &quot;.FilterActivity“ </li></ul><ul><li>android:label=&quot;@string/app_name&quot;> </li></ul><ul><li>13: <intent-filter> </li></ul><ul><li>14: < action android:name= &quot;android.intent. action.VIEW &quot; /> </li></ul><ul><li>15: < category android:name= &quot;android.intent. category.DEFAULT &quot; /> </li></ul><ul><li>16: < category android:name= &quot;android.intent. category.BROWSABLE &quot; /> </li></ul><ul><li>17: < data android:scheme= &quot;http&quot; /> </li></ul><ul><li>18: </intent-filter> </li></ul><ul><li>19: </activity> </li></ul>09/19/11 FilterActivity についての記述 データを表示するアクション ブラウザから起動可能であることを示す 受け取ったデータが http であるときに起動
  15. 15. 2.2 サンプルコードの補足 <ul><li>category.DEFAULT は 暗黙的インテントを受け取る場合は 必ず記述 しなくてはならない </li></ul><ul><ul><li>その Activity に遷移できなくなる </li></ul></ul><ul><ul><li>例外 </li></ul></ul><ul><ul><ul><li>明示的インテントを受け取る場合 </li></ul></ul></ul><ul><ul><ul><li>ACTION.MAIN と Category.LAUNCHER の組み合わせ </li></ul></ul></ul>09/19/11
  16. 16. 3. Hack をさらに Hack する 09/19/11
  17. 17. 3.1 BroadcastIntent とは <ul><li>システムが発行するインテント </li></ul><ul><ul><li>例: </li></ul></ul><ul><ul><ul><li>端末の起動・終了 </li></ul></ul></ul><ul><ul><ul><li>バッテリー残量 </li></ul></ul></ul><ul><ul><ul><li>電話やメールの着信 </li></ul></ul></ul><ul><li>BroadcastIntent を利用したい場合、 BroadcastReceiver を実装する必要がある </li></ul>09/19/11
  18. 18. 3.2 BroadcastReceiver を使う <ul><li>起動時に IntentActivity が立ち上がるようにする </li></ul><ul><ul><li>起動完了を知らせる BOOT_COMPLETED アクションを受け取る BrroadcastReceiver を実装( 70 ページ) </li></ul></ul><ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ </li></ul></ul><ul><li>1: public class BootReceiver extends BroadcastReceiver { </li></ul><ul><li>2: @Override </li></ul><ul><li>3: public void onReceive(Context context, Intent rIntent) { </li></ul><ul><li>4: Intent intent=new Intent(context,IntentActivity.class); </li></ul><ul><li>5: intent.addFlags(Intent. FLAG_ACTIVITY_NEW_TASK); </li></ul><ul><li>6: context.startActivity(intent); </li></ul><ul><li>7: } </li></ul><ul><li>8: } </li></ul>09/19/11 アクティビティ以外からアクティビティを起動する場合に必要
  19. 19. 3.2 BroadcastReceiver を使う <ul><li>マニフェストファイルにレシーバを登録( 71 ページ) </li></ul><ul><li>・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ </li></ul><ul><li><receiver android:name=&quot;.BootReceiver&quot;> </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name=&quot;android.intent.action.BOOT_COMPLETED&quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li></receiver> </li></ul>09/19/11
  20. 20. おまけ 09/19/11
  21. 21. 2.1 インテントフィルタの記述方法 <ul><ul><li>マニフェストファイル内に <intent-filter> タグを用いて記述 ( 一般的 ) </li></ul></ul><ul><ul><ul><li>ACTION </li></ul></ul></ul><ul><ul><ul><ul><li>実際に実行する内容 </li></ul></ul></ul></ul><ul><ul><ul><li>CATEGORY </li></ul></ul></ul><ul><ul><ul><ul><li>ACTION 属性をカテゴライズすることで絞り込む </li></ul></ul></ul></ul><ul><ul><ul><li>DATA </li></ul></ul></ul><ul><ul><ul><ul><li>このアプリケーションが対応するデータ </li></ul></ul></ul></ul><ul><ul><li>プログラム内に Intent Filter クラスを使って java コードに直接記述 </li></ul></ul>09/19/11
  22. 22. Java コード内での Intent Filter の書き方 <ul><li>( 例 ) </li></ul><ul><li>@IT Android で動く携帯 Java アプリ作成入門( 7 ) </li></ul><ul><li>常駐アプリが作成できる Android の“サービス”とは </li></ul><ul><li>http://www.atmarkit.co.jp/fsmart/articles/android07/android07_2.html </li></ul>09/19/11
  23. 23. Java コード内での Intent Filter の書き方 <ul><li>(Main.java) </li></ul><ul><li>36: private final KitchenTimerReceiver receiver </li></ul><ul><li>= new KitchenTimerReceiver(); </li></ul><ul><li>     (略) </li></ul><ul><li>78: IntentFilter filter </li></ul><ul><li>= new IntentFilter (KitchenTimerService. ACTION); </li></ul><ul><li>79: registerReceiver (receiver, filter); </li></ul>09/19/11 BroadcastReceiver を継承したクラス 指定した ACTION をフィルタとした IntentFilter インスタンスを生成 レシーバとフィルタを設定
  24. 24. Java コード内での Intent Filter の書き方 <ul><li>あとから ACTION や CATEGORY や DATA を追加できます </li></ul><ul><ul><li>addAction(String action) </li></ul></ul><ul><ul><li>addCategory(String category) </li></ul></ul><ul><ul><li>addDataS cheme (String scheme) </li></ul></ul>09/19/11
  25. 25. 使い道は? <ul><li>動的にインテントフィルタの内容を決定したい時 </li></ul><ul><li>よっぽどのことがない限りはマニフェストファイルに書いたほうが簡単だと思われる </li></ul>09/19/11
  26. 26. 補足事項 @ pfkawara さんのパワポをコピペして枚数を稼ぐだけの 簡単なお仕事です!! 09/19/11
  27. 27. 参考 ( アクティビティアクション ) <ul><li>アクティビティ起動時に指定するアクションの一覧その 1 </li></ul>09/19/11 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”
  28. 28. 参考 ( アクティビティアクション ) <ul><li>アクティビティ起動時に指定するアクションの一覧その 2 </li></ul>09/19/11 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”
  29. 29. 参考 ( アクティビティアクション ) <ul><li>アクティビティ起動時に指定するアクションの一覧その 3 </li></ul><ul><li>出典:「 Google アンドロイド Android プログラミング入門」 p.105 </li></ul>09/19/11 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”
  30. 30. 参考 ( ブロードキャストアクション ) <ul><li>インテントがブロードキャストされるときのアクションの一覧その 1 </li></ul>09/19/11 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”
  31. 31. 参考 ( ブロードキャストアクション ) <ul><li>インテントがブロードキャストされるときのアクションの一覧その 2 </li></ul><ul><li>出典:「 Google アンドロイド Android プログラミング入門」 p.106 </li></ul>09/19/11 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”
  32. 32. 参考 ( カテゴリ ) <ul><li>インテントフィルタでアクションと共に使用するカテゴリの一覧 </li></ul><ul><li>出典:「 Google アンドロイド Android プログラミング入門」 p.107 </li></ul>09/19/11 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”
  33. 33. 参考 URL <ul><li>Android Developers </li></ul><ul><ul><li>http://developer.android.com/intl/ja/index.html </li></ul></ul>09/19/11

×