zoukankan      html  css  js  c++  java
  • android设置多个类似APP其中的一个为默认

    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 5222
    05-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选择。

    androidframeworksasecorejavacomandroidinternalappResolverActivity.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
    " + re);
                        }
                    }
                }
            }
    
            if (intent != null) {
                startActivity(intent);
            }
        }
  • 相关阅读:
    用到的一些方法
    Android屏蔽Home键
    Android自定义GridView显示一行,并且可以左右滑动
    模糊匹配字母大小写
    Android四大组件之Content Provider的学习
    用于小数据存储的SharedPreferences
    Android小知识点
    【译】用C/C++操作链表
    和好友的QQ记录,多关注哈需要关怀的人
    岁不待人_20080321
  • 原文地址:https://www.cnblogs.com/antoon/p/4490750.html
Copyright © 2011-2022 走看看