Android開發—Intent對象

Intent在Android開發中非常重要,其封裝了我們想開啓其他組件的“意圖”,大概意思就是:如果我們需要開啓其他的組件,其他的Service,或者我們在啓動其他組件的同時需要交換一些數據,這個時候就需要將我們的數據封裝在Intent中,然後通過這個Intent來啓動。

Android應用程序中有三個重要的組件:Activity,Service,BroadcastReceiver,這三個組件的啓動,我們都是通過Intent來啓動,而Intent裏面就封裝着我們可能要交換的數據。

Intent屬性大致包含:Component,Action,Category,Data,Extra,Flag這6種屬性

1、Component

通過Component來啓動一個Activity(啓動SecondActivity)

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

2、Action,Category屬性以及intent-filter配置

Action指得是一個行爲或者指一個操作,而Category屬性可以爲Action增加一些附加的信息,通常兩個屬性是結合一起用。

Action和Category其本質就是一個字符串,系統也有提供一些Action,比如:Intent.ACTION_VIEW,這個就表示一個查看的行爲,但是誰來查看,或者查看誰,Action這個字符串並不管。

這個取決於在AndroidMainfest.xml文件裏面Activity對應的Intent-filter屬性,哪一個Activity裏面的Intent-filter配置了ACTION_VIEW這個屬性,那麼這個Activity就有可能被啓動。

示例一下通過Action來啓動Activity:

Intent intent1 = new Intent();
intent1.setAction(Intent.ACTION_VIEW);
startActivity(intent1);

上面的代碼沒有像Component那樣,顯式的指定要啓動哪一個Activity,只是給Intent指定了一個Action,那麼現在哪一個Activity來響應這個啓動呢?

那麼就看AndroidMainfest.xml裏面,哪一個Activity的Inten-filter裏面配置了這個action,哪一個Activity就負責響應這個啓動,

比如我現在在AndroidMainfest.xml裏面設置一個ThirdActivity.xml的配置

        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
            </intent-filter>
        </activity>

在xml裏面給ThirdActivity裏面配置了同樣的字段:Intent.ACTION_VIEW,此時ThirdActivity就負責我們剛纔啓動的響應。

上面在xml的activity裏面配置了action屬性,那麼還有Category屬性怎麼使用呢?

前面我們有記錄,Category屬性是配合着action屬性一起用的,所以,如果我們要使用Category屬性的話,還是按照上面的套路,然後使用接口添加上Catrgory屬性即可。

final String CRAZYIT_CATEGORY = "org.crazyit.intent.category.CRAZYIT_CATEGORY";
Intent intent1 = new Intent();
intent1.setAction(Intent.ACTION_VIEW);
intent1.addCategory(CRAZYIT_CATEGORY);
startActivity(intent1);

這個時候我們給我們要啓動的Activity設置了兩個要求:①有Intent.ACTION_VIEW②有“org.crazyit.intent.category.CRAZYIT_CATEGORY”這個Category。那麼此時負責響應的Activity裏面的<intent-filter>就需要有這兩個組件。這個時候我們改一下之前的xml文件:

        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

那麼這個時候,因爲我們的ThirdActivity裏面既有對應的action組件也有對應的category組件,所以當我們進行跳轉的時候,ThirdActivity就負責響應我們這一次跳轉。

3、Data、Type屬性和Intent-filter配置

Data屬性通常用於向Action提供數據,Data屬性接收一個Uri對象。
一個Uri對象類似這種:
content://com.android.contacts/contacts/1
Tip:contacts翻譯:聯絡人

Uri的通常就是兩個部分來組成
例如上面這個Uri,
content:就代表數據類型,本次指向的是一個信息
//com.android.contacts/contacts/1:後面這個就代表具體的數據值,這個Uri具體的數據值,表示的就是聯繫人列表裏面的第一個聯繫人,

除了Data屬性,還有的就是Type屬性。
Type屬性其實就是指Data的數據類型了,但是其實如果你不設置Type屬性的話,只要有Data,Android系統就會自己去解析Data的值,因爲Uri裏面冒號前面就代表數據類型。
所以其實當你不設置Data的時候,Type屬性才生效。

我們在具體使用的時候呢就可以將Action 屬性和Data屬性結合起來:
<ACTION_VIEW, content://com.android.contacts/contacts/1>

ACTION_VIEW代表的就是查看操作,後面的Data就是代表查看聯繫人裏面的第一個聯繫人

那在代碼裏面我們怎麼設置Data屬性呢?前面幾個我們已經寫過了設置Action的操作,設置Data也是有專門的接口的:

String data = "content://com.android.contacts/contacts/1"
Uri uri = Uri.parse(data);
intent.setData(uri);

4、Extra屬性

Extra屬性用來在 Activity之間交換數據用的。Extra其實對應的就是一個Bundle對象,而我們的Bundle對象其實就類似於一個Map,可以讓我們插入,查找一些key-value之類的。

在我看來,甚至整個屬性可以直接替換爲:Bundle,Intent之間交換數據就是通過Bundle來封裝,給Bundle裏面封裝好數據之後,直接將Bundle放到intent裏面。

Bundle裏面提供一些接口,可以讓我們 將數據放進Bundle:

        class Person implements Serializable{
            //
        }
        Bundle bundle = new Bundle();
        bundle.putString("One_String","This is a String in Bundle");
        bundle.putInt("Two_int",10);
        bundle.putSerializable("Three_Object",new Person());

我們可以使用:put***();來放進去一些int,String,long類型等等,這些標準數據類型,

也可以通過putSerializable來放進去一些我們自己的自定義類型,但是這個類型必須是可序列化的。

有坑:關於這個可序列化,如果的自定義類聲明成了內部類,那你的外部類必須也是可序列化的,因爲內部類會持有一份外部類的引用,所以如果你只想將傳遞類型的類聲明爲可序列化的話,就得將這個類聲明爲外部類。

現在我們的Bundle封裝完了,然後直接使用接口將Bundle塞進Intent就可以了:

intent.putExtras(bundle);

塞進去之後,就可以啓動Activity了。

當我們啓動了另一個Activity之後,我們想拿到這些數據的話,應該怎麼拿呢?

就是將上面的put***接口全部換成get***接口,然後參數只留第一個就ok了,返回值就是你想要的值,如果沒有的話,就返回空。

這個就是Intent對象最後一個Extra屬性了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章