這篇文章將為大家詳細(xì)講解有關(guān)Android中Intent怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司長期為成百上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為陽新企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站設(shè)計,陽新網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
1. 什么是隱式Intent?
Intent是Android中比較重要的組件,常用來啟動一個新的Activity或者Service、廣播某個事件,以及在Android組件之間傳遞數(shù)據(jù)。通過Intent來啟動新的Activity或者Service通常有兩種方法,一種是顯示啟動,另一種是隱式啟動。
顯示啟動就是在明確指出要啟動的Activity或者Service的類或者包名。例如:
Intent intent = newIntent(this, PlayerActivity.class); startActivity(intent); Intent intent = new Intent(); intent.setClass(this,PlayerActivity.class); startActivity(intent); Intent intent = new Intent(); intent.setClassName(“com.jhuster.videoplayer”,“com.jhuster.videoplayer.PlayerActivity”); startActivity(intent);
隱式啟動則是不明確指定啟動哪個Activity或者Service,而是通過設(shè)置Action、Data、Category,讓系統(tǒng)來篩選出合適的目標(biāo)。
例如撥打電話:
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse(“tel:021-80961111”)); startActivity(intent);
系統(tǒng)接收到隱式啟動請求后,會根據(jù)系統(tǒng)中各個Activity在AndroidManifest.xml文件中聲明的<intent-filter>來比較和判斷是否匹配當(dāng)前的Intent請求的。
因此,如果我們希望PlayerActivity能夠被系統(tǒng)隱式啟動,則首先需要在AndroidManifest.xml文件中為該Activity添加<intent-filter>.
2. 為PlayerActivity添加<intent-filter>
<intent-filter>的標(biāo)簽有很多,這里只介紹和添加最基本且最常用的三個標(biāo)簽,分別是<action>,<category>和<data>。
2.1 添加<action>
這個標(biāo)簽是必須添加的,可以自己定義,也可以使用系統(tǒng)預(yù)定義的變量,Android系統(tǒng)默認(rèn)定義了很多action,具體可以查看SDK文檔,或者Google一下“android.intent.action.”。
這里,因為我們的類是用來“播放視頻”的,因此可以使用系統(tǒng)預(yù)定義的:android.intent.action.VIEW,它表示需要啟動某個Activity顯示指定的數(shù)據(jù)(包括圖片、視頻、文檔等)。
添加了<action>后的<activity>如下所示:
<activity android:name="com.jhuster.videoplayer.PlayerActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> </intent-filter> </activity>
2.2 添加<category>
category代表類別,定義了Activity的類別,Activity可以設(shè)置一個或者多個category標(biāo)簽。常用的一般有3個:DEFAULT,HOME,LAUNCHER
DEFAULT 默認(rèn)動作 HOME 設(shè)置為本地桌面應(yīng)用 LAUNCHER 本APP的啟動Activity
本應(yīng)用中我們使用DEFAULT類別即可,DEFAULT也是category最常用的選項。
添加了category后的<activity>如下所示:
<activityandroid:name="com.jhuster.videoplayer.PlayerActivity"> <intent-filter> <actionandroid:name="android.intent.action.VIEW" /> <categoryandroid:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
2.3 添加<data>
data 代表數(shù)據(jù)源,是<intent-filter>中最復(fù)雜的標(biāo)簽,因為不同的Activity支持的數(shù)據(jù)來源和類型多種多樣,所以需要通過詳細(xì)的data標(biāo)簽信息來指明。
data 標(biāo)簽有很多屬性,包括:
android:host: 指定主機(jī)名,例如:google.com android:port: 制定主機(jī)端口,例如: 80 android:path: 指定URL的有效路徑值,例如: /index/examples android:mimeType: 指定組件可以執(zhí)行的數(shù)據(jù)類型,例如:p_w_picpath/jpeg,video/* android:scheme: 指定特定的模式,例如:content,http
這里,假設(shè)我們的視頻播放器支持多種數(shù)據(jù)來源,包括:本地視頻文件,本地媒體URL,網(wǎng)絡(luò)視頻流(HTTP、RTMP、RTSP協(xié)議),另外,假設(shè)我們的視頻播放器只支持mp4和3gpp兩種文件格式。
那么,下面我們來添加兩種最常用的<data>標(biāo)簽,scheme和mimeType,并且解釋每條標(biāo)簽對應(yīng)的是怎樣的一種數(shù)據(jù)來源或者數(shù)據(jù)格式。
(1) <data android:scheme="xxx"/>
這里的xxx可以是:file,content,網(wǎng)絡(luò)協(xié)議(HTTP,RTMP、RTSP等)
本應(yīng)用中我們給PlayerActivity的<Intent-filter>中添加:
<data android:scheme="file"/> <data android:scheme="content"/> <data android:scheme="http"/> <data android:scheme="rtsp"/>
添加了這樣幾條data標(biāo)簽項之后,如果隱式Intent中的數(shù)據(jù)來源URL是以“file://”、“content://”、“http://”、“rtsp://”開頭的URL資源,都會隱式地啟動我們的PlayerActivity。
例如,其他的Activity可以通過下面的方法來隱式啟動我們的PlayerActivity.
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.fromFile(new File("/sdcard/test.3gp"))); startActivity(intent);
Uri.fromFile這條語句會把指定的文件位置轉(zhuǎn)換為以“file://”開頭的Uri對象,如上述例子最終得到的URL為:“file:///sdcard/test.3gp”
同理,可以通過Uri.parse來轉(zhuǎn)換我們常見的網(wǎng)絡(luò)地址字符串為Uri對象,例如:
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://ticktick.blog.51cto.com/test.mp4")); startActivity(intent);
(2) <data android:mimeType="xxx"/>
mimeType用來設(shè)置數(shù)據(jù)類型,例如圖像數(shù)據(jù)(p_w_picpath/png或者p_w_picpath/*),視頻數(shù)據(jù)(video/mp4或者video/*),如果使用*代表匹配所有的子類型。
MIME TYPE是互聯(lián)網(wǎng)的一種標(biāo)記數(shù)據(jù)類型的標(biāo)準(zhǔn),現(xiàn)在已經(jīng)支持非常多的類型了,這里我不一一列舉,大家可以在Google上搜索一下。
本應(yīng)用中我們假設(shè)需要支持的是mp4和3gpp兩種類型,那么,我們可以添加這樣兩條 mimeType :
<data android:mimeType="video/3gpp"/> <data android:mimeType="video/mp4" />
那么,其他的Activity就可以通過下面的方法來隱式啟動我們的PlayerActivity. 注意,當(dāng)<Intent-filter>已經(jīng)添加了mimeType之后,隱式Intent必須設(shè)置Type參數(shù)才能匹配到該Activity,所以建議使用setDataAndType方法,而不是單一的setData方法。
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.3gp")),"video/3gpp"); startActivity(intent);
當(dāng)然,這里的"video/3gpp"也可以寫成:"video/*",但這樣可能會匹配到一些不支持3gpp的播放器。
(3) 小結(jié)
添加了<data>標(biāo)簽后的<intent-filter>如下所示:
<activity android:name="com.jhuster.videoplayer.PlayerActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="file"/> <data android:scheme="content"/> <data android:scheme="http"/> <data android:scheme="rtsp"/> <data android:scheme="rtmp"/> <data android:mimeType="video/3gpp" /> <data android:mimeType="video/mp4" /> </intent-filter> </activity>
3. 在PlayerActivity中獲取參數(shù)
通過上面的介紹,我們已經(jīng)知道了怎樣添加<intent-filter>以及怎樣通過隱式Intent來調(diào)用我們的PlayerActivity,那么,下面我們還要了解如何在PlayerActivity中解析來自隱式Intent的參數(shù)。
其實,Intent提供了很多方法可以Get相關(guān)的參數(shù)信息,例如:
public String getAction(); public Uri getData(); public String getScheme(); public String getType();
上述方法分別可以獲取Intent的Action,Data Uri,Scheme和MimeType值。
對于“file://”開頭的Uri對象,我們可以通過Uri.getPath方法得到去除了“file://”前綴的具體文件地址。例如: “file:///sdcard/test.mp4”則可以轉(zhuǎn)換為實際的“/sdcard/test.mp4”。
對于網(wǎng)絡(luò)碼流,例如:“http://”、“rtsp://”等開頭的Uri,則可以直接通過toString()方法轉(zhuǎn)換為實際地址的字符串。
而對于“content://”開頭的URI對象,一般是從系統(tǒng)的媒體數(shù)據(jù)庫中檢索出來的結(jié)果,因此需要反向查找得到實際的文件地址,這里提供一個函數(shù)進(jìn)行轉(zhuǎn)換。
public static String getVideoPath(Context context, Uri uri) { Uri videopathURI = uri; if (uri.getScheme().toString().compareTo("content") == 0 ) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA); videopathURI = Uri.parse(cursor.getString(column_index)); return videopathURI.getPath(); } } else if (uri.getScheme().compareTo("file") == 0 ) { return videopathURI.getPath(); } return videopathURI.toString(); }
關(guān)于“Android中Intent怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
當(dāng)前標(biāo)題:Android中Intent怎么用
當(dāng)前網(wǎng)址:http://muchs.cn/article20/ghihjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站收錄、App開發(fā)、企業(yè)建站、電子商務(wù)、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)