日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Intent基本使用

發(fā)布時(shí)間:2024/6/30 Android 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Intent基本使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android Intent基本使用

Intent組件雖然不是四大組件,但卻是連接四大組件的橋梁,學(xué)習(xí)好這個(gè)知識,也非常的重要。

一、什么是Intent

1、Intent的概念:

  • Android中提供了Intent機(jī)制來協(xié)助應(yīng)用間的交互與通訊,或者采用更準(zhǔn)確的說法是,Intent不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的activity, service和broadcast receiver之間的交互。Intent這個(gè)英語單詞的本意是“目的、意向、意圖”。
  • Intent是一種運(yùn)行時(shí)綁定(runtime binding)機(jī)制,它能在程序運(yùn)行的過程中連接兩個(gè)不同的組件。通過Intent,你的程序可以向Android表達(dá)某種請求或者意愿,Android會(huì)根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來響應(yīng)。

activity、service和broadcast receiver之間是通過Intent進(jìn)行通信的,而另外一個(gè)組件Content Provider本身就是一種通信機(jī)制,不需要通過Intent。我們來看下面這個(gè)圖就知道了:

如果Activity1需要和Activity2進(jìn)行聯(lián)系,二者不需要直接聯(lián)系,而是通過Intent作為橋梁。通俗來講,Intnet類似于中介、媒婆的角色。

2、對于向這三種組件發(fā)送intent有不同的機(jī)制:

  • 使用Context.startActivity() 或 Activity.startActivityForResult(),傳入一個(gè)intent來啟動(dòng)一個(gè)activity。使用 Activity.setResult(),傳入一個(gè)intent來從activity中返回結(jié)果。

  • 將intent對象傳給Context.startService()來啟動(dòng)一個(gè)service或者傳消息給一個(gè)運(yùn)行的service。將intent對象傳給 Context.bindService()來綁定一個(gè)service。

  • 將intent對象傳給 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則它們被傳給 broadcast receiver。

二、Intent的相關(guān)屬性:

  • Intent由以下各個(gè)組成部分:
  • component(組件):目的組件
  • action(動(dòng)作):用來表現(xiàn)意圖的行動(dòng)
  • category(類別):用來表現(xiàn)動(dòng)作的類別
  • data(數(shù)據(jù)):表示與動(dòng)作要操縱的數(shù)據(jù)
  • type(數(shù)據(jù)類型):對于data范例的描寫
  • extras(擴(kuò)展信息):擴(kuò)展信息
  • Flags(標(biāo)志位):期望這個(gè)意圖的運(yùn)行模式

Intent類型分為顯式Intent(直接類型)、隱式Intent(間接類型)。官方建議使用隱式Intent。上述屬性中,component屬性為直接類型,其他均為間接類型。

相比與顯式Intent,隱式Intnet則含蓄了許多,它并不明確指出我們想要啟動(dòng)哪一個(gè)活動(dòng),而是指定一系列更為抽象的action和category等信息,然后交由系統(tǒng)去分析這個(gè)Intent,并幫我們找出合適的活動(dòng)去啟動(dòng)。

Activity 中 Intent Filter 的匹配過程 :

1、component(組件):目的組件

Component屬性明確指定Intent的目標(biāo)組件的類名稱。(屬于直接Intent)

如果 component這個(gè)屬性有指定的話,將直接使用它指定的組件。指定了這個(gè)屬性以后,Intent的其它所有屬性都是可選的。

