Android SDK WG 第2回 セッション(2008/11/29) Intent

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
わんくま同盟 東京勉強会 #10 オブジェクト指向 #1 Windows メッセージを使いこな す -Windows 流オブジェクト指向 - とっちゃん 高萩 俊行 Microsoft MVP for Windows SDK 2005/ /09.
だい六か – クリスマスとお正月 ぶんぽう. て form review ► Group 1 Verbs ► Have two or more ひらがな in the verb stem AND ► The final sound of the verb stem is from the い row.
オブジェクト指向プログラミング(4) 静的分析(2)
読んだもの P0254R0: Integrating std::string_view and std::string およびその関連スレッド 稲葉 一浩.
アルゴリズムとデータ構造 2013年6月18日
Ex7. Search for Vacuum Problem
Ex8. Search for Vacuum Problem(2)
WebサービスII (第10回) 2007年11月28日 植田龍男.
Servlet J2EE I 第8回 /
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとデータ構造 2012年6月14日
CHAPTER1 UMLとオブジェクト指向の基本概念(2)
Delphi Day ~Delphi 概要、および新バージョンのご紹介~
WebサービスII (第8回) 2007年11月14日 植田龍男.
社会人学習講座 「Javaプログラミング概論」
第20章 Flyweight ~同じものを共有して無駄をなくす~
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
アルゴリズムとデータ構造 2011年6月14日
UML入門 UML PRESS vol.1 より 時松誠治 2003年5月19日.
アルゴリズムとデータ構造 2011年6月20日
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
C言語講座 第3回 ポインタ、配列.
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
日本Androidの会 事務局長 SIPropプロジェクト 代表 グロースエクスパートナーズ 今村 謙之(いまむら のりつな)
暗黙的に型付けされる構造体の Java言語への導入
第3回 2007年4月27日 応用Java (Java/XML).
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
WEBアプリケーションの開発 2002年度春学期 大岩研究会2.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
Ex7. Search for Vacuum Problem
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
アルゴリズムとプログラミング (Algorithms and Programming)
日本Androidの会 SDKワーキンググループ
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
Webアプリケーションと JSPの基本 ソフトウェア特論 第4回.
C#プログラミング実習 第3回.
ASP.NET 2.0による Webサービスの構築 2008年10月18日 こくぶんまさひろ.
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
サブゼミ第7回 実装編① オブジェクト型とキャスト.
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年6月15日
JAVA入門⑥ クラスとインスタンス.
ASP.NET 2.0による Webサービスの構築 2008年10月18日 こくぶんまさひろ.
How To WPF アプリケーション Part4 By 中博俊.
アルゴリズムとデータ構造 2012年6月21日
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
7.アプリケーションの連携 7-1 インテント(intent) 1.アプリケーションの連携とは
7-3 サービスの連携 1.サービスとは 画面を持たずに処理を行う【AndroidManifest.xmlへの追加】 …
System.AddInを利用したアプリケーション拡張 - アドインの開発 -
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

Android SDK WG 第2回 セッション(2008/11/29) Intent 江川 崇 ©Japan Android Group, 2008

IntentのJavaDocを見てみましょう URLはこちら http://code.google.com/android/reference/android/content/Intent.html

An intent is an abstract description of an operation to be performed. JavaDocの冒頭 An intent is an abstract description of an operation to be performed. Intentとは実行される操作の抽象的な単位です。

JavaDocの冒頭 It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent, Bundle) or bindService(Intent, String, ServiceConnection, int) to communicate with a background Service. It(Intent)は、アクティビティを起動するためにstartActivityで使われますし、broadcastIntentであらゆるBroadcastReceiverコンポーネントに対して送られます。また、startServiceや、bindServiceでバックグラウンドのサービスとコミュニケーションをとるために使われます。

前回のSDK WGのセッションで学んだこと どういうことか? 前回のSDK WGのセッションで学んだこと 一つのアクティビティ内のウィジェットやイベントは単一のスレッドで実行される Handlerドリブン、Looperでのループ ・・・が、サービスや他のアプリは、同一のスレッドではないし、プロセスも別な可能性あり

