Android中Intent和IntentFilter進行通信

後天就是2017了,提前祝大家新年快樂!最近忙得頭暈頭轉向的,難得有天輕鬆日!正好能給我時間寫篇博文,整理下知識!

首先,必須提出的是,概念性的東西在這裏就不手打了,如什麼是Intent,Intent如何使用!這裏最好查看官方文檔,說得比我說的詳細的多,而且更加全面。


實例一: 指定Action調用系統的Activity
這裏寫圖片描述
實例三:Data屬性配置
這裏寫圖片描述
實例四:使用Action,Data屬性啓動系統Activity
這裏寫圖片描述

Intent啓動不同組件的方法

Activity

  1. startActivity(Intent intent);

  2. startActivityForResult(Intent intent,int requestCode);

Service

  1. componentName startService(Intent service);
  2. boolean bindService(Intent service,ServiceConnection conn, int flags);

BroadcastReceiver

  1. sendBroadcast(Intent intent);
  2. sendBroadcast(Intent intent,String receiverPermission)
  3. sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras);
  4. sendOrderedBroadcast(Intent intent,String receiverPermission)
  5. sendStickyBroadcast(Intent intent);
  6. sendStickyBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle unutialExtras)

Data,Type屬性與intent-filter配置

  1. Data通常用於給Action提供操作的數據,接受一個Uri對象。
    Data的通常格式:content://com.android.contacts/contacts/1
    Uri總滿足如下格式:scheme://host:post/path
  2. Type屬性用於指定該Data屬性所指定的Uri對應的MIME類型,可以爲任何類型,只要符合abc/xyz格式的字符串即可。

**注意:這兩個屬性會相互覆蓋,如果希望Intent同時擁有的話,必須待用Intent的setDataAndType()方法. **

指定Action調用系統的Activity

啓動Activity的標準Action常量以及對應的字符串

這裏寫圖片描述

標準的Category常量以及對應的字符串

這裏寫圖片描述

實例一查看並獲取聯繫人電話

MainActivity代碼:

public class MainActivity extends Activity
{
	final int PICK_CONTACT = 0;
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button bn = (Button) findViewById(R.id.bn);
		// 爲bn按鈕綁定事件監聽器
		bn.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View arg0)
			{
				// 創建Intent
				Intent intent = new Intent();
				// 設置Intent的Action屬性
				intent.setAction(Intent.ACTION_GET_CONTENT);
				// 設置Intent的Type屬性
				intent.setType("vnd.android.cursor.item/phone");
				// 啓動Activity,並希望獲取該Activity的結果
				startActivityForResult(intent, PICK_CONTACT);
			}
		});
	}
	@Override
	public void onActivityResult(int requestCode
			, int resultCode, Intent data)
	{
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode)
		{
			case (PICK_CONTACT):
				if (resultCode == Activity.RESULT_OK)
				{
					// 獲取返回的數據
					Uri contactData = data.getData();
					CursorLoader cursorLoader = new CursorLoader(this
							, contactData, null, null, null, null);
					// 查詢聯繫人信息
					Cursor cursor = cursorLoader.loadInBackground();
					// 如果查詢到指定的聯繫人
					if (cursor.moveToFirst())
					{
						String contactId = cursor.getString(cursor
							.getColumnIndex(
								ContactsContract.Contacts._ID));
						// 獲取聯繫人的名字
						String name = cursor.getString(cursor
							.getColumnIndexOrThrow(
								ContactsContract.Contacts.DISPLAY_NAME));
						String phoneNumber = "此聯繫人暫未輸入電話號碼";
						//根據聯繫人查詢該聯繫人的詳細信息
						Cursor phones = getContentResolver().query(
							ContactsContract.CommonDataKinds.
								Phone.CONTENT_URI, null,
								ContactsContract.CommonDataKinds.Phone. 												CONTACT_ID
								+ " = " + contactId, null, null);
						if (phones.moveToFirst())
						{
							//取出電話號碼
							phoneNumber = phones
								.getString(phones
								.getColumnIndex(ContactsContract
								.CommonDataKinds.Phone.NUMBER));
						}
						// 關閉遊標
						phones.close();
						EditText show =(EditText)findViewById(R.id.show);
						show.setVisibility(View.VISIBLE);
						//顯示聯繫人的名稱
						show.setText(name);
						EditText phone =(EditText)findViewById(R.id.phone);
						phone.setVisibility(View.VISIBLE);
						//顯示聯繫人的電話號碼
						phone.setText(phoneNumber);
					}
					// 關閉遊標
					cursor.close();
				}
				break;
		}
	}
}

實例二:返回系統界面

// 創建Intent對象
				Intent intent = new Intent();
				// 爲Intent設置Action、Category屬性
				intent.setAction(Intent.ACTION_MAIN);
				intent.addCategory(Intent.CATEGORY_HOME);
				startActivity(intent);

實例三:Data屬性配置。

注意觀察:

  1. 如果目標組件<data…/>子元素只指定了android:scheme屬性,那麼只要Intent的Data屬性的scheme部分與android:scheme屬性相同,即可啓動該組件!
  2. 如果目標組件<data…/>子元素只指定了android:scheme,android:host屬性,那麼只要Intent的Data屬性的scheme,host部分與android:scheme,android:host屬性相同,即可啓動該組件!
  3. 如果目標組件<data…/>子元素只指定了android:scheme,android:host,android:port屬性,那麼只要Intent的Data屬性的scheme,host,port部分與android:scheme,android:host,android:port屬性相同,即可啓動該組件!

MainActivity代碼:

public class MainActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
	public void scheme(View source)
	{
		Intent intent = new Intent();
		// 只設置Intent的Data屬性
		intent.setData(Uri.parse("lee://www.aserbao.org:1234/test"));
		startActivity(intent);
	}
	public void schemeHostPort(View source)
	{
		Intent intent = new Intent();
		// 只設置Intent的Data屬性
		intent.setData(Uri.parse("lee://www.imerbao.org:8888/test"));
		startActivity(intent);
	}
	public void schemeHostPath(View source)
	{
		Intent intent = new Intent();
		// 只設置Intent的Data屬性
		intent.setData(Uri.parse("lee://www.imerbao.org:1234/mypath"));
		startActivity(intent);
	}
	public void schemeHostPortPath(View source)
	{
		Intent intent = new Intent();
		// 只設置Intent的Data屬性
		intent.setData(Uri.parse("lee://www.imerbao.org:8888/mypath"));
		startActivity(intent);
	}
	public void schemeHostPortPathType(View source)
	{
		Intent intent = new Intent();
		// 同時設置Intent的Data、Type屬性
		intent.setDataAndType(Uri.parse("lee://www.imerbao.org:8888/mypath")
			, "abc/xyz");
		startActivity(intent);
	}
}