例如,啟動(dòng)第二個(gè)Activity時(shí),我們可以這樣來寫:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {//創(chuàng)建一個(gè)意圖對象Intent intent = new Intent();//創(chuàng)建組件,通過組件來響應(yīng)ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);intent.setComponent(component); startActivity(intent); } });

如果寫的簡單一點(diǎn),監(jiān)聽事件onClick()方法里可以這樣寫:

Intent intent = new Intent();//setClass函數(shù)的第一個(gè)參數(shù)是一個(gè)Context對象//Context是一個(gè)類,Activity是Context類的子類,也就是說,所有的Activity對象,都可以向上轉(zhuǎn)型為Context對象//setClass函數(shù)的第二個(gè)參數(shù)是一個(gè)Class對象,在當(dāng)前場景下,應(yīng)該傳入需要被啟動(dòng)的Activity類的class對象intent.setClass(MainActivity.this, SecondActivity.class);startActivity(intent)

再簡單一點(diǎn),可以這樣寫:(當(dāng)然,也是最常見的寫法)

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

2、Action(動(dòng)作):用來表現(xiàn)意圖的行動(dòng)

? 當(dāng)日常生活中,描述一個(gè)意愿或愿望的時(shí)候,總是有一個(gè)動(dòng)詞在其中。比如:我想“做”三個(gè)俯臥撐;我要“寫” 一封情書,等等。在Intent中,Action就是描述做、寫等動(dòng)作的,當(dāng)你指明了一個(gè)Action,執(zhí)行者就會(huì)依照這個(gè)動(dòng)作的指示,接受相關(guān)輸入,表現(xiàn)對應(yīng)行為,產(chǎn)生符合的輸出。在Intent類中,定義了一批量的動(dòng)作,比如ACTION_VIEW,ACTION_PICK等, 基本涵蓋了常用動(dòng)作。加的動(dòng)作越多,越精確。

? Action 是一個(gè)用戶定義的字符串,用于描述一個(gè) Android 應(yīng)用程序組件,一個(gè) Intent Filter 可以包含多個(gè) Action。在 AndroidManifest.xml 的Activity 定義時(shí),可以在其 <intent-filter > 節(jié)點(diǎn)指定一個(gè) Action列表用于標(biāo)識 Activity 所能接受的“動(dòng)作”。

3、category(類別):用來表現(xiàn)動(dòng)作的類別

Category屬性也是作為<intent-filter>子元素來聲明的。例如:

<intent-filter><action android:name="com.vince.intent.MY_ACTION"></action><category android:name="com.vince.intent.MY_CATEGORY"></category> <category android:name="android.intent.category.DEFAULT"></category> </intent-filter>

Action 和category通常是放在一起用的,所以這里一起介紹一下。我們來先來舉一個(gè)例子:

新建一個(gè)工程文件smyh006_Intent01,在默認(rèn)文件的基礎(chǔ)之上,新建文件SecondActicity.java和activity_second.xml。

緊接著,我們要到清單文件中進(jìn)行注冊,打開AndroidManifest.xml,添加SecondActivity的action和category的過濾器:

<activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.smyh006intent01.MY_ACTION"/><category android:name="android.intent.category.DEFAULT" /></intent-filter> </activity>

上方代碼,表示SecondActicity可以匹配第4行的MY_ACTION這個(gè)動(dòng)作,此時(shí),如果在其他的Acticity通過這個(gè)action的條件來查找,那SecondActicity就具備了這個(gè)條件。類似于相親時(shí),我要求對方有哪些條件,然后對方這個(gè)SecondActicity恰巧滿足了這個(gè)條件(夠通俗了吧)。

注:如果沒有指定的category,則必須使用默認(rèn)的DEFAULT(即上方第5行代碼)。

也就是說:只有<action>和<category>中的內(nèi)容同時(shí)能夠匹配上Intent中指定的action和category時(shí),這個(gè)活動(dòng)才能響應(yīng)Intent。如果使用的是DEFAULT這種默認(rèn)的category,在稍后調(diào)用startActivity()方法的時(shí)候會(huì)自動(dòng)將這個(gè)category添加到Intent中。

現(xiàn)在來修改MainActivity.java中按鈕的點(diǎn)擊事件,代碼如下:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {//啟動(dòng)另一個(gè)Activity,(通過action屬性進(jìn)行查找)Intent intent = new Intent();//設(shè)置動(dòng)作(實(shí)際action屬性就是一個(gè)字符串標(biāo)記而已)intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)startActivity(intent); } });

上方代碼中,也可以換成下面這種簡潔的方式:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {//啟動(dòng)另一個(gè)Activity,(通過action屬性進(jìn)行查找)Intent intent = new Intent("com.example.smyh006intent01.MY_ACTION");//方法: android.content.Intent.Intent(String action) startActivity(intent); } });

上方第5行代碼:在這個(gè)Intent中,我并沒有指定具體哪一個(gè)Activity,我只是指定了一個(gè)action的常量。所以說,隱式Intent的作用就表現(xiàn)的淋漓盡致了。此時(shí),點(diǎn)擊MainActicity中的按鈕,就會(huì)跳到SecondActicity中去。

上述情況只有SecondActicity匹配成功。如果有多個(gè)組件匹配成功,就會(huì)以對話框列表的方式讓用戶進(jìn)行選擇。我們來詳細(xì)介紹一下:

我們新建文件ThirdActicity.java和activity_third.xml,然后在清單文件AndroidManifest.xml中添加ThirdActivity的action和category的過濾器:

<activity android:name=".ThirdActivity"><intent-filter><action android:name="com.example.smyh006intent01.MY_ACTION"/><category android:name="android.intent.category.DEFAULT" /></intent-filter> </activity>

此時(shí),運(yùn)行程序,當(dāng)點(diǎn)擊MainActivity中的按鈕時(shí),彈出如下界面:

相信大家看到了這個(gè)界面,應(yīng)該就一目了然了。于是我們可以做出如下總結(jié):

在自定義動(dòng)作時(shí),使用activity組件時(shí),必須添加一個(gè)默認(rèn)的類別

具體的實(shí)現(xiàn)為:

<intent-filter><action android:name="com.example.action.MY_ACTION"/><category android:name="android.intent.category.DEFAULT"/> </intent-filter>

如果有多個(gè)組件被匹配成功,就會(huì)以對話框列表的方式讓用戶進(jìn)行選擇。

每個(gè)Intent中只能指定一個(gè)action,但卻能指定多個(gè)category;類別越多,動(dòng)作越具體,意圖越明確(類似于相親時(shí),給對方提了很多要求)。

目前我們的Intent中只有一個(gè)默認(rèn)的category,現(xiàn)在可以通過intent.addCategory()方法來實(shí)現(xiàn)。修改MainActivity中按鈕的點(diǎn)擊事件,代碼如下:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {//啟動(dòng)另一個(gè)Activity,(通過action屬性進(jìn)行查找)Intent intent = new Intent();//設(shè)置動(dòng)作(實(shí)際action屬性就是一個(gè)字符串標(biāo)記而已)intent.setAction("com.example.smyh006intent01.MY_ACTION"); //方法:Intent android.content.Intent.setAction(String action)intent.addCategory("com.example.smyh006intent01.MY_CATEGORY");startActivity(intent); } });

既然在Intent中增加了一個(gè)category,那么我們要在清單文件中去聲明這個(gè)category,不然程序?qū)o法運(yùn)行。代碼如下:

<activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.smyh006intent01.MY_ACTION"/><category android:name="android.intent.category.DEFAULT" /><category android:name="com.example.smyh006intent01.MY_CATEGORY" /></intent-filter> </activity>

此時(shí),點(diǎn)擊MainActicity中的按鈕,就會(huì)跳到SecondActicity中去。

總結(jié)如下:

自定義類別: 在Intent添加類別可以添加多個(gè)類別,那就要求被匹配的組件必須同時(shí)滿足這多個(gè)類別,才能匹配成功。操作Activity的時(shí)候,如果沒有類別,須加上默認(rèn)類別

4、data(數(shù)據(jù)):表示與動(dòng)作要操縱的數(shù)據(jù)

  • Data屬性是Android要訪問的數(shù)據(jù),和action和Category聲明方式相同,也是在中。
  • 多個(gè)組件匹配成功顯示優(yōu)先級高的; 相同顯示列表。

Data是用一個(gè)uri對象來表示的,uri代表數(shù)據(jù)的地址,屬于一種標(biāo)識符。通常情況下,我們使用action+data屬性的組合來描述一個(gè)意圖:做什么

使用隱式Intent,我們不僅可以啟動(dòng)自己程序內(nèi)的活動(dòng),還可以啟動(dòng)其他程序的活動(dòng),這使得Android多個(gè)應(yīng)用程序之間的功能共享成為了可能。比如應(yīng)用程序中需要展示一個(gè)網(wǎng)頁,沒有必要自己去實(shí)現(xiàn)一個(gè)瀏覽器(事實(shí)上也不太可能),而是只需要條用系統(tǒng)的瀏覽器來打開這個(gè)網(wǎng)頁就行了。

【實(shí)例】打開指定網(wǎng)頁:

MainActivity.java中,監(jiān)聽器部分的核心代碼如下:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);Uri data = Uri.parse("http://www.baidu.com");intent.setData(data); startActivity(intent); }});

