Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Intent與<intent-filter>

Intent與<intent-filter>

編輯:關於Android編程

耐心看完,你就能搞明白怎麼Intent一個系統程序了。 @Intent結構 private String mAction; private Uri mData; private String mType; private String mPackage; private ComponentName mComponent; private int mFlags; private HashSet<String> mCategories; private Bundle mExtras; private Rect mSourceBounds; @<intent-filter>元素與屬性 intent-filter中有三個元素:action、category、data,這三個元素都是可以有多個的。 action和category元素只有android:name一條屬性,而data則有scheme,host,prot,path,pathPrefix,pathPattem,mimeType七條屬性。 @Intent中變量與intent-filter中元素對應關系 action與Intent中的mAction元素相對應; category與Intent中的mCategories相對應; data中的mimeType與Intent中的mType相對應; data中的其余六條則與Intent中的mData相對應。 由此可見,Intent中與intent-filter相關的只有四個參數,mAction、mData、mType、mCategories,而這四個參數對應的操作如下: Intent.setAction(String action); Intent.addCategory(String category); Intent.removeCategory(String category); Intent.setType(String type); Intent.setData(Uri data); Intent.setDataAndType(Uri data, String type); 需要注意的是:setType會清空mData,而setData也會清空mType,如果要同時設置mType和mData則必須用setDataAndType。 這裡的Uri=scheme://host:port/path。 如果沒定義path、port、host則Uri=scheme://。 這裡重點說一下path、pathPrefix和pathPattem: path 用來匹配完整路徑 pathPrefix 用來匹配路徑的開頭部分 pathPattem 用表達式來配置完整路徑,"*"表示0個或多個其前面的字符,"."表示1個任意字符,".*"則可以表示0個或多個任意字符。 @Intent與intent-filter匹配規則 a、Intent定義的Action必須包含在<intent-filter>的Action列表總,若隱式Intent沒有定義Action則系統會報錯。 b、Intent若定義了Category(可多個),則所有Category必須包含在<intent-filter>的Category列表裡,若Intent未定義Category則<intent-filter>中是否定義了Category都不受影響,<intent-filter>中必須包含<category android:name="android.intent.category.DEFAULT">才能通過startActivity啟動,Service和Broadcast Receiver則不需要。 c、Intent若未定義Type,則其僅匹配同樣沒有定義Type的intent-filter,若定義了則必須在intent-filter中有相匹配的項。 d、Intent若未定義Uri,則其僅匹配同樣沒有定義uri的intent-filter,若定義了則必須在intent-filter中有相匹配的項。 @顯式與隱式Intent 顯式Intent通常用於程序內部間的組件通信,已經明確的定義了目標組件的信息,所以不需要系統決策用哪個目標組件,如: Intent intent = new Intent(Context packageContext, Class<?> clas); startActivity(intent); 隱式Intent不指明目標組件的class,只定義希望的Action、Category和Data,由系統決定使用哪個目標組件。這也是Android系統的一大亮點。 第三種,可以用PackageManager獲取系統中安裝的所有包,然後打開: PackageManager packageManager = getBaseContext().getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); resolveInfoList = packageManager.queryIntentActivities(intent, 0);//根據intent來搜索 Intent intent = new Intent(); intent.setComponent(new ComponentName(String pkg, String cls)); startActivity(intent); @前面忘了說了,還要下載一份android源代碼,然後在packages/apps目錄下找到你要調用的程序,查看他的Manifest.xml。  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved