學習Intenr

本文內容參考於:http://www.cnblogs.com/engine1984/p/4146621.html

我覺得上面這篇博文寫得很不錯,再加上一些自己的知識整合而成。

一、什麼是Intent

  • Android中提供了Intent機制來協助應用間的交互與通訊,或者採用更準確的說法是,Intent不僅可用於應用程序之間,也可用於應用程序內部的activity, service和broadcast receiver之間的交互。Intent這個英語單詞的本意是“目的、意向、意圖”。
  • 通過Intent,你的程序可以向Android表達某種請求或者意願,Android會根據意願的內容選擇適當的組件來響應。

二、Inten啓動組件的方法

 Intent可以啓動一個Activity,也可以啓動一個Service,還可以發起一個廣播Broadcasts。具體方法如下:

組件名稱 方法名稱
Activity();

startActvity()

startActivityForResult()
Service();

startService()

bindService()
Broadcasts();

sendBroadcasts()

sendOrderedBroadcasts( )

sendStickyBroadcasts( )

  • 使用Context.startActivity() 或 Activity.startActivityForResult(),傳入一個intent來啓動一個activity。使用 Activity.setResult(),傳入一個intent來從activity中返回結果。
  • 將intent對象傳給Context.startService()來啓動一個service或者傳消息給一個運行的service。將intent對象傳給 Context.bindService()來綁定一個service。
  • 將intent對象傳給 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等廣播方法,則它們被傳給 broadcast receiver。

三、Intent的屬性:

component(組件)、Action(行爲)、Category(分類)、Data(數據)、Type(類型)、Extra(擴展信息)、Flags(標誌位)

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

相比與顯式Intent,隱式Intnet則含蓄了許多,它並不明確指出我們想要啓動哪一個活動,而是指定一系列更爲抽象的action和category等信息,然後交由系統去分析這個Intent,並幫我們找出合適的活動去啓動。

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

Component屬性明確指定Intent的目標組件的類名稱。(屬於直接Intent),當啓動第二個Activity時,可以這樣寫:

     bt1.setOnClickListener(new OnClickListener() {            

              public void onClick(View v) {
            
                 Intent intent = new Intent();      //創建一個意圖對象
                 
                 ComponentName component = new ComponentName(MainActivity.this, SecondActivity.class);   //創建組件,通過組件來響應

                intent.setComponent(component);
                 startActivity(intent);    //執行            
             }
         });

也可以簡化成:

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

2、Action(行爲):用來表示意圖的行動

Action是指Intent要完成的動作,在Intent類中,定義了一批量的動作,比如ACTION_VIEW,ACTION_PICK等。Action 是一個用戶定義的字符串,用於描述一個 Android 應用程序組件,一個 Intent Filter 可以包含多個Action。在 AndroidManifest.xml 的Activity 定義時,可以在其 <intent-filter >節點指定一個 Action列表用於標識 Activity 所能接受的“動作”。

        <activity
            android:name=".TwoActy"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="songsong.com.intenttext.SecondActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

3、category(類別):用來表現動作的類別

Category屬性也是作爲<intent-filter>子元素來聲明的,Action 和category通常是放在一起用的,,只有<action>和<category>中的內容同時能夠匹配上Intent中指定的action和category時,這個活動才能響應Intent。

接下來做個【點擊按鈕返回主頁面】的demo:

     bt1.setOnClickListener(new OnClickListener() {            

              public void onClick(View v) {
            
                 Intent intent = new Intent();      //創建一個意圖對象

          intent.setAction(Intent.ACTION_MAIN);// 添加Action屬性                
                 intent.addCategory(Intent.CATEGORY_HOME);// 添加Category屬性
                startActivity(intent);    //執行            
             }
         });


接下來我要寫一個【隱式Intent啓動另一個Activity】的Demo:

AndroidManifest.xml內容如下,有MainActivity和SecondActivity兩個Activiy。

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".SecondActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="songsong.com.intenttext.SecondActivity" />

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

MainActivity.java代碼如下,通過bt1單擊按鈕事件啓動另一個Activity。

 bt1.setOnClickListener(new OnClickListener() {            

              public void onClick(View v) {
            
                 Intent intent = new Intent("songsong.com.intenttext.SecondActivity");   
                 
                startActivity(intent);    //執行            
             }
         });

每個Intent中只能指定一個action,但卻能指定多個category;類別越多,動作越具體,意圖越明確。


4、data(數據):表示與動作要操縱的數據

  • Data屬性是Android要訪問的數據,和action和Category聲明方式相同,也是在<intent-filter>中

Data是用一個uri對象來表示的,uri代表數據的地址,屬於一種標識符。通常情況下,我們使用action+data屬性的組合來描述一個意圖:做什麼

使用隱式Intent,我們不僅可以啓動自己程序內的活動,還可以啓動其他程序的活動,這使得Android多個應用程序之間的功能共享成爲了可能。現在【應用程序中需要展示一個網頁】,沒有必要自己去實現一個瀏覽器(事實上也不太可能),而是只需要條用系統的瀏覽器來打開這個網頁就行了。

MainActivity.java的代碼:

 bt1.setOnClickListener(new OnClickListener() {            

              public void onClick(View v) {
            
                 Intent intent = new Intent(Intent.ACTION_VIEW);
                 
                 intent.setData(Uri.parse("http://www.baidu.com"));

                 startActivity(intent);    //執行            
             }
         });
接下來看看效果:


總結:

  • 當Intent匹配成功的組件有多個時,顯示優先級高的組件,如果優先級相同,顯示列表讓用戶自己選擇。
  • 優先級從-1000至1000,並且其中一個必須爲負的纔有效。

注:系統默認的瀏覽器並沒有做出優先級聲明,其優先級默認爲正數。

優先級的配置如下:

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

        <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屬性的聲明中要指定訪問數據的Uri和MIME類型。可以在<data>元素中通過一些屬性來設置:

android:scheme、android:path、android:port、android:mimeType、android:host等。


5、type(數據類型):對於data範例的描寫

如果Intent對象中既包含Uri又包含Type,那麼,在<intent-filter>中也必須二者都包含才能通過測試。
Type屬性用於明確指定Data屬性的數據類型或MIME類型,但是通常來說,當Intent不指定Data屬性時,Type屬性纔會起作用,否則Android系統將會根據Data屬性值來分析數據的類型,所以無需指定Type屬性。

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


6、extras(擴展信息):擴展信息
是其它所有附加信息的集合。使用extras可以爲組件提供擴展信息,比如,如果要執行“發送電子郵件”這個動作,可以將電子郵件的標題、正文等保存在extras裏,傳給電子郵件發送組件。

7、Flags(標誌位):期望這個意圖的運行模式

一個程序啓動後系統會爲這個程序分配一個task供其使用,另外同一個task裏面可以擁有不同應用程序的activity。那麼,同一個程序能不能擁有多個task?這就涉及到加載activity的啓動模式,這個需要單獨講一下。
注:android中一組邏輯上在一起的activity被叫做task,自己認爲可以理解成一個activity堆棧。


——————————————————————————————————————————————————



在最後有些小筆記,還有一些小demo。

1 爲當前Activity創建桌面快捷方式

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

2通過Intent 的Action屬性訪問其他應用程序

         <activity
            android:exported="true" //"是否導出" 可以被其他應用訪問到的,如果是false的話 其他應用就訪問不了
            android:name=".TwoActy">
            <intent-filter>
                <action android:name="songsong.com.intenttext.TwoActy" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


以下是demo

還有代碼:

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt1:
                Intent intent = new Intent(MainActivity.this, TwoActy.class);//顯式啓動TwoActivity
                startActivity(intent);
                break;
            case R.id.bt2:
                Intent intent2 = new Intent();
                intent2.setClassName("com.android.gallery", "com.android.camera.GalleryPicker");//啓動本地相冊應用
                startActivity(intent2);
                break;
            case R.id.bt3:
                Intent intent3 = new Intent(TwoActy.ACTION); //隱式啓動另一個Activity
                startActivity(intent3);
                break;

            case R.id.bt4:
                Intent intent4 = new Intent("songsong.com.app_intent.MainActivity");
                startActivity(intent4);
                break;
            case R.id.bt5:
                Intent intent5 = new Intent(Intent.ACTION_VIEW);
                intent5.setData(Uri.parse("http://www.baidu.com"));
                startActivity(intent5);
                break;
            case R.id.bt6:
                Intent intent6 = new Intent(Intent.ACTION_DIAL);
                intent6.setData(Uri.parse("tel:10086"));
                startActivity(intent6);
                break;
            case R.id.bt7:
                Intent intent7 = new Intent(Intent.ACTION_CALL);
                intent7.setData(Uri.parse("tel:10086"));
                startActivity(intent7);
                break;
            case R.id.bt8:
                Intent intent8 = new Intent(Intent.ACTION_VIEW);
                intent8.setType("vnd.android-dir/mms-sms");
                intent8.putExtra("sms_body", "具體短信內容"); //"sms_body"爲固定內容
                startActivity(intent8);
                break;
            case R.id.bt9:
                Intent intent9 = new Intent(Intent.ACTION_SENDTO);
                intent9.setData(Uri.parse("smsto:13800138000"));
                intent9.putExtra("sms", "具體短信內容"); //"sms_body"爲固定內容
                startActivity(intent9);
                break;




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