當(dāng)然,上方代碼也可以簡寫成:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); }});

第4行代碼:指定了Intent的action是 Intent.ACTION_VIEW,表示查看的意思,這是一個(gè)Android系統(tǒng)內(nèi)置的動(dòng)作;

第5行代碼:通過Uri.parse()方法,將一個(gè)網(wǎng)址字符串解析成一個(gè)Uri對象,再調(diào)用intent的setData()方法將這個(gè)Uri對象傳遞進(jìn)去。

當(dāng)點(diǎn)擊按鈕時(shí),將跳到如下界面:

此時(shí), 調(diào)用的是系統(tǒng)默認(rèn)的瀏覽器,也就是說,只調(diào)用了這一個(gè)組件。現(xiàn)在如果有多個(gè)組件得到了匹配,應(yīng)該是什么情況呢?

我們修改修改清單文件中對SecondAcivity的聲明:

<activity android:name=".SecondActivity"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="http" android:host="www.baidu.com"/> </intent-filter> </activity>

現(xiàn)在,SecondActivity也匹配成功了,我們運(yùn)行程序,點(diǎn)擊MainActicity的按鈕時(shí),彈出如下界面供我們選擇:

我們可以總結(jié)如下:

  • 當(dāng)Intent匹配成功的組件有多個(gè)時(shí),顯示優(yōu)先級高的組件,如果優(yōu)先級相同,顯示列表讓用戶自己選擇
  • 優(yōu)先級從-1000至1000,并且其中一個(gè)必須為負(fù)的才有效

