2012年5月15日 星期二

Intent and Intent Filter in Android

內容涵蓋:
1.在App中開啟另一個App
2.了解Intent-Filter的使用

參考:
http://developer.android.com/reference/android/content/Intent.html
http://developer.android.com/guide/topics/intents/intents-filters.html


首先從Intent說起

先看一下官方文檔:


  • Explicit Intents have specified a component (via setComponent(ComponentName) or setClass(Context, Class)), which provides the exact class to be run. Often these will not include any other information, simply being a way for an application to launch various internal activities it has as the user interacts with the application.
  • Implicit Intents have not specified a component; instead, they must include enough information for the system to determine which of the available components is best to run for that intent.



  • 可以看到Intent分為兩個種類
    一種為  Explicit Intents
    另一種為  Implicit Intents

    查一下英文字典:
    Explicit  adj. 明顯的
    Implicit  adj. 暗示的

    從文檔可看出 Explicit Intent 使用方式很明確 就是指定 component 讓系統去調用
    而 Implicit Intent就是提供"資訊", 讓系統決定去調用哪個component


    本文要講的重點是第二種: Implicit Intent

    而要了解Implicit Intent必須先了解 Intent-Filter
     Intent-Filter由三個元素組成
    1.action
    2.category
    3.data
    而從Filter本身的含意 : 過濾,篩選
    可以判斷 Intent-Filter可以指定上列三種元素的屬性
    進而讓符合條件的Intent通過, 進而執行該Activity or Service or..
    因此可以得知 Implicit Intent 要提供的資訊就是上面這三種


    如果寫過打電話的功能,  一定看過以下代碼



    Intent _Intent = new Intent();
    _Intent.setAction(Intent.ACTION_DIAL);
    _Intent.setData(Uri.parse("tel:0123456789"));
    startActivity(_Intent);



    而其中的 Intent.ACTION_DIAL   中就是Android中撥號的Activity中所指定的Action


    那如何使用自己的Action呢?
    以下為代碼


    <activity
         android:name=".intent.IntentDemoActivity"
         android:label="@string/app_name" >
         <intent-filter>
              <action android:name="maca.demo.GOTO_INTENT" />
              <category android:name="android.intent.category.DEFAULT" />
         </intent-filter>
    </activity>


    指定action為"maca.demo.GOTO_INTEN"
    而如何調用就和之前一樣


    Intent _Intent = new Intent();
    _Intent.setAction("maca.demo.GOTO_INTENT");
    startActivity(_Intent);


    而category和data也就是同樣的原理 這裡僅附上代碼

    xml:

    <intent-filter>
        <action android:name="maca.demo.GOTO_INTENT" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="maca.demo.category.INTENT" />
        <data android:scheme="hello" android:mimeType="text/plain"></data>
    </intent-filter>



    java:


    Intent _Intent = new Intent();
    _Intent.setAction("maca.demo.GOTO_INTENT");
    _Intent.addCategory("maca.demo.category.INTENT");
    _Intent.setDataAndType(Uri.parse("hello://nihowma"), "text/plain");
    startActivity(_Intent);




    沒有留言:

    張貼留言