android之Intent的七大屬性

    Intent用於封裝程序的“調用意圖”。兩個Activity之間,可以把需要交換的數據,封裝成Bundle對象,然後使用Intent對象,攜帶數據到另一個Activity中。實現兩個Activity的數據交換。

    Intent還是各種應用程序組件之間通信的重要媒介。啓動ActivityServiceBroadcastReceiver,都需要使用Intent

    Intent還有一個好處,如果應用程序只是想啓動具有某種特徵的組件,並不想和某個具體的組件耦合,則可以通過在int ent - filt er 中配置相應的屬性進行處理,與s t uc t s 2 中的MVC框架思路類似

    Intent對象大致包括7大屬性:1Component Name2Action3Catory4data5Type6Extra7Flag

    ·Action作爲標識符,代表一個Intent ,當一個Activity 需要外部協助處理時,就會發出一個Intent,如果一個程序能完成相應功能,只要在int ent - filt er 加上這個這個intent 就可以了。

    ·Data保存需要傳遞的數據格式,比如:tel://

    ·Extras保存需要傳遞的額外數據。

    ·Category 表示Intent的種類,從android上啓動Activity 有多種方式,比如 程序列表、桌面圖標、點擊Home激活的桌面等等,Category則用來標識這些Activity的圖標會出現在哪些啓動的上下文環境裏。

(一)  ComponentName:明確指定Intent將要啓動哪個組件,因此這種Intent被稱爲顯示Intent,沒有指定ComponentName屬性的Intent被稱爲隱式Intent。隱式Intent沒有明確要啓動哪個組件,應用匯根據Intent指定的規則去啓動符合條件的組件。ComponentName不僅可以啓動本程序中的activity,還可以啓動其它程序的activity

啓動方式:

Intent intent =new Intent();

ComponentNamecomponent= new ComponentName(this, TwoActivity.class);

intent.setComponent(component);

等價於:

Intent intent =new Intent(this, TwoActivity.class);

startActivity(intent);

等價於:

Intent intent =new Intent();

intent.setClass(this,TwoActivity.class);

startActivity(intent);

等價於:

Intent intent =new Intent();

intent.setClassName(this,"com.zzh.day06_intent.TwoActivity");

startActivity(intent);

本程序中啓動其它程序:

 

(二) ActionCategory 屬性與intent-filter配置:

通常,Action, Category屬性結合使用。定義這兩個屬性都是在主配置文件的<intent-filter>節點中。Intent通過定義Action屬性(其實就是定義一段自定義的字符串),這樣就可以把Intent與具體的某個Activity分離,實現瞭解耦。否則,每次跳轉都有寫成,

(三) data

1、 用於添加數據。通常是啓動某個系統程序或其他程序,帶給此程序的信息。Data屬性通常用於向Action屬性提供操作的數據。Data屬性的值是個Uri對象。

Uri的格式如下scheme://host:port /path

2、 系統內置的屬性常量

tel:是固定寫法,是系統內置的屬性常量。

系統內置的幾個Dat a屬性常量:

·tel: //:號碼數據格式,後跟電話號碼。

·mailto: //:郵件數據格式,後跟郵件收件人地址。

·smsto: //:短息數據格式,後跟短信接收號碼。

·content : //:內容數據格式,後跟需要讀取的內容。

·file://:文件數據格式,後跟文件路徑。

·market://search?q=pname:pkgname:市場數據格式,在Google Market裏搜索包名爲pkgname的應用。

·geo: //latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。

四、Intent利用Action屬性和Dat a屬性啓動Android系統內置組件的代碼

(一)、撥打電話:

Intent intent=new Intent();

intent.setAction(Intent.ACTION_CALL);

//intent.setAction("android.intent.action.CALL");  //以下各項皆如此,都有兩種寫法。

intent.setData(Uri.parse("tel:1320010001"));

startActivity(intent);

//調用撥號面板:

Intent intent=new Intent();

intent.setAction(Intent.ACTION_DIAL);

intent.setData(Uri.parse("tel:1320010001"));

startActivity(intent);

//調用撥號面板:

Intent intent=new Intent();

intent.setAction(I ntent.ACTION_VIEW);

intent.setData(Uri.parse("tel:1320010001"));

startActivity(intent);

(二)、利用Uri打開瀏覽器、打開地圖等:

Uri uri = Uri.parse("https://www.baidu.com");//瀏覽器

Uriuri=Uri.parse("geo:39.899533,116.036476"); //打開地圖定位

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

intent.setData(uri);

startActivity(intent);

()Type屬性

1Type屬性用於指定Data所指定的Uri對應的MIME類型。MIME只要符合“abc /xyz”這樣的字符串格式即可。

2Intent利用ActionDataType屬性啓動Android系統內置組件的代碼:

播放視頻:

Intent intent = new Intent();

Uri uri =Uri.parse("file:///sdcard/media.mp4");

intent.setAction(Intent.ACTION_VIEW);

intent.setDataAndType(uri,"video/*");

startActivity(intent);

