05-09 17:01:13.547: I/ActivityManager(3003): START u0 {act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://www.baidu.com cmp=android/com.android.internal.app.ResolverActivity} from pid 522205-09 17:01:13.587: I/ActivityManager(3003): Start proc system:ui for activity android/com.android.internal.app.ResolverActivity: pid=15544 uid=1000 gids={41000, 3002, 3001, 3003, 1028, 1015, 1023, 1021, 3004, 3005, 1000, 3009, 1010}05-09 17:01:14.557: I/ActivityManager(3003): Displayed android/com.android.internal.app.ResolverActivity: +975ms

从ActivityManger输出Log可以知道是ResolverActivity处理app选择。

android\frameworks\base\core\java\com\android\internal\app\ResolverActivity.java

protected void onCreate(Bundle savedInstanceState) {        // Use a specialized prompt when we're handling the 'Home' app startActivity()        final int titleResource;        final Intent intent = makeMyIntent();        final Set<String> categories = intent.getCategories();        if (Intent.ACTION_MAIN.equals(intent.getAction())                && categories != null                && categories.size() == 1                && categories.contains(Intent.CATEGORY_HOME)) {            titleResource = com.android.internal.R.string.whichHomeApplication;//选择主屏幕应用        } else {            titleResource = com.android.internal.R.string.whichApplication;//选择要使用的应用:        }        onCreate(savedInstanceState, intent, getResources().getText(titleResource),                null, null, true);    }
 protected void onCreate(Bundle savedInstanceState, Intent intent,            CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList,            boolean alwaysUseOption) {        setTheme(R.style.Theme_DeviceDefault_Light_Dialog_Alert);        super.onCreate(savedInstanceState);        try {            mLaunchedFromUid = ActivityManagerNative.getDefault().getLaunchedFromUid(                    getActivityToken());        } catch (RemoteException e) {            mLaunchedFromUid = -1;        }        mPm = getPackageManager();        mAlwaysUseOption = alwaysUseOption;        mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns);        AlertController.AlertParams ap = mAlertParams;        ap.mTitle = title;        mPackageMonitor.register(this, getMainLooper(), false);        mRegistered = true;        final ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);        mIconDpi = am.getLauncherLargeIconDensity();        mIconSize = am.getLauncherLargeIconSize();        mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList, mLaunchedFromUid);//获取APP列表
