Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 隱式Intent的使用——Android學習筆記3

隱式Intent的使用——Android學習筆記3

編輯:關於Android編程

隱式Intent的使用
  一、為什麼要用隱式Intent?

但如果想調用別的程序的組件時,且開發人員往往並不清楚別的應用程序的組件名稱,這時我們只能用隱式Intent,隱式Intent恰恰相反,它不會用組件名稱定義需要激活的目標組件,而是Android系統幫助應用程序尋找與Intent請求意圖最匹配的組件。

二、Android系統怎麼找?

主要是通過Intent Filter來尋找與隱式Intent相關的對象。具體的選擇方法是:Android將Intent的請求內容比較,Intent Filter中包含系統中所有可能的待選組件。如果中某一組件匹配隱式Intent請求的內容,那麼Android就選擇該組件作為該隱式Intent的目標組件。


三、的基本格式如下:

 





		

	
			
		
						   
		
		
		
	

	


                   

                    




四、Intent的請求內容如何與比較?


1.動作比較- (第一步)如:


	
	
	

1). 一條元素至少應該包含一個,否則任何Intent請求都不能和該匹配。
  
2). 如果Intent請求的Action和中個某一條匹配,那麼該Intent就通過了這條的動作比較。(第一步完成)


2.類別比較- (第二步)如:


	
	


1). 只有當Intent請求中所有的Category與組件中某一個Intent-filter的完全匹配時,才會通過匹配成功。也就說某一個中的category必須包含Intent中的所有category時,才算類別匹配成功。(第二步完成)
  
2). Intent-filter中多余的聲明並不會導致匹配失敗,也就是說中的category可以存在多余項;

3). 是一種默認的category,在調用startActivity()時會自動把這個category添加到intent中.

4). 每一個通過 startActivity()方法發出的隱式 Intent 都至少有一個 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一個隱式Intent的Activity都應該包括
"android.intent.category.DEFAULT" category,不然將導致 Intent匹配失敗。

3.數據比較- (第三步)如:


	
	


1). 元素指定了希望接受的Intent請求的數據URI和數據類型,URI被分成三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Intent請求的URI數據類型和scheme必須與Intent-filter中所指定的一致。若Intent-filter中還指定了authority或path,它們也需要相匹配才會通過測試。(第三步完成)

總:
只有第一步匹配成功,才會繼續匹配此的category及第二步,第二步匹配完成,才會匹配第三步。當都匹配上時,就找到對應的包含它們的 跳轉到對應的目標組件上。

 

五、Intent.Action(安卓系統內置動作)的常見用法:


1. Intent.ACTION_MAIN

String: android.intent.action.MAIN
作用:標識Activity為一個程序的開始(表明app首先執行的Activity)。比較常用。
Input: nothing
Output: nothing

例:




   
	
		
		
	

例:利用Intent實現返回系統的Home桌面
Intent intent = new Intent();
  intent.setAction(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);


2. Intent.Action_CALL


Stirng: android.intent.action.CALL
作用:呼叫指定的電話號碼(直接撥打電話)。
Input: 電話號碼。數據格式為:tel:+phone number
Output: Nothing

例:
Intent intent=new Intent(); 
  intent.setAction(Intent.ACTION_CALL);//設置當前動作為撥打電話   
  intent.setData(Uri.parse("tel:1320010001"));//設置要撥打的電話
startActivity(intent);

在AndroidMainifest.xml文件中,為當前程序設置撥打電話權限:


3. Intent.Action.DIAL


String: action.intent.action.DIAL
作用:調用撥號面板(只是調用,並沒有開始打電話)
Input: 電話號碼。數據格式為:tel:+phone number
Output: Nothing
說明:打開Android的撥號UI。如果沒有設置數據,則打開一個空的UI;

例:
Intent intent = new Intent();
  intent.setAction(Intent.ACTION_DIAL);//設置當前動作為調用撥號盤
  intent.setData(Uri.parse("tel:1584014xxxx"));//設置准備要撥打的電話
startActivity(intent);

(這裡通過一個例子來仔細演示撥打電話的用法,包括:直接撥號、打開撥號盤、用戶自定義撥號)
//Button的點擊事件-直接撥打電話
Button  btn_call = (Button) findViewById(R.id.Call);
btn_call.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_CALL);//設置當前動作為撥打電話
		intent.setData(Uri.parse("tel:1584014xxxx"));//設置要撥打的電話
		startActivity(intent);
	}
});

//Button的點擊事件-直接撥打電話
Button  btn_dial = (Button) findViewById(R.id.Dial);
btn_dial.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_DIAL);//設置當前動作為調用撥號盤
		intent.setData(Uri.parse("tel:1584014xxxx"));//設置准備要撥打的電話
		startActivity(intent);
	}
});

//獲取用戶輸入電話號碼的EditText
final EditText edt_phoneNumber = (EditText) findViewById(R.id.phonebunber_id);

//Button點擊事件-用戶自己撥號
Button  btn_userCall = (Button) findViewById(R.id.userCall);
btn_userCall.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {

		//先驗證用戶輸入電話的有效性(使用安卓自帶的包來判斷電話的有效性)
		String phoneNumber = edt_phoneNumber.getText().toString();
		if(PhoneNumberUtils.isGlobalPhoneNumber(phoneNumber)){
			Intent intentDial = new Intent();
			  intentDial.setAction(Intent.ACTION_CALL);//設置當前為用戶自定義撥號
			  intentDial.setData(Uri.parse("tel:"+ phoneNumber));
			startActivity(intentDial);

		//提示用戶電話輸入有誤
		} else {
			Toast.makeText(CallActivity.this, "你輸入的電話有誤,請重新輸入", Toast.LENGTH_SHORT)
					.show();
		}
	}
});




4. Intent.ACTION_VIEW


String:android.intent.action.VIEW
作用:用於顯示用戶的數據,比較通用,會根據用戶的數據類型打開相應的Activity。
數據類型就是指:tel(打開撥號Activity)、http(打開浏覽器Activity)、geo(打開地圖定位Activity)等

 

 

說明:這裡演示幾個簡單的應用;

 

//Button的點擊事件-打開地圖
Button btn_geo = (Button) findViewById(R.id.geo);
btn_geo.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//設置當前動作
		intent.setData(Uri.parse("geo:39.899533,116.036476"));//打開地圖定位(直接打開你手機上的地圖軟件)
		startActivity(intent);
	}
});

//Button的點擊事件-打開浏覽器
Button btn_http = (Button) findViewById(R.id.http);
btn_http.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//設置當前動作
		intent.setData(Uri.parse("http://www.baidu.com"));//打開浏覽器並打開百度
		startActivity(intent);
	}
});

//Button的點擊事件-打開一張照片
Button btn_image = (Button) findViewById(R.id.image);
btn_image.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//設置當前動作
		//你若不清楚你的存儲路勁,可以在DDMS下查看
		Uri uri = Uri.parse("file:///storage/sdcard1/DCIM/Camera/IMG_20150622_172748.jpg");
		intent.setDataAndType(uri, "image/*");
		startActivity(intent);
	}
});

//Button的點擊事件-打開視頻
Button btn_video = (Button) findViewById(R.id.video);
btn_video.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_VIEW);//設置當前動作
		Uri uri = Uri.parse("file:///storage/sdcard1/---");
		intent.setDataAndType(uri, "video/*");
		startActivity(intent);
	}
});
	 
//Button的注冊事件-查看通訊錄
Button SeeContacts_BT = (Button) findViewById(R.id.SeeContacts);
SeeContacts_BT.setOnClickListener(new View.OnClickListener() {
	@Override
	public void onClick(View v) {

		Intent intent = new Intent();
		  intent.setAction(Intent.ACTION_VIEW);
		  intent.setData(Uri.parse("content://contacts/people/1"));//查看通訊錄中的第一個聯系人
		startActivity(intent);
	}
});


5. Intent.ACTION_SENDTO


String: android.intent.action.SENDTO
作用:發送短信息
說明:這裡演示幾個簡單的應用;

例:
String number = numberET.getText().toString();// 獲得用戶輸入的號碼
String message = messageET.getText().toString();// 獲得用戶輸入的短信
if(PhoneNumberUtils.isGlobalPhoneNumber(number)) {
	Intent intent = new Intent();// 創建Intent對象
	intent.setData(Uri.parse("smsto:" + number)); // 設置要發送的號碼
	intent.putExtra("sms_body", message); // 設置要發送的信息內容
	startActivity(intent);// 將Intent傳遞給Activity
} else {
	Toast.makeText(SendToActivity.this, "你輸入的電話錯誤,請重新輸入!",
			Toast.LENGTH_SHORT).show();
}

 

(安卓發送短信的方式有2種:   第一種:就是上面寫的這個 -> 調起系統發短信功能;
也就說用這種方式,當你點擊發送按鈕時,並沒有立馬發出去,而是讓系統打開了你手機上的自帶的發短信的程序,
並將你輸入的電話號碼和短信內容寫在了上面,你在單擊手機自帶的短信程序的發送按鈕,才能發出去,
就像前面的ACTION_DIAL,只是打開了撥號盤,並沒有開始打電話;   第二種:利用SmsManager -> 調用系統短信接口直接發送短信;
用這種方式時,當你點擊你寫的發送短信按鈕,直接就發出去了,並不調用別的短信程序。
且這種方式可以監控發送狀態和對方接收狀態(具體的以後介紹))

 

6. Intent.ACTION_BATTERY_LOW

作用:顯示電量低的警告信息
說明:因為這一塊用到廣播,所以具體的實現辦法在復習有關廣播的知識時寫



7. Intent.ACTION_EDIT

作用:編輯通訊錄中某條特定的聯系人信息

例:

Intent intent = new Intent();
  intent.setAction(Intent.ACTION_EDIT);
  intent.setData(Uri.parse("content://contacts/people/1"));//修改通訊錄中的第一個聯系人
startActivity(intent);	
 
(獲取通信錄中的所有聯系人信息還有別的辦法-用到了內容提供器,後面再說)


參考網址與資料:

 

1.http://blog.csdn.net/coder80/article/details/7879259
2.http://www.cnblogs.com/hanyonglu/archive/2012/03/26/2417278.html
3.《Android程序開發范例寶典》

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved