Android學習筆記(三四):再談Intent(上)-一些知識

來源:互聯網
上載者:User

在Android學習筆記(七):多個Activity和Intent中,我們先在學會了如何使用intent在代碼中喚起activity。此處作深一步地學習。

什麼是Intent

intent是對一個操作處理的抽象描述。context可以在使用startActivity(intent)來launch一個actvivity,就如我們在學習筆記(七)中的處理,也是最常用的方式,將activity在我們的應用中整合;可以在通過sentBroast(intent)來廣播給任何有興趣的BroadcastReceiver,可以通過startService(intent)啟動服務;可以通過bindService(Intent,
ServiceConnection, int)和一個後台服務進行通訊。

基本要素

intent有兩個基礎的要求,一是action,一是data;也即採用哪些處理動作,並提供傳遞給這個處理動作的資料。action是一個常量,例如ACTION_VIEW用於查看資源,ACTION_EDIT 用於編輯資源,ACTION_PICK是進行選擇。data是Uri的方式。例如ACTION_DIAL content://contacts/people/1,ACTION_VIEW  tel:123,ACTION_EDIT  content://contacts/people/1,ACTION_VIEW 
content://contacts/people/等等。其中通過Android系統的案頭icon來launch的action為ACTION_MAIN是不帶data。

看看Intent的建構函式之一:intent = new Intent(Intent.ACTION_SENDTO ,uri)。這是我們在筆記(七)中的例子,包含兩個重要的資訊:action(處理的動作)和data(向處理動作傳遞的參數)。

Intent的基本屬性

我們可以在minifest.xml檔案,或者代碼編寫中,通過intent的方法來設定屬性。

category:主activity採用LAUNCHER category,這表明它將在launcher menu中顯示,其他的一般使用DEFAULT或者ALTERNATIVE。看一個在manifest.xml的例子。

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.commonsware.android.skeleton">
    <application>
        <activity android:name=".Now" android:label="Now">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

相關的intent的資訊在<intent-filter>中定義。intent-filter屬於activity。這個例子我們在intent-filter的定義表明這是一個應用中的main activity,採用category是LAUNCHER,也即在Android的主menu中有一個icon。
可一有多個action和多個category在intent-filter中,這表明這個component,也就是這個activity可處理多種類型的intent。

MIME type:指出Uri資料類型,即所需要操作的資源的類型。如果我們希望採用第三方代碼提供的服務,MIME type/data是這是很好的方式。

<activity android:name=".TourViewActivity">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.item/vnd.commonsware.tour" />
  </intent-filter>
</activity>

這是app中的一個非主activity,他的Uri類型為vnd.android.cursor.item/vnd.commonsware.tour。

component:intent所需接收的activity的class類型,然而一般我們都不需要進行設定,Android會根據intent的資訊,例如action,data/MIME type,以及catergory來自動選擇所需的組建。如果這個屬性設定,將強制指定,除非我們非常瞭解確知,或者有特殊的指定(不使用系統預設而採用我們的自己的處理,而我們的處理應當在我們的app內,component的名字在我們當前的app中是私人),一般不對此進行設定。

extras:通過bundle方式傳遞給的資訊,例如傳遞一個email的訊息內容等。

接收器Receiver

有時希望在服務中觸發某些處理,而不是喚起一個activity,有些時候,喚起是有條件選擇的,在條件A是喚起acivityM,在條件B時,喚起activity N。對於這些情況,可使用繼承BroadcastReceiver介面來處理。

這種intent接收器是一次性的,用於接收intent,特別是這種廣播方式的intent(例如廣播電能不足),然後action。action通常是會launch另外的intent以此觸發actvivty,服務,以及其他componment的處理邏輯。
BroadcastReceiver只有一個方法onReceive(),在manifest中添加一個receiver的方式為:

<receiver android:name=".MyIntentReceiverClassName" />

BroadcastReceiver將一直alive直至執行onReceive(),執行完即生命週期結束,不會再使用。這在我們使用時要注意的,例如不要在onReceive()中有什麼callback之類的處理,換而言之就是不要和service幫定,也不要用於開啟一個dialog。

如果要觸發long-lived的component,例如某個actvity或者service,需要receiver和這些activity同等的存活時間。這種情況,不要在Manifest中對receiver進行定義,而是在代碼中。在activity的onResume()中調用registerReceiver() ,來表明對某個intent的興趣,在onPause()中調用unregisterReceiver(),來表明不需要這些intents,因為我們不需要在pause的時候接收intent,這樣可以節省開支。注意不要在Activity.onSaveInstanceState()中unregister,這樣在使用者通過back鍵返回時並不會被調用。

相關連結:我的Android開發相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.