Cloneable clone new Intent(this)
setAction COMPONENT_NAME addCategory addFlags
getIntent parseUri setData category identified launchFlags
package component schemas extra
getAction getData getScheme getType getCategories
getExtra
Activity
public boolean dispatchTouchEvent(MotionEvent ev) {
2739 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
2740 onUserInteraction();
2741 }
2742 if (getWindow().superDispatchTouchEvent(ev)) {
2743 return true;
2744 }
2745 return onTouchEvent(ev);
2746 }
2747
PhoneWindow
superDispatchTouchEvent
@Override
1718 public boolean superDispatchTouchEvent(MotionEvent event) {
1719 return mDecor.superDispatchTouchEvent(event);
1720 }
mDecor = DecorView
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {
public boolean superDispatchTouchEvent(MotionEvent event) {
2369 return super.dispatchTouchEvent(event);
2370 }
superDispatchTouchEvent
dispatchTouchEvent
ViewGroup
dispatchTouchEvent
Activity
startActivity
startActivityForResult
Instrumentation
executeStartActivity
ActivityManagerNative.startActivity
startActivityForResult
上面這個方法就是Intent獲取到ActivityInfo的核心,它的大致過程如下:
首先獲取Intent的Component對象,如果不爲空,說明指定了Component,
那麼就直接通過Component找到ActivityInfo列表,並且這個列表size爲1,
所以這個ActivityInfo就是指定需要跳轉的組件。
如果沒有指定Component,那就是隱式Intent調用,
接着獲取Intent傳遞的需要跳轉的包名。
如果包名爲空,則會通過ActivityIntentResolver等進行模糊匹配,
比如根據Action、Category等。
如果包名不爲空,則直接根據包名來獲取到對應的ActivityInfo對象,
而mActivities就是PMS存儲的activity信息表。
// 獲取Intent的Component對象
ComponentName comp = intent.getComponent();
if (comp == null) {
if (intent.getSelector() != null) {
intent = intent.getSelector();
comp = intent.getComponent();
}
}
// 不爲空,是顯式Intent,直接獲取到ActivityInfo返回
if (comp != null) {
final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
final ActivityInfo ai = getActivityInfo(comp, flags, userId);
if (ai != null) {
final ResolveInfo ri = new ResolveInfo();
ri.activityInfo = ai;
list.add(ri);
}
return list;
}
// 爲空,是隱式Intent
synchronized (mPackages) {
final String pkgName = intent.getPackage();
if (pkgName == null) {
// 代碼省略
return result;
}
// 通過包名獲取到Package對象
final PackageParser.Package pkg = mPackages.get(pkgName);
if (pkg != null) {
// 在獲取到ActivityInfo對象
return filterIfNotSystemUser(
mActivities.queryIntentForPackage(
intent, resolvedType, flags, pkg.activities, userId),
userId);
}
return new ArrayList<ResolveInfo>();
}
}
PackageManagerService
queryIntentActivities
componentName
mPackages.get pkgName
PackageManager
ContextWraper
@Override
public PackageManager getPackageManager() {
return mBase.getPackageManager();
}
ActivityThread
getPackageManager
ServiceManager.getService
SystemServer SystemServer run
mSystemServiceManager = new SystemServiceManager(mSystemContext);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
PackageManagerService main函數創建出來,並通過ServiceManager
addService