溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

android之Intent的七大屬性

發(fā)布時(shí)間:2020-06-01 17:09:54 來源:網(wǎng)絡(luò) 閱讀:700 作者:墨宇hz 欄目:移動(dòng)開發(fā)

    Intent用于封裝程序的“調(diào)用意圖”。兩個(gè)Activity之間,可以把需要交換的數(shù)據(jù),封裝成Bundle對象,然后使用Intent對象,攜帶數(shù)據(jù)到另一個(gè)Activity中。實(shí)現(xiàn)兩個(gè)Activity的數(shù)據(jù)交換。

    Intent還是各種應(yīng)用程序組件之間通信的重要媒介。啟動(dòng)Activity、ServiceBroadcastReceiver,都需要使用Intent。

    Intent還有一個(gè)好處,如果應(yīng)用程序只是想啟動(dòng)具有某種特征的組件,并不想和某個(gè)具體的組件耦合,則可以通過在int ent - filt er 中配置相應(yīng)的屬性進(jìn)行處理,與s t uc t s 2 中的MVC框架思路類似

    Intent對象大致包括7大屬性:1、Component Name,2、Action3、Catory,4、data,5Type,6、Extra,7Flag。

    ·Action作為標(biāo)識符,代表一個(gè)Intent ,當(dāng)一個(gè)Activity 需要外部協(xié)助處理時(shí),就會(huì)發(fā)出一個(gè)Intent,如果一個(gè)程序能完成相應(yīng)功能,只要在int ent - filt er 加上這個(gè)這個(gè)intent 就可以了。

    ·Data保存需要傳遞的數(shù)據(jù)格式,比如:tel://

    ·Extras保存需要傳遞的額外數(shù)據(jù)。

    ·Category 表示Intent的種類,從android上啟動(dòng)Activity 有多種方式,比如 程序列表、桌面圖標(biāo)、點(diǎn)擊Home激活的桌面等等,Category則用來標(biāo)識這些Activity的圖標(biāo)會(huì)出現(xiàn)在哪些啟動(dòng)的上下文環(huán)境里。

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

啟動(dòng)方式:

Intent intent =new Intent();

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

intent.setComponent(component);

等價(jià)于:

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

startActivity(intent);

等價(jià)于:

Intent intent =new Intent();

intent.setClass(this,TwoActivity.class);

startActivity(intent);

等價(jià)于:

Intent intent =new Intent();

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

startActivity(intent);

本程序中啟動(dòng)其它程序:

 

(二) Action、Category 屬性與intent-filter配置:

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

(三) data

1、 用于添加數(shù)據(jù)。通常是啟動(dòng)某個(gè)系統(tǒng)程序或其他程序,帶給此程序的信息。Data屬性通常用于向Action屬性提供操作的數(shù)據(jù)。Data屬性的值是個(gè)Uri對象。

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

2、 系統(tǒng)內(nèi)置的屬性常量

tel:是固定寫法,是系統(tǒng)內(nèi)置的屬性常量。

系統(tǒng)內(nèi)置的幾個(gè)Dat a屬性常量:

·tel: //:號碼數(shù)據(jù)格式,后跟電話號碼。

·mailto: //:郵件數(shù)據(jù)格式,后跟郵件收件人地址。

·smsto: //:短息數(shù)據(jù)格式,后跟短信接收號碼。

·content : //:內(nèi)容數(shù)據(jù)格式,后跟需要讀取的內(nèi)容。

·file://:文件數(shù)據(jù)格式,后跟文件路徑。

·market://search?q=pname:pkgname:市場數(shù)據(jù)格式,在Google Market里搜索包名為pkgname的應(yīng)用。

·geo: //latitude, longitude:經(jīng)緯數(shù)據(jù)格式,在地圖上顯示經(jīng)緯度所指定的位置。

四、Intent利用Action屬性和Dat a屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼

(一)、撥打電話:

Intent intent=new Intent();

intent.setAction(Intent.ACTION_CALL);

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

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

startActivity(intent);

//調(diào)用撥號面板:

Intent intent=new Intent();

intent.setAction(Intent.ACTION_DIAL);

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

startActivity(intent);

//調(diào)用撥號面板:

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屬性

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

2、Intent利用ActionDataType屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼:

播放視頻:

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(, )的形式在多個(gè)Activity之間進(jìn)行數(shù)據(jù)交換。

