Android中Intent怎么用

這篇文章將為大家詳細(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)

營銷型網(wǎng)站建設(shè)