int count = mAdapter.getCount(); if (mLaunchedFromUid < 0 || UserHandle.isIsolated(mLaunchedFromUid)) { // Gulp! finish(); return; } else if (count > 1) { ap.mView = getLayoutInflater().inflate(R.layout.resolver_list, null); mListView = (ListView) ap.mView.findViewById(R.id.resolver_list); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(this); mListView.setOnItemLongClickListener(new ItemLongClickListener()); if (alwaysUseOption) { mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); } } else if (count == 1) { startActivity(mAdapter.intentForPosition(0)); mPackageMonitor.unregister(); mRegistered = false; finish(); return; } else { ap.mMessage = getResources().getText(R.string.noApplications); } setupAlert(); if (alwaysUseOption) { final ViewGroup buttonLayout = (ViewGroup) findViewById(R.id.button_bar); if (buttonLayout != null) { buttonLayout.setVisibility(View.VISIBLE); mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once); } else { mAlwaysUseOption = false; } // Set the initial highlight if there was a preferred or last used choice final int initialHighlight = mAdapter.getInitialHighlight(); if (initialHighlight >= 0) { mListView.setItemChecked(initialHighlight, true); onItemClick(null, null, initialHighlight, 0); // Other entries are not used } } }

点击“始终”按钮,设置默认程序

public void onButtonClick(View v) {        final int id = v.getId();        startSelected(mListView.getCheckedItemPosition(), id == R.id.button_always);        dismiss();    }    void startSelected(int which, boolean always) {        if (isFinishing()) {            return;        }        ResolveInfo ri = mAdapter.resolveInfoForPosition(which);        Intent intent = mAdapter.intentForPosition(which);        onIntentSelected(ri, intent, always);        finish();    }    protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {        if (mAlwaysUseOption && mAdapter.mOrigResolveList != null) {            // Build a reasonable intent filter, based on what matched.            IntentFilter filter = new IntentFilter();            if (intent.getAction() != null) {                filter.addAction(intent.getAction());            }            Set<String> categories = intent.getCategories();            if (categories != null) {                for (String cat : categories) {                    filter.addCategory(cat);                }            }            filter.addCategory(Intent.CATEGORY_DEFAULT);            int cat = ri.match&IntentFilter.MATCH_CATEGORY_MASK;            Uri data = intent.getData();            if (cat == IntentFilter.MATCH_CATEGORY_TYPE) {                String mimeType = intent.resolveType(this);                if (mimeType != null) {                    try {                        filter.addDataType(mimeType);                    } catch (IntentFilter.MalformedMimeTypeException e) {                        Log.w("ResolverActivity", e);                        filter = null;                    }                }            }            if (data != null && data.getScheme() != null) {                // We need the data specification if there was no type,                // OR if the scheme is not one of our magical "file:"                // or "content:" schemes (see IntentFilter for the reason).                if (cat != IntentFilter.MATCH_CATEGORY_TYPE || (!"file".equals(data.getScheme())                                && !"content".equals(data.getScheme()))) {//注意这里排除了"file://", "content://"                    filter.addDataScheme(data.getScheme());                    // Look through the resolved filter to determine which part                    // of it matched the original Intent.                    Iterator<PatternMatcher> pIt = ri.filter.schemeSpecificPartsIterator();                    if (pIt != null) {                        String ssp = data.getSchemeSpecificPart();                        while (ssp != null && pIt.hasNext()) {                            PatternMatcher p = pIt.next();                            if (p.match(ssp)) {                                filter.addDataSchemeSpecificPart(p.getPath(), p.getType());                                break;                            }                        }                    }                    Iterator<IntentFilter.AuthorityEntry> aIt = ri.filter.authoritiesIterator();                    if (aIt != null) {                        while (aIt.hasNext()) {                            IntentFilter.AuthorityEntry a = aIt.next();                            if (a.match(data) >= 0) {                                int port = a.getPort();                                filter.addDataAuthority(a.getHost(), port >= 0 ? Integer.toString(port) : null);                                break;                            }                        }                    }                    pIt = ri.filter.pathsIterator();                    if (pIt != null) {                        String path = data.getPath();                        while (path != null && pIt.hasNext()) {                            PatternMatcher p = pIt.next();                            if (p.match(path)) {                                filter.addDataPath(p.getPath(), p.getType());                                break;                            }                        }                    }                }            }            if (filter != null) {                final int N = mAdapter.mOrigResolveList.size();                ComponentName[] set = new ComponentName[N];                int bestMatch = 0;                for (int i=0; i<N; i++) {                    ResolveInfo r = mAdapter.mOrigResolveList.get(i);                    set[i] = new ComponentName(r.activityInfo.packageName, r.activityInfo.name);                    if (r.match > bestMatch) bestMatch = r.match;                }                if (alwaysCheck) {                    getPackageManager().addPreferredActivity(filter, bestMatch, set, intent.getComponent());//设置默认                } else {                    try {                        AppGlobals.getPackageManager().setLastChosenActivity(intent,                                intent.resolveTypeIfNeeded(getContentResolver()),                                PackageManager.MATCH_DEFAULT_ONLY,                                filter, bestMatch, intent.getComponent());                    } catch (RemoteException re) {                        Log.d(TAG, "Error calling setLastChosenActivity\n" + re);                    }                }            }        }        if (intent != null) {            startActivity(intent);        }    }

更多相关文章

  1. Android(安卓)调用相册或相机选择图片
  2. Android(安卓)GridView
  3. android 用代码设置margin属性,textView加粗
  4. Android使用继承View类来绘图
  5. android 修改默认APN
  6. 2.3.1 Android(安卓)Studio使用记录——1.下载安装,相关配置
  7. Android(安卓)模拟器中AVD路径的修改
  8. Android开发环境配置教程
  9. Android(安卓)打开系统设置

随机推荐

  1. Android全屏中adjustResize的失效的解决
  2. Android(安卓)多线程
  3. Android核心分析(18)-----Android电话系统
  4. Android基础练习
  5. android studio编译错误但是不提示哪里错
  6. Android(安卓)动画学习笔记
  7. android 跳转 activity 出现错误 you do
  8. Android判断是Wifi还是4G网络代码
  9. Android加载动画库
  10. Android(安卓)JNI和NDK学习(2)--编程入门