AndroidManifest.xml代碼:

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".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:icon="@drawable/ic_scheme"
			android:name=".SchemeActivity"
			android:label="指定scheme的Activity">
			<intent-filter>
				<action android:name="xx" />
				<category android:name="android.intent.category.DEFAULT" />
				<!-- 只要Intent的Data屬性的scheme是lee,即可啓動該Activity -->
				<data android:scheme="lee" />
			</intent-filter>
		</activity>
		<activity
			android:icon="@drawable/ic_host"
			android:name=".SchemeHostPortActivity"
			android:label="指定scheme、host、port的Activity">
			<intent-filter>
				<action android:name="xx" />
				<category android:name="android.intent.category.DEFAULT" />
				<!-- 只要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
				port是8888即可啓動該Activity -->
				<data android:scheme="lee"
					  android:host="www.imerbao.org"
					  android:port="8888" />
			</intent-filter>
		</activity>
		<activity
			android:icon="@drawable/ic_sp"
			android:name=".SchemeHostPathActivity"
			android:label="指定scheme、host、path的Activity">
			<intent-filter>
				<action android:name="xx" />
				<category android:name="android.intent.category.DEFAULT" />
				<!-- 只要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
				path是/mypath,即可啓動該Activity -->
				<data android:scheme="lee"
					  android:host="www.imerbao.org"
					  android:path="/mypath" />
			</intent-filter>
		</activity>
		<activity
			android:icon="@drawable/ic_path"
			android:name=".SchemeHostPortPathActivity"
			android:label="指定scheme、host、port、path的Activity">
			<intent-filter>
				<action android:name="xx" />
				<category android:name="android.intent.category.DEFAULT" />
				<!-- 需要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
				port是8888,且path是/mypath,纔可啓動該Activity -->
				<data android:scheme="lee"
					  android:host="www.imerbao.org"
					  android:port="8888"
					  android:path="/mypath"/>
			</intent-filter>
		</activity>
		<activity
			android:icon="@drawable/ic_type"
			android:name=".SchemeHostPortPathTypeActivity"
			android:label="指定scheme、host、port、path、type的Activity">
			<intent-filter>
				<action android:name="xx"/>
				<category android:name="android.intent.category.DEFAULT" />
				<!-- 需要Intent的Data屬性的scheme是lee,且host是www.imerbao.org
				port是8888,且path是/mypath
				且type是abc/xyz,纔可啓動該Activity -->
				<data android:scheme="lee"
					  android:host="www.imerbao.org"
					  android:port="8888"
					  android:path="/mypath"
					  android:mimeType="abc/xyz"/>
			</intent-filter>
		</activity>

    </application>

實例四:使用Action,Data屬性啓動系統Activity

MainActivity代碼:

public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button bn = (Button) findViewById(R.id.bn);
		// 爲bn按鈕添加一個監聽器
		bn.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// 創建Intent
				Intent intent = new Intent();
				String data = "http://blog.csdn.net/qq_32175491";
				// 根據指定字符串解析出Uri對象
				Uri uri = Uri.parse(data);
				// 爲Intent設置Action屬性
				intent.setAction(Intent.ACTION_VIEW);
				// 設置Data屬性
				intent.setData(uri);
				startActivity(intent);
			}
		});
		Button edit = (Button) findViewById(R.id.edit);
		// 爲edit按鈕添加一個監聽器
		edit.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// 創建Intent
				Intent intent = new Intent();
				// 爲Intent設置Action屬性(動作爲:編輯)
				intent.setAction(Intent.ACTION_EDIT);
				String data = "content://com.android.contacts/contacts/1";
				// 根據指定字符串解析出Uri對象
				Uri uri = Uri.parse(data);
				// 設置Data屬性
				intent.setData(uri);
				startActivity(intent);
			}
		});
		Button call = (Button) findViewById(R.id.call);
		// 爲call按鈕添加一個監聽器
		call.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				// 創建Intent
				Intent intent = new Intent();
				// 爲Intent設置Action屬性(動作爲:撥號)
				intent.setAction(Intent.ACTION_DIAL);
				String data = "tel:12345678911";
				// 根據指定字符串解析出Uri對象
				Uri uri = Uri.parse(data);
				// 設置Data屬性
				intent.setData(uri);
				startActivity(intent);
			}
		});
	}

總結:

本文主要介紹了Android系統中Intent的功能和用法,當Android應用需要啓動某個組件是,總需要藉助Intent來實現。不管啓動Activity還是Service,BroadcastReceiver組件,Android系統都是通過Intent來實現的。這裏講得知識一些基礎的使用方法,如果要深挖,建議研究下底層代碼!還是那句話,官方文檔很重要!

近段時間一直在研究如何寫好博文,給今後的自己一些回顧以及希望能給正在學習Android路上的初學者一些幫助!如果有什麼問題歡迎給我留言,看到及時回覆!

今天都已經31號了,文章準備了兩天!洗洗準備睡了,基礎知識點差不多都有寫到。明天起牀再修改下,準備發佈了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章