タイミングや仕組みを気にせずに、やってくれる仕組があればいいなあ どういうことか? やり取りする方法を開発者が作るとしたら? こいつは同じプロセスだけど別スレッドだから、プロセス領域に置かれる変数などで、スレッド間で共有する仕組みを使おう。 こいつはプロセスが別だから、プロセス間通信の仕組みを使って送ろう。あるいは、プロセス間で参照できるような共有メモリやセマフォなどを使ってやろう タイミングや仕組みを気にせずに、やってくれる仕組があればいいなあ

などは、各々固有のライフサイクルがある。 Intentは、これらを実行時にくっつける糊(のり)のような働きをする。  つまり アクティビティ サービス 他のアプリケーション  などは、各々固有のライフサイクルがある。  Intentは、これらを実行時にくっつける糊(のり)のような働きをする。

アプリケーションからはあくまでも「何をやりたいのか」を伝えるだけでよい Intentのいいところ アプリケーションからはあくまでも「何をやりたいのか」を伝えるだけでよい スレッド間やプロセス間でありがちな、同期や排他等をいちいち実装しなくてよい Intent = 「意図、意向」 仕組みの細部を意識することなくプロセス間通信が実現できる 「適切」な宛先に対して、「適切」なタイミングで送り届けられる

private String mAction; private Uri mData; private String mType; Intentの持つ属性 1809行目 private String mAction; private Uri mData; private String mType; private ComponentName mComponent; private int mFlags; private HashSet<String> mCategories; private Bundle mExtras;

private String mAction;  そのインテントが期待されている振舞いの分類  ・・・2種類ある。 Activity Action Activityを起動したいときに使うもの アノテーション@SdkConstantType.ACTIVITY_INTENT_ACTION Broadcast Action ブロードキャスト(全体周知)したいときに使うもの アノテーション@SdkConstantType.BROADCAST_INTENT_ACTION

Activity Action 例) Action ACTION_VIEW・・・「何らかの表示をしたい」とき  例) ACTION_VIEW・・・「何らかの表示をしたい」とき 558行目:public static final String ACTION_VIEW = “android.intent.action.VIEW”; 593行目:デフォルトはこれ ACTION_DIAL・・・「電話アプリ」を起動したいとき 851行目: public static final String ACTION_DIAL = "android.intent.action.DIAL"; という形で進める

Broadcast Action 例) Action ACTION_BOOT_COMPLETED ・・・システムの「起動が完了した」とき  例) ACTION_BOOT_COMPLETED ・・・システムの「起動が完了した」とき 1096行目: public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; ACTION_CONFIGURATION_CHANGED・・・コンフィグの状態が変わったとき 1162行目: public static final String ACTION_CONFIGURATION_CHANGED = "android.intent.action.CONFIGURATION_CHANGED"; という形で進める

private Uri mData; Uri このインテントの取り扱い方に関する情報 アクションと組み合わせて使うらしい  such as a person record in the contacts database  「連絡先データベースの人情報とか」 アクションと組み合わせて使うらしい ACTION_VIEW content://contacts/1 「識別子が1の人の情報を表示してほしい」 Dataと言っているが、具体的なコンテンツの中身ではないので注意

Uriクラス Uri RFC2396やRFC2732で規定されているURI表現を取り扱うことの出来るクラス URI表現の一般的な構成 標準のjava.net.URIのようなもの java.net.URLEncoderとかを使っている URI表現の一般的な構成 [スキーム:]スキーム固有部分[#フラグメント] ex) http://www.example.com/index.html#p2 content://foo/bar mailto:foo@example.com

Uri なんでこんなことしてるの? プロセスをまたがったやり取りを実現する技術要素は、多くの場合ハードウェアを超えて、ネットワーク上の他のコンポーネントに対してアクセスすることも想定している。 このようなケースでは、 宛先(あるいは情報のありか)の特定 操作(情報に対するI/Oなど)の表明 などを、ネットワーク上で使い勝手がよく一般に浸透しているURI表現で実現することが多い RESTはHTTPを使って操作を定義 dRubyの「druby://」

デバイス間Intentの廃止 でもちょっと問題が。。 原則として、Intentは同一デバイス内に限定 In the end, we determined that the Intent system, as designed for local use, did not lend itself well to being the vehicle for a Remote Procedure Call (RPC). Android Developers Blog 2008/8/25 Intentはローカルユースのために設計されており、RPCの伝達手段としては役に立たないものであると結論付けました。

Flags, Categories, Extras private int mFlags; Intentに対する特別な情報を持ったフラグ FLAG_*の定数参照 private HashSet<String> mCategories; アクションに対する追加情報(分類) IntentFilterなどを使う時にちょっと便利 private Bundle mExtras; アプリからの情報を出し入れできる入れ物 Bundleの66行目:   new HashMap<String, Object>()

private ComponentName mComponent; インテントの宛先のこと 明示的なインテント(Explicit Intents) Intent(Context packageContext, Class cls)や、setComponentメソッドなどによって、そのインテントを取り扱うコンポーネントを「明示的」に指定されたもの 宛先を特定する情報は他には要らない 暗黙的なインテント(Implicit Intents) 宛先のコンポーネントを指定されていないもの そのIntentを動かすにあたってどのコンポーネントが最適であるかを決定するための十分な情報が必要

StartActivityForResultを投げてみる 実際にIntentを投げてみる StartActivityForResultを投げてみる Activity#startActivityForResult → Instrumentation#execStartActivity 1418行目 → 1437行目で int result = ActivityManagerNative.getDefault() .startActivity(whoThread, intent, intent.resolveTypeIfNeeded(who.getContentResolver()), null, 0, token, target != null ? target.mEmbeddedID : null, requestCode, false, false); これは、ソース的には ActivityManagerNative#startActivity 979行目 が呼ばれている模様

ActivityManagerNative#startActivity :979行目 public int startActivity(IApplicationThread caller, Intent intent, ・・・) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeTypedArray(grantedUriPermissions, 0); data.writeInt(grantedMode); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(onlyIfNeeded ? 1 : 0); data.writeInt(debug ? 1 : 0); mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); reply.readException(); int result = reply.readInt(); reply.recycle(); data.recycle(); return result; }

ActivityManagerNative#broadcastIntent :1084行目 public int broadcastIntent(IApplicationThread caller, ・・・) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo != null ? resultTo.asBinder() : null); data.writeInt(resultCode); data.writeString(resultData); data.writeBundle(map); data.writeString(requiredPermission); data.writeInt(serialized ? 1 : 0); data.writeInt(sticky ? 1 : 0); mRemote.transact(BROADCAST_INTENT_TRANSACTION, data, reply, 0); reply.readException(); int res = reply.readInt(); reply.recycle(); data.recycle(); return res; }

Parcelのobtainメソッド:235行目 結局のところ オブジェクトをマーシャル、アンマーシャルして渡す仕組みだろう よくあるプロセス間通信の実装方式 Parcelからオブジェクトを出し入れしているだけ public static Parcel obtain() { final Parcel[] pool = sOwnedPool; synchronized (pool) { Parcel p; for (int i=0; i<POOL_SIZE; i++) { p = pool[i]; if (p != null) { pool[i] = null; if (DEBUG_RECYCLE) { p.mStack = new RuntimeException(); } return p; return new Parcel(0); Parcelのobtainメソッド:235行目

mRemoteは、android.os.IBinder 結局のところ mRemoteは、android.os.IBinder ServiceのときにBinderを実装すると思うが、それと同じノリ。Serviceを使えば理解が深まる。 Binderのtransactメソッドは同期 Parcelにマーシャルしたものを置くだけ broadcastでもアプリ側に制御はすぐ返ってくる BinderやParcelの中身や振る舞いをちゃんと理解すれば、腑に落ちると思う