android独学日記(三)---Intent

10946 ワード

Intentとは?
Androidの4分の3のコンポーネントタイプ(activitie、service、broadcast receiver)はintentによってアクティブ化されます.Intentは、同じアプリケーション内または他のアプリケーションのコンポーネントにかかわらず、異なる独立したコンポーネントを実行期間にバインドします(他のコンポーネントから動作を要求するメッセージとして使用できます).だからIntentは橋梁でandroidの各コンポーネントを接続しています.
Intentを表示:
Intentを使用するには、まずIntentを作成する必要があるオブジェクトです.
 Intent intent = new Intent();

Intentは、ターゲットコンポーネントを指定するためのいくつかのコンストラクタを提供しています.Intentを表示します.名前の通り、intentが接続するターゲットを表示して指定します.
Intent intent = new Intent(Context packageContext, Class<?> cls);

最初のパラメータContextは、プログラムがどこで起動するかを示すコンテキストです.
PS:Contextは抽象ベースクラスであり、現在のパッケージのリソース(getResources、getAssets)にアクセスし、他のコンポーネント(Activity、Service、Broadcast)を起動し、さまざまなサービス(getSystemService)を得ることができます.Contextはアプリケーションの実行環境を提供し、Contextの大環境では、アプリケーションがリソースにアクセスしてこそ、他のコンポーネント、サービスとのインタラクションを完了することができ、Contextは基本的な機能インタフェースを定義し、規範と理解することができ、ActivityとServiceはこの規範を実装するサブクラスである.
2番目のパラメータは、ターゲットクラス、すなわち、どのクラス(Activity、Service、BroadcastReceiver)を起動したいかです.
Intentは単なる「意図」なので、具体的な方法に合わせてこの意図を実現する必要があります.
コンポーネント
きどうモード
Activity
startActivity(Intent intent)
startActivityForResult(Intent intent,int requestCode)
Service
startService(Intent service)
bindService(Intent service, …)
BroadcastReceiver
sendBroadcast(Intent service)
sendBroadcast(Intent intent, String receiverPermission)
sendOrderdBroadcast(Intent intent, …)
sendStickyBroadcast(Intent intent)
sendStickyOrderBroadcast(Intent intent, …)
暗黙のIntent:
暗黙的なIntentは、起動したいコンポーネントを明確に指定していないが、満たす条件を指定しているだけで、条件を満たすコンポーネントは起動することができる.
Intent intent = new Intent(String action);

このコンストラクタのactionは、指定された条件(他の属性で条件を指定できます.以下を参照)であり、任意の文字列であってもよいが、一般的には「パッケージ名.intent.action.指定された定数」を指定条件として使用する.
条件があれば、コンポーネントがその条件を満たしているかどうかをどのように知ることができますか?AndroidManifestでxmlプロファイルにコンポーネントを登録する場合はintent-filterプロパティに明記すればいいです.
       <intent-filter>
              <action android:name="String action"/>
              <category  android:name="android.intent.category.DEFAULT"/>
       </intent-filter>