()Extra屬性

1、通過intent.putExtra(, )的形式在多個Activity之間進行數據交換。

2、系統內置的幾個Extra常量

EXTRA_BCC:存放郵件密送人地址的字符串數組。

EXTRA_CC:存放郵件抄送人地址的字符串數組。

EXTRA_EMAIL :存放郵件地址的字符串數組。

EXTRA_SUBJECT:存放郵件主題字符串。

EXTRA_TEXT:存放郵件內容。

EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent 的按鍵。

EXTRA_PHONE_ NUMBER :存放調用ACTION_CALL 時的電話號碼。

3 Intent 利用ActionDataTypeExtra屬性啓動Android系統內置組件的代碼:

調用發送短信的程序

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

intent.setType("vnd.android-dir/mms-sms");

intent.putEx tra("sms_body","信息內容...");

startActivity(intent);

//發送短信息

Uri uri =Uri.parse("smsto:13200100001");

Intent intent = new Intent();

intent.setAction(Intent.ACTION_SENDTO);

intent.setData(uri);

intent.putEx tra("sms_body","信息內容...");

startActivity( intent );

//發送彩信,設備會提示選擇合適的程序發送

Uri uri = Uri.parse("content://media/external/images/media/23"); //設備中的資源(圖像或其他資源)

Intent intent = new Intent();

intent.setAction(Intent. ACTION_SEND );

intent.setType("image/png");

intent.putExtra("sms_body","內容");

intent.putExtra(Intent.EX TRA_STREAM,uri);

startActivity(it);

發送Email

Intent intent=new Intent();

intent.setAction(I ntent.ACTION_SEND);

String[]tos={"[email protected]"}

String[]ccs={"[email protected]"};

intent.putExtra(Intent.EXTRA_EMAIL, tos);

intent.putExtra(Intent.EXTRA_CC, ccs);

intent.putExtra(Intent.EXTRA_TEX T,"The email body text");

intent.putExtra(Intent.EXTRA_SU BJ ECT,"The email subject text");

intent.setType("message/rfc822");

startActivity(Intent.createChooser(intent,"Choose Email Client"));

Intent intent = newIntent(Intent.ACTION_SEND);

String[] tos = {"[email protected]"};

intent.putExtra(I ntent.EXTRA_EMAIL, tos);

intent.putExtra(I ntent.EXTRA_TEXT,getPhoneParameter());

intent.putExtra(Intent.EXTRA_SUBJECT,"Android日誌");

intent.putEx tra(Intent.EXTRA_STREAM, Uri.fromFile(cacheDir));

intent.setType("message/rfc882");

intent.setType("plain/text");

Intent.createChooser(intent, "請選擇郵件發送軟件");

startActivity(intent);

intent.setAction(android.provider.Settings.ACTION_SETTINGS)


4 Intent利用Action屬性中的ACTION_GET_CONTENT獲取返回值

//選擇圖片requestCode返回的標識

Intent intent = new I ntent();

intent.setAction(I ntent.ACTION_GET_CONTENT );

intent.setType( "image/* " );

Intent wrapperIntent = Intent.createChooser(intent, null);

startActivityForResult(wrapperIntent,requestCode);

//添加音頻

Intent intent = new Intent();

intent.setAction(Intent.ACTION_GET_CONTENT);

intent.setType( "video/* " );

Intent wrapperIntent = Intent.createChooser(intent, null);

startActivityForResult(wrapperIntent,requestCode);

//視頻

Intent intent = new Intent();

intent.setAction(Intent.ACTION_GET_CONTENT);

intent.setType( "video/* ");

Intent wrapperIntent = Intent.createChooser(intent, null);

startActivityForResult(wrapperI ntent,requestCode);

//錄音

Intent intent = new Intent();

intent.setAction(Intent.ACTION_GET_CONTENT );

intent.setType( "audio/amr" );

intent.setClassName("com.android.soundrecorder","com.android.soundrecorder.SoundRecorder");

startActivityForResult(intent, requestCode);

(七)、Flags 屬性:Intent 可調用addFlags()方法來爲Intent 添加控制標記。【重要】