注:系統(tǒng)默認(rèn)的瀏覽器并沒有做出優(yōu)先級聲明,其優(yōu)先級默認(rèn)為正數(shù)。

優(yōu)先級的配置如下:

在清單文件中修改對SecondAcivity的聲明,即增加一行代碼,通過來android:priority設(shè)置優(yōu)先級,如下:

<activity android:name=".SecondActivity"><intent-filter android:priority="-1"><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="http" android:host="www.baidu.com"/> </intent-filter> </activity>

注:

Data屬性的聲明中要指定訪問數(shù)據(jù)的Uri和MIME類型。可以在元素中通過一些屬性來設(shè)置:

android:scheme、android:path、android:port、android:mimeType、android:host等,通過這些屬性來對應(yīng)一個(gè)典型的Uri格式scheme://host:port/path。例如:http://www.google.com。

5、type(數(shù)據(jù)類型):對于data范例的描寫

如果Intent對象中既包含Uri又包含Type,那么,在<intent-filter>中也必須二者都包含才能通過測試。

Type屬性用于明確指定Data屬性的數(shù)據(jù)類型或MIME類型,但是通常來說,當(dāng)Intent不指定Data屬性時(shí),Type屬性才會(huì)起作用,否則Android系統(tǒng)將會(huì)根據(jù)Data屬性值來分析數(shù)據(jù)的類型,所以無需指定Type屬性。

data和type屬性一般只需要一個(gè),通過setData方法會(huì)把type屬性設(shè)置為null,相反設(shè)置setType方法會(huì)把data設(shè)置為null,如果想要兩個(gè)屬性同時(shí)設(shè)置,要使用Intent.setDataAndType()方法。

【任務(wù)】:data+type屬性的使用 【實(shí)例】:播放指定路徑的mp3文件。

具體如下:

新建工程文件smyh006_Intent02,MainActivity.java中按鈕監(jiān)聽事件部分的代碼如下:

button.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);Uri data = Uri.parse("file:///storage/sdcard0/平凡之路.mp3");//設(shè)置data+type屬性intent.setDataAndType(data, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)startActivity(intent); } });

代碼解釋:

第6行:"file://"表示查找文件,后面再加上我的小米手機(jī)存儲卡的路徑:/storage/sdcard0,再加上具體歌曲的路徑。

第8行:設(shè)置data+type屬性  

運(yùn)行后,當(dāng)點(diǎn)擊按鈕時(shí),效果如下:

上方界面中,使用的是小米系統(tǒng)默認(rèn)的音樂播放器。

6、extras(擴(kuò)展信息):擴(kuò)展信息

是其它所有附加信息的集合。使用extras可以為組件提供擴(kuò)展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個(gè)

動(dòng)作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。

7、Flags(標(biāo)志位):期望這個(gè)意圖的運(yùn)行模式

一個(gè)程序啟動(dòng)后系統(tǒng)會(huì)為這個(gè)程序分配一個(gè)task供其使用,另外同一個(gè)task里面可以擁有不同應(yīng)用程序的activity。那么,同一個(gè)程序能不能擁有多個(gè)task?這就涉及到加載activity的啟動(dòng)模式,這個(gè)需要單獨(dú)講一下。

注:android中一組邏輯上在一起的activity被叫做task,自己認(rèn)為可以理解成一個(gè)activity堆棧。

三、Activity的啟動(dòng)模式:(面試注意)

Activity有四種啟動(dòng)模式:standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中activity標(biāo)簽的屬性android:launchMode中設(shè)置該activity的加載模式。

  • standard模式:默認(rèn)的模式,以這種模式加載時(shí),每當(dāng)啟動(dòng)一個(gè)新的活動(dòng),必定會(huì)構(gòu)造一個(gè)新的Activity實(shí)例放到返回棧(目標(biāo)task)的棧頂,不管這個(gè)Activity是否已經(jīng)存在于返回棧中;
  • singleTop模式:如果一個(gè)以singleTop模式啟動(dòng)的activity的實(shí)例已經(jīng)存在于返回桟的桟頂,那么再啟動(dòng)這個(gè)Activity時(shí),不會(huì)創(chuàng)建新的實(shí)例,而是重用位于棧頂?shù)哪莻€(gè)實(shí)例,并且會(huì)調(diào)用該實(shí)例的onNewIntent()方法將Intent對象傳遞到這個(gè)實(shí)例中;

注:如果以singleTop模式啟動(dòng)的activity的一個(gè)實(shí)例已經(jīng)存在于返回桟中,但是不在桟頂,那么它的行為和standard模式相同,也會(huì)創(chuàng)建多個(gè)實(shí)例;

  • singleTask模式:這種模式下,每次啟動(dòng)一個(gè)activity時(shí),系統(tǒng)首先會(huì)在返回棧中檢查是否存在該活動(dòng)的實(shí)例,如果存在,則直接使用該實(shí)例,并把這個(gè)活動(dòng)之上的所有活動(dòng)統(tǒng)統(tǒng)清除;如果沒有發(fā)現(xiàn)就會(huì)創(chuàng)建一個(gè)新的活動(dòng)實(shí)例;

  • singleInstance模式:總是在新的任務(wù)中開啟,并且這個(gè)新的任務(wù)中有且只有這一個(gè)實(shí)例,也就是說被該實(shí)例啟動(dòng)的其他activity會(huì)自動(dòng)運(yùn)行于另一個(gè)任務(wù)中。當(dāng)再次啟動(dòng)該activity的實(shí)例時(shí),會(huì)重新調(diào)用已存在的任務(wù)和實(shí)例。并且會(huì)調(diào)用這個(gè)實(shí)例的onNewIntent()方法,將Intent實(shí)例傳遞到該實(shí)例中。和singleTask相同,同一時(shí)刻在系統(tǒng)中只會(huì)存在一個(gè)這樣的Activity實(shí)例。(singleInstance即單實(shí)例)

注:前面三種模式中,每個(gè)應(yīng)用程序都有自己的返回棧,同一個(gè)活動(dòng)在不同的返回棧中入棧時(shí),必然是創(chuàng)建了新的實(shí)例。而使用singleInstance模式可以解決這個(gè)問題,在這種模式下會(huì)有一個(gè)單獨(dú)的返回棧來管理這個(gè)活動(dòng),不管是哪一個(gè)應(yīng)用程序來訪問這個(gè)活動(dòng),都公用同一個(gè)返回棧,也就解決了共享活動(dòng)實(shí)例的問題。(此時(shí)可以實(shí)現(xiàn)任務(wù)之間的切換,而不是單獨(dú)某個(gè)棧中的實(shí)例切換)

其實(shí)我們不在清單文件中設(shè)置,只在代碼中通過flag來設(shè)置也是可以的,如下:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);//相當(dāng)于singleTaskintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent); Intent intent = new Intent(MainActivity.this,SecondActivity.class);//相當(dāng)于singleTopintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);

三、Intent的常見應(yīng)用:

1、打開指定網(wǎng)頁:(直接復(fù)制的上面的代碼)

MainActivity.java中,監(jiān)聽器部分的核心代碼如下:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);//方法:android.content.Intent.Intent(String action)Uri data = Uri.parse("http://www.baidu.com");intent.setData(data); startActivity(intent); } });

當(dāng)然,上方代碼也可以簡寫成:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); } });

第4行代碼:指定了Intent的action是 Intent.ACTION_VIEW,表示查看的意思,這是一個(gè)Android系統(tǒng)內(nèi)置的動(dòng)作;

第5行代碼:通過Uri.parse()方法,將一個(gè)網(wǎng)址字符串解析成一個(gè)Uri對象,再調(diào)用intent的setData()方法將這個(gè)Uri對象傳遞進(jìn)去。

或者可以寫成:

button1.setOnClickListener(new OnClickListener() { @Overridepublic void onClick(View v) {Uri uri = Uri.parse("http://www.baidu.com");Intent intent = new Intent(Intent.ACTION_VIEW,uri);//方法: android.content.Intent.Intent(String action, Uri uri) startActivity(intent); } });

2、打電話:

【方式一】打開撥打電話的界面:

Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);

運(yùn)行程序后,點(diǎn)擊按鈕,顯示如下界面:

【方式二】直接撥打電話:

Intent intent = new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent);

要使用這個(gè)功能必須在配置文件中加入權(quán)限:(加一行代碼)

<uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="16" /> <uses-permission android:name="android.permission.CALL_PHONE"/>

3、發(fā)送短信:

【方式一】打開發(fā)送短信的界面:action+type

Intent intent = new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms-sms");intent.putExtra("sms_body", "具體短信內(nèi)容"); //"sms_body"為固定內(nèi)容startActivity(intent);

【方式二】打開發(fā)短信的界面(同時(shí)指定電話號碼):action+data

Intent intent = new Intent(Intent.ACTION_SENDTO);intent.setData(Uri.parse("smsto:18780260012"));intent.putExtra("sms_body", "具體短信內(nèi)容"); //"sms_body"為固定內(nèi)容 startActivity(intent);

4、播放指定路徑音樂:action+data+type

Intent intent = new Intent(Intent.ACTION_VIEW);Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3"); 路徑也可以寫成:"/storage/sdcard0/平凡之路.mp3"intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)startActivity(intent);

5、卸載程序:action+data(例如點(diǎn)擊按鈕,卸載某個(gè)應(yīng)用程序,根據(jù)包名來識別)

注:無論是安裝還是卸載,應(yīng)用程序是根據(jù)包名package來識別的。

Intent intent = new Intent(Intent.ACTION_DELETE);Uri data = Uri.parse("package:com.example.smyh006intent01");intent.setData(data);startActivity(intent);

6、安裝程序:action+data+type

Intent intent = new Intent(Intent.ACTION_VIEW);Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk")); //路徑不能寫成:"file:///storage/sdcard0/···"intent.setDataAndType(data, "application/vnd.android.package-archive"); //Type的字符串為固定內(nèi)容startActivity(intent);

注:第2行的路徑不能寫成:"file:///storage/sdcard0/···",不然報(bào)錯(cuò)如下:

疑問:通過下面的這種方式安裝程序,運(yùn)行時(shí)為什么會(huì)出錯(cuò)呢?

//通過指定的action來安裝程序 public void installClickTwo(View view){Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk")); //路徑不能寫成:"file:///storage/sdcard0/···"intent.setData(data);startActivity(intent); }

綜上所述,完整版代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context=".MainActivity" ><Button android:id="@+id/button1_browsePage"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="browsePageClick"android:text="打開指定網(wǎng)頁"/> <Button android:id="@+id/button2_openDialPage"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="openDialPageClick"android:text="打開撥號面板"/><Button android:id="@+id/button3_dialPhone"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="dialPhoneClick"android:text="直接撥打指定號碼"/><Button android:id="@+id/button4_openMsgPage"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="openMsgPageClick"android:text="打開發(fā)短信的界面"/><Button android:id="@+id/button5_sendMsg"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="sendMsgClick"android:text="給指定的人發(fā)短信"/> <Button android:id="@+id/button6_playMusic"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="playMusicClick"android:text="播放指定路徑音樂"/> <Button android:id="@+id/button7_uninstall"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="uninstallClick"android:text="卸載程序"/> <Button android:id="@+id/button8_install"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="installClick"android:text="安裝程序"/> </LinearLayout>

MainActivity.java代碼如下:

package com.example.zhouheng; import java.io.File; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.View; public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//打開指定網(wǎng)頁public void browsePageClick(View view){Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com/"));startActivity(intent); } //打開撥號面板public void openDialPageClick(View view){Intent intent = new Intent(Intent.ACTION_DIAL);intent.setData(Uri.parse("tel:10086"));startActivity(intent); }//直接撥打指定號碼public void dialPhoneClick(View view){Intent intent = new Intent(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:10086"));startActivity(intent); }//打開發(fā)短信的界面:action+typepublic void openMsgPageClick(View view){Intent intent = new Intent(Intent.ACTION_VIEW);intent.setType("vnd.android-dir/mms-sms");intent.putExtra("sms_body", "具體短信內(nèi)容"); //"sms_body"為固定內(nèi)容startActivity(intent); } //打開發(fā)短信的界面(指定電話號碼):action+datapublic void sendMsgClick(View view){Intent intent = new Intent(Intent.ACTION_SENDTO);intent.setData(Uri.parse("smsto:18780260012"));intent.putExtra("sms_body", "具體短信內(nèi)容"); //"sms_body"為固定內(nèi)容 startActivity(intent); } //播放指定路徑音樂public void playMusicClick(View view){Intent intent = new Intent(Intent.ACTION_VIEW);Uri uri = Uri.parse("file:///storage/sdcard0/平凡之路.mp3"); //路徑也可以寫成:"/storage/sdcard0/平凡之路.mp3"intent.setDataAndType(uri, "audio/mp3"); //方法:Intent android.content.Intent.setDataAndType(Uri data, String type)startActivity(intent);} //卸載某個(gè)應(yīng)用程序,根據(jù)包名來識別public void uninstallClick(View view){Intent intent = new Intent(Intent.ACTION_DELETE);Uri data = Uri.parse("package:com.example.smyh006intent01");intent.setData(data);startActivity(intent);} //安裝某個(gè)應(yīng)用程序,根據(jù)apk的文件名來識別public void installClick(View view){Intent intent = new Intent(Intent.ACTION_VIEW);Uri data = Uri.fromFile(new File("/storage/sdcard0/AndroidTest/smyh006_Intent01.apk")); //路徑不能寫成:"file:///storage/sdcard0/···"intent.setDataAndType(data, "application/vnd.android.package-archive"); //Type的字符串為固定內(nèi)容startActivity(intent);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}

運(yùn)行后,主界面如下:

轉(zhuǎn)載于:https://www.cnblogs.com/zhouheng0918/p/9209327.html

總結(jié)

以上是生活随笔為你收集整理的Android Intent基本使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。