耐心看完,你就能搞明白怎麼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。