2、系統(tǒng)內(nèi)置的幾個(gè)Extra常量

EXTRA_BCC:存放郵件密送人地址的字符串?dāng)?shù)組。

EXTRA_CC:存放郵件抄送人地址的字符串?dāng)?shù)組。

EXTRA_EMAIL :存放郵件地址的字符串?dāng)?shù)組。

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

EXTRA_TEXT:存放郵件內(nèi)容。

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

EXTRA_PHONE_ NUMBER :存放調(diào)用ACTION_CALL 時(shí)的電話號碼。

3 、Intent 利用Action、DataType、Extra屬性啟動(dòng)Android系統(tǒng)內(nèi)置組件的代碼:

調(diào)用發(fā)送短信的程序

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

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

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

startActivity(intent);

//發(fā)送短信息

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

Intent intent = new Intent();

intent.setAction(Intent.ACTION_SENDTO);

intent.setData(uri);

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

startActivity( intent );

//發(fā)送彩信,設(shè)備會(huì)提示選擇合適的程序發(fā)送

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

Intent intent = new Intent();

intent.setAction(Intent. ACTION_SEND );

intent.setType("p_w_picpath/png");

intent.putExtra("sms_body","內(nèi)容");

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

startActivity(it);

發(fā)送Email

Intent intent=new Intent();

intent.setAction(I ntent.ACTION_SEND);

String[]tos={"android1@163.com"}

String[]ccs={"you@yahoo.com"};

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 = {"mobileservice@ablesky.com"};

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, "請選擇郵件發(fā)送軟件");

startActivity(intent);

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


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

//選擇圖片requestCode返回的標(biāo)識

Intent intent = new I ntent();

intent.setAction(I ntent.ACTION_GET_CONTENT );

intent.setType( "p_w_picpath/* " );

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 可調(diào)用addFlags()方法來為Intent 添加控制標(biāo)記。【重要】

1 、FLAG_ ACTIVITY_CLEAR_TOP:(效果同Activity LaunchModesingleTask

如果在棧中已經(jīng)有該Activity的實(shí)例,就重用該實(shí)例。重用時(shí),會(huì)讓該實(shí)例回到棧頂,因此在它上面的實(shí)例將會(huì)被移除棧。如果棧中不存在該實(shí)例,將會(huì)創(chuàng)建新的實(shí)例放入棧中。

2 FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity L aunchModesingleTop

如果在任務(wù)的棧頂正好存在該Activity的實(shí)例, 就重用該實(shí)例,而不會(huì)創(chuàng)建新的Activity 對象。

3 、FLAG_ ACTIVITY_NEW_TASK:

【備注:】以下幾個(gè)為了解。

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);

例如:

如果依次啟動(dòng)了四個(gè)Activity AB、C 、D

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

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

intent .setFlags (Intent .FLAG_ACTIVITY_CLEAR_TOP); 

s t ar t Activity(intent );

這樣啟動(dòng)B  Activity的同時(shí),就會(huì)把D、C finis hed掉。

如果B  ActivitylaunchMode是默認(rèn)的“st andar d”,則B  Activity會(huì)首先finis hed掉舊的B頁面,再啟動(dòng)一個(gè)新的Activity   B如果不想重新再創(chuàng)建一個(gè)新的B  Activity,而是重用之前的B  Activity,可以將B  ActivitylaunchMode設(shè)置為“singleTask”?!咎貏e需要注意的是:在部分手機(jī)中,如三星手機(jī)。即便是singleTask也會(huì)產(chǎn)生新的頁面,而不是重用之前的頁面?!?/span>


四、利用Intent 屬性調(diào)用系統(tǒng)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=" 啟動(dòng)撥號面板" />

          <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="發(fā)送短信" />

          <Button
              android:id="@+id/Button_main_setting"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton "
              android:text="系統(tǒng)設(shè)置" />

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

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

          <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 設(shè)置" />

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

          <Button
              android:id="@+id/Button_main_contacts"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:onClick="clickButton"
              android:text=" 查看聯(lián)系人" />

          <Button
              android:id="@+id/Button_main_showp_w_picpath"
              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_showp_w_picpath:
			intent.setAction(android.content.Intent.ACTION_VIEW);
			intent.setDataAndType(
					Uri.fromFile(new File(
							"mnt/sdcard/Download/landscape.jpg")),
					"p_w_picpath/*");
			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);
	}
}


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI