<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                前面在介紹PKMS掃描APK時提到,PKMS將解析得到的Package私有的Activity信息加入到自己的數據結構mActivities中保存。先來回顧一下代碼: **PacakgeManagerService.java::scanPackageLI函數** ~~~ ......//此時APK文件已經解析完成 N =pkg.activities.size();//取出該APK中包含的Activities信息 r =null; for (i=0; i<N; i++) { PackageParser.Activity a = pkg.activities.get(i); a.info.processName = fixProcessName(pkg.applicationInfo.processName, a.info.processName,pkg.applicationInfo.uid); mActivities.addActivity(a,"activity");//①加到mActivities中保存 } ~~~ 上面的代碼中有兩個比較重要的數據結構,如圖4-11所示。 :-: ![](http://img.blog.csdn.net/20150803111124499?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 圖4-11 相關數據結構示意圖 結合代碼,由圖4-11可知: - mActivities為ActivityIntentResolver類型,是PKMS的成員變量,用于保存系統中所有與Activity相關的信息。此數據結構內部有一個mActivities變量,它以ComponetName為Key,保存PackageParser.Activity對象 - 從APK中解析得到的所有和Activity相關的信息(包括在XML中聲明的IntentFilter標簽)都由PacakgeParser.Activity來保存。 前面代碼中調用addActivity函數完成了私有信息的公有化。addActivity函數的代碼如下: **PacakgeManagerService.java::ActivityIntentResolver.addActivity** ~~~ public final voidaddActivity(PackageParser.Activity a, String type) { finalboolean systemApp = isSystemApp(a.info.applicationInfo); //將Component和Activity保存到mActivities中 mActivities.put(a.getComponentName(), a); finalint NI = a.intents.size(); for(int j=0; j<NI; j++) { //ActivityIntentInfo存儲的就是XML中聲明的IntentFilter信息 PackageParser.ActivityIntentInfo intent = a.intents.get(j); if(!systemApp && intent.getPriority() > 0 &&"activity".equals(type)) { //非系統APK的priority必須為0。后續分析中將介紹priority的作用 intent.setPriority(0); } addFilter(intent);//接下來將分析這個函數 } } ~~~ 下面來分析addFilter函數,這里涉及較多的復雜數據結構,代碼如下: **IntentResolver.java::IntentResolver.addFilter** ~~~ public void addFilter(F f) { ...... mFilters.add(f);//mFilters保存所有IntentFilter信息 //除此之外,為了加快匹配工作的速度,還需要分類保存IntentFilter信息 //下邊register_xxx函數的最后一個參數用于打印信息 intnumS = register_intent_filter(f, f.schemesIterator(), mSchemeToFilter," Scheme: "); intnumT = register_mime_types(f, " Type: "); if(numS == 0 && numT == 0) { register_intent_filter(f, f.actionsIterator(), mActionToFilter," Action: "); } if(numT != 0) { register_intent_filter(f, f.actionsIterator(), mTypedActionToFilter, " TypedAction: "); } } ~~~ 正如代碼注釋中所說,為了加快匹配工作的速度,這里使用了泛型編程并定義了較多的成員變量。下面總結一下這些變量的作用(注意,除mFilters為HashSet<F>類型外,其他成員變量的類型都是`HashMap<String, ArrayList<F>>`,其中F為模板參數)。 - mSchemeToFilter:用于保存URI中與schema相關的IntentFilter信息。 - mActionToFilter:用于保存僅設置Action條件的IntentFilter信息。 - TypedActionToFilter:用于保存既設置了Action又設置了Data的MIME類型的IntentFilter信息。 - mFilters:用于保存所有IntentFilter信息 - mWildTypeToFilter:用于保存設置了Data類型類似“image/*”的IntentFilter,但是設置MIME類型類似“Image/jpeg”的不算在此類。 - mTypeToFilter:除了包含mWildTypeToFilter外,還包含那些指明了Data類型為確定參數的IntentFilter信息,例如“image/*”和”image/jpeg“等都包含在mTypeToFilter中。 - mBaseTypeToFilter:包含MIME中Base 類型的IntentFilter信息,但不包括Sub type為“*”的IntentFilter。 不妨舉個例子來說明這些變量的用法。 假設,在XML中聲明一個IntentFilter,代碼如下: ~~~ <intent-filter android:label="test"> <actionandroid:name="android.intent.action.VIEW" /> dataandroid:mimeType="audio/*" android:scheme="http" </intent-filter> ~~~ 那么: - 在mTypedActionToFilter中能夠以“android.intent.action.VIEW”為key找到該IntentFilter。 - 在mWildTypeToFilter和mTypeToFilter中能夠以“audio”為key找到該IntentFilter。 - 在mSchemeToFilter中能夠以”http“為key找到該IntentFilter。 下面來分析Intent匹配查詢工作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看