Android学習記録(7)—Intentで意図と暗黙の意図を表示する使い方

5915 ワード

Intent(意図)は主にAndroidアプリケーションの各コンポーネント間の通信を解決することである.
Intentはアプリケーションで1回の操作の動作、動作に関するデータ、付加データの記述を担当し、AndroidはこのIntentの記述に基づいて、対応するコンポーネントを見つけ、Intentを呼び出したコンポーネントに渡し、コンポーネントの呼び出しを完了する.
そのため、Intentはここでメディア仲介の役割を果たし、コンポーネントが互いに呼び出す関連情報を専門に提供し、呼び出し者と被呼び出し者との間のデカップリングを実現している.
例えば、1つの連絡先メンテナンスアプリケーションでは、対応するActivityがlistActivityであると仮定した連絡先リスト画面で、ある連絡先をクリックした後、その連絡先の詳細画面(対応するActivityがdetailActivityであると仮定)から飛び出したい
この目的を達成するためにlistActivityは、システムに「表示」動作を行うように伝えるために使用されるIntentを構築する必要があります.この動作に対応する表示オブジェクトは「連絡先」であり、startActivity(Intent intent)を呼び出し、構築されたIntentを転送します.このIntentの説明に従って、ManiFestにこのIntentの要求を満たすActivityを見つけ、システムは見つけたActivityを呼び出します.つまりdetailActivityであり、最終的にIntentに転送され、detailActivityはこのIntentの説明に従って、対応する操作を実行します.
intentの主な分類には主に暗黙的意図と明示的意図が含まれる.明示的な意図は、通常、主に本アプリケーションのActivity間のデータを起動するが、暗黙的な意図は、電話をかけたり、アプリケーションにまたがるActivityを起動したりするシステム内の特定の動作によく見られる.
一般的には、
明示的な意図:Intentを呼び出す.setComponent()またはIntent.setClass()メソッドは、コンポーネント名のIntentが明示的な意図であることを明確に指定し、明示的な意図は、Intentがどのコンポーネントに渡すべきかを明確に指定します.
暗黙的意図:コンポーネント名が明確に指定されていないIntentは暗黙的意図です.Androidシステムは、暗黙的な意図で設定されたアクション、カテゴリ、データ(URI、データ型)に基づいて、この意図を処理します.
表示意図は非常によく使われ、非常に簡単です.一般的にアプリケーション内のActivityの相互呼び出し変換に使用されています.多くは言いませんが、ここでは暗黙的な意図を紹介します.
簡単に要約すると、意図には、Action(アクション)、Category(付加情報)、Data(データ、具体的な内容)、Tpye(タイプ)などが含まれています.例を挙げると、意図は1つのコンポーネントを起動する完全な動作情報であり、人を殴るように、殴るのはAction動作であり、人はData内容であり、Typeはタイプであり、誰を殴るのでしょうか.悪人を殴って、typeは悪い指のタイプで、これらの情報が全部になってこそ完全な意図を実行することができて、もちろんいくつかの情報があって、例えばschemeはURIタイプのデータの接頭辞で、この例の中のsms:、hostホスト名、pathパスなどがあります.
ここでは、システムメールを呼び出す例を挙げ、暗黙的な意図でシステムメールを起動し、10086に情報を送信する例を示します.コードは次のとおりです.
/**
	 *              
	 * 
	 *       :     :Action(  ),Category(    ),Data(  ,    ),Tpye(  )  ,    ,
	 *                       
	 * ,    ,   Action  ,   Data  , Type    ,     ?   ,type       
	 * ,                   
	 * ,        ,  scheme  URI        ,         sms:,  host   ,path   
	 * 
	 * @param view
	 */
	public void startOne(View view) {
		Intent intent = new Intent();
		intent.setAction("android.intent.action.SENDTO");//        
		intent.addCategory("android.intent.category.DEFAULT");//     
		intent.setData(Uri.parse("sms:10086"));//      ,   10086
		startActivity(intent);
	}
上の例はシステムを呼び出すもので、下の例ではカスタムの暗黙的な意図がどのように呼び出されたかを見てみましょう.
まず、リストファイルに登録します.コードは次のとおりです.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.loonggg.intent"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="net.loonggg.intent.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="net.loonggg.intent.SecondActivity" >
            <intent-filter>

                <!--        -->
                <action android:name="net.loonggg.xxx" />
                <!--     scheme host -->
                <data
                    android:host="www.baidu.com"
                    android:path="/person"
                    android:scheme="loonggg" />
                <!--        -->
                <data android:mimeType="person/people" />
                <!--      -->
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>
の2番目のActivityの中のものは私たちがカスタマイズしたもので、下のコードです.
 <activity android:name="net.loonggg.intent.SecondActivity" >
            <intent-filter>

                <!--        -->
                <action android:name="net.loonggg.xxx" />
                <!--     scheme host -->
                <data
                    android:host="www.baidu.com"
                    android:path="/person"
                    android:scheme="loonggg" />
                <!--        -->
                <data android:mimeType="person/people" />
                <!--      -->
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

コードでカスタムを呼び出すにはどうすればいいですか?実はシステムのメールを呼び出すのと同じで、ただシステムのメールの中のあれらの動作とデータを呼び出すだけで、システムはすでに私达に配置して、私达は直接使えばいいので、カスタマイズしたのは私达が自分で書いたので、呼び出す方法とシステムは実は同じです.方法は次のとおりです.
/**
	 *             
	 * 
	 * @param view
	 */
	public void startTwo(View view) {
		Intent intent = new Intent();
		intent.setAction("net.loonggg.xxx");
		intent.addCategory("android.intent.category.DEFAULT");
		intent.setDataAndType(Uri.parse("loonggg://www.baidu.com/person"),
				"person/people");
		startActivity(intent);
	}

特に注意したいのはsetData(data)とintent.settype(type)は、この2つの方法が互いにクリアされることに注意し、setData(data)を設定してからsettype(type)を設定すると、後に設定したsettype(type)が前のsetData(data)設定の内容をクリアし、エラーを報告するため、逆にタイプとデータを設定する場合はsetDataAndType(data,type)という方法を使用します.
転載して出典を明記する:http://blog.csdn.net/loongggdroid/article/details/17887975