1 FLAG_ ACTIVITY_CLEAR_TOP:(效果同Activity LaunchModesingleTask

如果在棧中已經有該Activity的實例,就重用該實例。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移除棧。如果棧中不存在該實例,將會創建新的實例放入棧中。

2 FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity L aunchModesingleTop

如果在任務的棧頂正好存在該Activity的實例, 就重用該實例,而不會創建新的Activity 對象。

3 FLAG_ ACTIVITY_NEW_TASK:

【備註:】以下幾個爲了解。

4 FLAG_ACTIVITY_MULTIPLE_TASK:

5 FLAG_ACTIVITY_BROUGHT_TO_FRONT:

6 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:

示例代碼:

Intent intent = new Intent(this,MainActivity.class);

//Activity棧中處於MainActivity主頁面之上的Activity都彈出。

intent.setFlags(Intent.FLAG_ACTI VI TY_CLEAR_TOP);

startActivity(intent);

例如:

如果依次啓動了四個Activity ABC D

D Activity 裏,跳到B Activity,同時希望DC finish掉,可以在startActivity (intent )裏的intent 裏添加flags標記,如下所示:

Intent intent = new Intent(this , B.class);   

intent .setFlags (Intent .FLAG_ACTIVITY_CLEAR_TOP); 

s t ar t Activity(intent );

這樣啓動B  Activity的同時,就會把DC finis hed掉。

如果B  ActivitylaunchMode是默認的“st andar d”,則B  Activity會首先finis hed掉舊的B頁面,再啓動一個新的Activity   B如果不想重新再創建一個新的B  Activity,而是重用之前的B  Activity,可以將B  ActivitylaunchMode設置爲“singleTask”。【特別需要注意的是:在部分手機中,如三星手機。即便是singleTask也會產生新的頁面,而不是重用之前的頁面。】


四、利用Intent 屬性調用系統app的示例代碼:

1、佈局核心代碼:

<ScrollView
      android:id="@+id/ScrollView1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" >
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical" >

          <Button
              android:id="@+id/Button_main_call "
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 直接撥號" />

          <Button
              android:id="@+id/Button_main_dial"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 啓動撥號面板" />

          <Button
              android:id="@+id/Button_main_dialer"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text="顯示撥號面板" />

          <Button
              android:id="@+id/Button_main_sms"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton "
              android:text="發送短信" />

          <Button
              android:id="@+id/Button_main_setting"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton "
              android:text="系統設置" />

          <Button
              android:id="@+id/Button_main_datesetting"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 日期設置" />

          <Button
              android:id="@+id/Button_main_soundsetting"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 聲音設置" />

          <Button
              android:id="@+id/Button_main_wifisetting"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" W I F I 設置" />

          <Button
              android:id="@+id/Button_main_web"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 瀏覽網頁" />

          <Button
              android:id="@+id/Button_main_contacts"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 查看聯繫人" />

          <Button
              android:id="@+id/Button_main_showimage"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 查看圖片" />

          <Button
              android:id="@+id/Button_main_showtext"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 查看文本" />

          <Button
              android:id="@+id/Button_main_playvideo"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 播放視頻" />

          <Button
              android:id="@+id/Button_main_playaudio"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 播放音頻" />

          <Button
              android:id="@+id/Button_main_home"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" H O M E " />
      </LinearLayout>
  </ScrollView>

2 java核心代碼:

public class MainActivity extends Activity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.a);
	}

	public void clickButton(View view)
	{
		Intent intent = new Intent();
		// android.content.intent.ACTION_VIEW
		intent.setAction(android.content.Intent.ACTION_VIEW);
		switch (view.getId())
		{
		case R.id.Button_main_call:
			intent.setAction(android.content.Intent.ACTION_CALL);
			intent.setData(Uri.parse("tel:10086"));
			break;
		case R.id.Button_main_dial:
			intent.setAction(android.content.Intent.ACTION_DIAL);
			intent.setData(Uri.parse("tel:10086"));
			break;
		case R.id.Button_main_dialer:
			intent.setAction("com.android.phone.action.TOUCH_DIALER");
			break;
		case R.id.Button_main_sms:
			intent.setAction(android.content.Intent.ACTION_SENDTO);
			intent.setData(Uri.parse("smsto:10086"));
			intent.putExtra("sms_body", "該吃飯了,下課吧!");
			break;
		case R.id.Button_main_setting:
			intent.setAction("android.settings.settings");
			break;
		case R.id.Button_main_datesetting:
			intent.setAction("android.settings.DATE_settingS");
			break;
		case R.id.Button_main_soundsetting:
			intent.setAction("android.settings.SOUND_settingS");
			break;
		case R.id.Button_main_wifisetting:
			intent.setAction("android.settings.WIFI_settings");
			break;
		case R.id.Button_main_contacts:
			intent.setAction("com.android.contacts.action.LIST_contacts");
			break;
		case R.id.Button_main_web:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setData(Uri
					.parse("http://www.baidu.com"));
			break;
		case R.id.Button_main_showimage:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setDataAndType(
					Uri.fromFile(new File(
							"mnt/sdcard/Download/landscape.jpg")),
					"image/*");
			break;
		case R.id.Button_main_showtext:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setDataAndType(
					Uri.fromFile(new File(
							"mnt/sdcard/Download/info.txt")),
					"text/*");
			break;
		case R.id.Button_main_playaudio:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setDataAndType(
					Uri.fromFile(new File(
							"mnt/sdcard/Download/heavencity.mp3")),
					"audio/*");
			break;
		case R.id.Button_main_playvideo:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setDataAndType(
					Uri.fromFile(new File(
							"mnt/sdcard/Download/girl.3gp")),
					"video/*");
			break;
		case R.id.Button_main_home:
			intent.setAction("android.intent.action.main");
			intent.addCategory("android.intent.category.HOME");
			break;
		default:
			break;
		}
		startActivity(intent);
	}
}


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