Android Intent

Intent

Intent的做用

  1. 用於啓動一個Activity,Service,BroadcastReceiver組件
  2. 用於被啓動組件之間的信息交換(例如兩個Activity能夠把交換的數據封裝成Bundle對象,而後使用Intent來攜帶Bundle對象.)

Intent的屬性

Component屬性

Intent的Component的屬性接受一個ComponentName對象.
ComponentName須要指定包名和類名.java

//ManinActivity.java中爲按鍵綁定的監聽器
ComponentName comp = new ComponentName(ManinActivity,this, SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
startActivity(intent);

指定Component屬性的Intent明確它要啓動哪一個組件,所以這種Intent被稱爲顯式Intent;
沒有指定Component屬性的Intent被稱爲隱式Intent.android

Action屬性和Category屬性

  1. Action屬性表明表明該Intent所要完成的一個抽象動做;
    Category屬性表明爲Action增長額外的附加類別消息,Action屬性和Category屬性常常結合使用.
  2. 因爲是隱式Intent,從代碼中沒法看出下面程序要去啓動哪一個Activity.所以,須要啓動哪一個Activity取決於Activity配置中<intent-filter>.
//ManinActivity.java中爲按鍵綁定的監聽器
Intent intent = new Intent();
intent.setAction(MainActivity.CRAZYIT_ACTION);
intent.addCategory(MainActivity.CRAZYIT_CATEGORY);
startActivity(intent)

所以被啓動的目標Activity中的配置文件中應該有以下信息:app

//AndroidManifest.xml配置文件中SecondActivity的配置信息
//上面代碼的MainActivity的路徑是在\org\crazyit\intent\MainActivity.java
<activity android:name=".SecondActivity"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="org.crazyit.intent.action.CRAZYIT_ACTION" />
        <category android:name="org.crazyit.intent.category.CRAZYIT_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    < /intent-filter>
< /activity>

==說明==this

  • <inter-filter .../>元素是AndroidManifest.xml文件中<activity .../>元素的子元素,<activity .../>爲應用程序配置Activity,<inter-filter .../>配置該Activity所能相應的Intent.
  • <intent-filter .../>元素中能夠包含如下子元素:code

    • 0-N個<action .../>子元素
    • 0-N個<category .../>子元素
    • 0-1個<data .../>子元素
  • <intent-filter .../>也能夠時<service .../>和<receiver .../>的子元素
  • 一個Intent對象最多隻能包括一個Action屬性,經過setAction(String str)方法來設置屬性;一個Intent對象能夠包括多個Category屬性,經過調用addCategory(String str)方法來添加屬性.
  • 由於程序建立一個Intent時,該Intent會默認啓動Category的屬性值Intent.CATEGORY_DEFAULT(常量值爲android.intent.category.DEFAULT)常量的組件,因此在被啓動的Activity中的配置文件中須要添加:
<category android:name="android.intent.category.DEFAULT" />
  • 注意:在AndroidManifest.xm文件中的<intent-filter .../>下能夠有多個<action .../>,可是在XXXActivity.java中只能設置一個Action屬性,能夠有多個Category屬性.
  • Intent對象不只能夠啓動應用程序自身內的組件,還能夠啓動其餘應用程序的組件和系統自帶的程序的組件.

Data屬性和Type屬性

  1. Data屬性用於向Action屬性提供操做的數據,接受一個Uri對象.xml

    • Uri對象一般是以下形式的字符串:
      schem://host:port/path

      例如:content://www.baidu.com:88/test,content是schem部分;www.baidu.com是host部分;88是port部分;test是path部分.對象

  2. Type屬性用於指定該Data屬性指定Uri對應的MIME類型,只要符合abc/xyz格式的字符串便可.
  3. Data屬性與Type屬性的關係:字符串

    • 若是Intent先設置Data屬性,後設置Type屬性,那麼Type屬性會覆蓋Data屬性
    • 若是Intent先設置Type屬性,後設置Data屬性,那麼Data屬性會覆蓋Type屬性
    • 若是但願Intent既有Data屬性又有Type屬性,能夠調用setDataAndType()方法.
  4. 在AndroidManifest.xml文件中爲組件聲明Data,Type屬性經過<data .../>元素,格式以下:string

    • mimeType:該組件所匹配的Intent的Type屬性;
    • scheme:該組件所匹配的Intent的Data屬性的scheme部分;
    • host:該組件所匹配的Intent的Data屬性的host部分;
    • port:該組件所匹配的Intent的Data屬性的port部分;
    • path:該組件所匹配的Intent的Data屬性的path部分;
    • pathPrefix:該組件所匹配的Intent的Data屬性的path前綴;
    • pathPattern:該組件所匹配的Intent的Data屬性的path字符串模板
<data android:mimeType=""
    android:scheme=""
    android:host=""
    android:port=""
    android:path=""
    android:pathPrefix=""
    android:pathPattern=""
    />
  • ==說明==:it

    • 至於Type屬性: XXXActivity中Intent經過setType()設置的Type屬性 和 AndroidManifest.xm中被啓動Activity的<intent-filter .../>元素的<data .../>子元素的mimeType屬性徹底相同.
    • 至於Data屬性: 因爲Uri對象能夠分爲schem,host,port,path部分, 所以不須要與被啓動組件的<intent-filter .../>中<data .../>子元素的android:schem,android:host,android:port,android:path徹底知足.

      • 若是被啓動組件B的<data .../>中只指定了android:scheme屬性,那麼只要組件A中Intent的Data屬性的scheme部分與其相同,就能夠啓動組件B.
      • 同理,也能夠只指定android:scheme和android:host;
      • 也能夠只指定android:scheme,android:host和android:port;
      • 也能夠只指定android:scheme,android:host和android:path;
      • 也能夠指定android:scheme,android:host,android:port和android:path;
      • 可是不能只有android:port沒有android:host;也不能只有android:path沒有android:host
      • 若是但願<data .../>下的子元素能正常起做用.必須配置一個<action .../>子元素,不過<action .../>的android:name能夠時任意的字符串.
//MainActivity.java
Intent intent = new Intent();
String data = "http://wwww.crazyit.org";
Uri uri = Uri.parse(data);

// intent.setAction(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);
//對應的被啓動Activity的AndroidManifest.xml文件
<activity
    android:icon="drawable/ic_type"
    android:name="SecondActivity"
    <intent-filter>
        <action android:name="xxx"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data
            android:scheme="http"
            /*能夠省略*/
            android:host="www.crazyit.org"
        />
    </intent-filter>
/activity>

Extra屬性

該屬性用於多個Action之間的數據交流,其屬性值應該是一個Bundle對象,能夠經過Intent在不一樣Activity之間進行數據交換,


Flag屬性

該屬性用於爲對應的Intent添加一些額外的控制標識,能夠調用intent 的addFlags()方法添加控制標識.

相關文章
相關標籤/搜索