Intent源碼原理初探

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

 
 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章