暗黙的なIntentは、次のような他のプログラム内のコンポーネントを起動することもできます.
Intent intent = new Intent(intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        startActivity(intent);

ここでActivityでWebページを開き、アクセスできるのはhttp://www.baidu.com“.
データの転送:
Intentはデータを転送することもできます.intentにデータを入れるだけでいいです.intentは一連のデータを入れる方法を提供しています.
intent.putExtras(Bundle extras);//  Bundle    
intent.putExtra(String key,Type value);//          
intent.putSerializable(String key, Serializable
 value)//         

取り出すと同じように便利で、対応する方法もあります.
getIntent().getExtras();
getIntent().getStringExtra(String key);
getIntent().getSerializableExtra(String key);

その中のStringはint、charなどの他の基礎タイプのデータとすることができる.
Intentプロパティ:
Intentには、Component(コンポーネント名)、Action(アクション)、Category(タイプ)、Data(データ)、Type(タイプ)、Extra(拡張)、Flag(フラグ)の7つの属性があります.
Component(コンポーネント名)
前述したように、Intentで指定したターゲットコンポーネントをintentコンストラクタで直接指定することもできます.また、他の方法で指定することもできます.Componentプロパティは、次のコンストラクタで作成できるComponentNameオブジェクトを受け入れる必要があります.
ComponentName(String package, String class);
ComponentName(Context package, String class);
ComponentName(Context package, Class<?> cls);

この3つのコンストラクタの本質は同じであり、パッケージ名とクラス名を指定し、intentのsetComponent()メソッドを呼び出すと指定コンポーネントが完了する.このコンストラクタを使用しないで、intentは次の方法を直接呼び出してComponentプロパティを設定することもできます.
setClass(Context package, Class<?> cls);
setClassName(Context package, String className);
setClassName(String packageName, String className);

Action、Category
この2つの属性は一緒に見ることができ、Actionはそのintentが完了する抽象的な「動作」を表し、Categoryは追加のカテゴリ情報である.上記の暗黙的なIntentは実はこの2つの属性を使って、この2つの属性は結合して暗黙的なintentの条件を構成しました.上記のコンストラクタで指定する以外に、intentの方法で指定することもできます.
 intent.setAction(String action);
 intent.addCategory(String category);

同様に、ActionとCategoryのプロパティを満たすには、intent-filter要素に対応するコンテンツを追加する必要があります.
     <intent-filter>
                <action android:name="String action"/>
                <category  android:name="android.intent.category.DEFAULT"/>
     </intent-filter>

intent-filter要素には、1~N個のactionサブ要素、(複数のactionが含まれている場合、1つのactionを満たす限りコンポーネントを起動できます.intent-filter要素には少なくとも1つのactionが含まれている必要があります.そうしないと、任意のIntentリクエストがintent-filterと一致しません.)1~N個のcategoryサブ元素;(デフォルトにはcategoryサブエレメントがあり、acitonエレメントがあれば書き出しを表示します.なければacitonを満たす暗黙的intent起動に応答できません)0~1個のdataサブエレメント;
よく使われるaciton定数
Action定数
対応文字列
説明
ACTION_VIEW
android.intent.action.VIEW
指定したデータの表示
ACTION_EDIT
android.intent.action.EDIT
指定データの編集
ANTION_DIAL
android.intent.action.DIAL
ダイヤルアップ画面を表示
ACTION_CALL
android.intent.action.CALL
指定したユーザーに直接電話する
ACTION_SEND
android.intent.action.SEND
他の人にデータを送信
ACTION_SENDTO
android.intent.action.SENDTO
他の人にメッセージを送る
Data(データ)とType(タイプ)
data属性は通常action属性に操作を提供するデータに用いられ,Uriのオブジェクトを受信する.上記のようにウェブページの暗黙的なIntentを開き、アドレスはdata属性です.Uriのオブジェクトは常に次の形式を満たします.
scheme://host:port/path

一般的なUriオブジェクト:
http://www.baidu.com
tel:13813801380
content://com.android.contacts/contacts/1

メソッドでintentに設定することもできます.
intent.setData(Uri.parse("scheme://host:port/path"));

type属性は、data属性によって指定されたUriに対応するMIMEタイプ(abc/xyzに適合する文字列)を指定するために使用されます.
intent.setType("abc/xyz");

dataとtypeのプロパティは互いに上書きされ、その後、プロパティは先に設定したプロパティを上書きし、この2つのプロパティを同時に設定する場合は呼び出す必要があります.
intent.setDateAndType(Uri.parse("scheme://host:port/path","abc/xyz");

この2つのプロパティ宣言はintent-filter要素でフォーマットされます.
<data android:mimeType=""//      Intent Type  
      android:scheme=""//      Intent Data  scheme  
      android:host=""//      Intent Data  host  
      android:port=""//      Intent Data  port  
      android:path=""//      Intent Data  path  
      android:pathPrefix=""//      Intent Data  path  
      android:pathPattern=""/>//      Intent Data  path     

ps 1:intentが追加した属性がintent-filterの属性に合致している場合にのみ、このコンポーネントが起動します.ps 2:host,port,path属性は順次指定する必要があり,後者は省略できるが,前者は省略できない.すなわち、port属性のみを指定し、host属性を指定しない場合、android:prot属性は機能しません.
Extra(拡張)
extra属性値はBundleオブジェクト、すなわち前述の転送データです.上記のメソッドではキー値ペアのデータが直接入力されますが、メソッドの内部にもBundleオブジェクトが作成され、データが入力されます.本質的なintentはBundleオブジェクトを転送します.
Flag(フラグ)
flagプロパティは、intentに追加の制御フラグを追加し、呼び出します.
intent.addFlags(int flags);

よく使うFlag:
FLAG_ACTIVITY_BROUGHT_TO_FRONT:このFlagが起動したActivityが既に存在する場合、次回再起動時には、そのActivityをフロントに持ち込むだけです.FLAG_ACTIVITY_CLEAR_TOP:起動モードsingleTaskに相当する;FLAG_ACTIVITY_SINGLE_TOP:スタートモードsingleTopに相当する;FLAG_ACTIVITY_NEW_TASK:デフォルトのフラグ;FLAG_ACTIVITY_NO_ANIMATION:Activityを起動すると、アニメーションは使用されません.FLAG_ACTIVITY_NO_HISTORY:起動したActivityはスタックに保持されません.