代码路径:

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

private void rebuildList() {
if (mBaseResolveList != null) {
mCurrentResolveList = mBaseResolveList;
} else {
mCurrentResolveList = mPm.queryIntentActivities(
mIntent, PackageManager.MATCH_DEFAULT_ONLY
| (mAlwaysUseOption ? PackageManager.GET_RESOLVED_FILTER : 0));
// Filter out any activities that the launched uid does not
// have permission for. We don't do this when we have an explicit
// list of resolved activities, because that only happens when
// we are being subclassed, so we can safely launch whatever
// they gave us.
if (mCurrentResolveList != null) {
for (int i=mCurrentResolveList.size()-1; i >= 0; i--) {
ActivityInfo ai = mCurrentResolveList.get(i).activityInfo;
int granted = ActivityManager.checkComponentPermission(
ai.permission, mLaunchedFromUid,
ai.applicationInfo.uid, ai.exported);
if (granted != PackageManager.PERMISSION_GRANTED) {
// Access not allowed!
mCurrentResolveList.remove(i);
}
}
}
}
int N;
if ((mCurrentResolveList != null) && ((N = mCurrentResolveList.size()) > 0)) {
// Only display the first matches that are either of equal
// priority or have asked to be default options.
ResolveInfo r0 = mCurrentResolveList.get(0);
for (int i=1; i<N; i++) {
ResolveInfo ri = mCurrentResolveList.get(i);
if (false) Log.v(
"ResolveListActivity",
r0.activityInfo.name + "=" +
r0.priority + "/" + r0.isDefault + " vs " +
ri.activityInfo.name + "=" +
ri.priority + "/" + ri.isDefault + N);
if (r0.priority != ri.priority ||
r0.isDefault != ri.isDefault) {
while (i < N) {
mCurrentResolveList.remove(i);
N--;
}
}
}
if (N > 1) {
ResolveInfo.DisplayNameComparator rComparator =
new ResolveInfo.DisplayNameComparator(mPm);
Collections.sort(mCurrentResolveList, rComparator);
}

mList = new ArrayList<DisplayResolveInfo>();

// First put the initial items at the top.
if (mInitialIntents != null) {
for (int i=0; i<mInitialIntents.length; i++) {
Intent ii = mInitialIntents[i];
if (ii == null) {
continue;
}
ActivityInfo ai = ii.resolveActivityInfo(
getPackageManager(), 0);
if (ai == null) {
Log.w("ResolverActivity", "No activity found for "
+ ii);
continue;
}
ResolveInfo ri = new ResolveInfo();
ri.activityInfo = ai;
if (ii instanceof LabeledIntent) {
LabeledIntent li = (LabeledIntent)ii;
ri.resolvePackageName = li.getSourcePackage();
ri.labelRes = li.getLabelResource();
ri.nonLocalizedLabel = li.getNonLocalizedLabel();
ri.icon = li.getIconResource();
}
Log.e(TAG,"ResolveListAdapter" + ri.resolvePackageName);
mList.add(new DisplayResolveInfo(ri,
ri.loadLabel(getPackageManager()), null, ii));
}
}

// Check for applications with same name and use application name or
// package name if necessary
r0 = mCurrentResolveList.get(0);
int start = 0;
CharSequence r0Label = r0.loadLabel(mPm);
mShowExtended = false;
// for (int i = 1; i < N; i++) {
// if (r0Label == null) {
// r0Label = r0.activityInfo.packageName;
// }
// //Log.e(TAG,"r0Label" + r0.activityInfo.packageName);
// ResolveInfo ri = mCurrentResolveList.get(i);
// CharSequence riLabel = ri.loadLabel(mPm);
// if (riLabel == null) {
// riLabel = ri.activityInfo.packageName;
// }
// if (riLabel.equals(r0Label)) {
// continue;
// }
// processGroup(mCurrentResolveList, start, (i-1), r0, r0Label);
// r0 = ri;
// r0Label = riLabel;
// start = i;
// }//delete by wangjian 2014.06.19
// // Process last group
// processGroup(mCurrentResolveList, start, (N-1), r0, r0Label);
//******add by wangjian 2014.06.19*****//

if(N == 2){

ResolveInfo r1 = mCurrentResolveList.get(1);

CharSequence r1Label = r1.activityInfo.packageName;

if(r1 != null && r1Label != null){

//Log.v(TAG,"r1Label:" + r1.activityInfo.name);

//Log.v(TAG,"r1Label:" + r1.activityInfo.packageName);

processGroup(mCurrentResolveList, 1, 1, r1, r1Label);

}

}else{

// Log.v(TAG,"r0Label:" + r0.activityInfo.name);

//Log.v(TAG,"r0Label:" + r0.activityInfo.packageName);

processGroup(mCurrentResolveList, 0, 0, r0, r0Label);

}


//***********add code end*************//
}
}

ResolveInfo r1 = mCurrentResolveList.get(1);//从列表中获得自己的启动项

CharSequence r1Label = r1.activityInfo.packageName;//得到自己启动项的包名

ps:以上方法只适合存在两个启动项,一个是默认的系统启动项,一个是自己的app。

关键是这个方法需要注意:processGroup(mCurrentResolveList, 1, 1, r1, r1Label);

这个方法的实现:

private void processGroup(List<ResolveInfo> rList, int start, int end, ResolveInfo ro,
CharSequence roLabel) {
// Process labels from start to i
Log.e(TAG, "processGroup");
int num = end - start+1;
if (num == 1) {//如果num为1默认的把参数roLabel作为启动项,我们要的就是这个效果,当有两个启动项时按下HOME键不要选择,默认的把我们的APP作为启动项.

// No duplicate labels. Use label for entry at start
mList.add(new DisplayResolveInfo(ro, roLabel, null, null));
} else {
mShowExtended = true;
boolean usePkg = false;
CharSequence startApp = ro.activityInfo.applicationInfo.loadLabel(mPm);
if (startApp == null) {
usePkg = true;
}
if (!usePkg) {
// Use HashSet to track duplicates
HashSet<CharSequence> duplicates =
new HashSet<CharSequence>();
duplicates.add(startApp);
for (int j = start+1; j <= end ; j++) {
ResolveInfo jRi = rList.get(j);
CharSequence jApp = jRi.activityInfo.applicationInfo.loadLabel(mPm);
if ( (jApp == null) || (duplicates.contains(jApp))) {
usePkg = true;
break;
} else {
duplicates.add(jApp);
}
}
// Clear HashSet for later use
duplicates.clear();
}
for (int k = start; k <= end; k++) {
ResolveInfo add = rList.get(k);
if (usePkg) {
// Use application name for all entries from start to end-1
mList.add(new DisplayResolveInfo(add, roLabel,
add.activityInfo.packageName, null));
} else {
// Use package name for all entries from start to end-1
mList.add(new DisplayResolveInfo(add, roLabel,
add.activityInfo.applicationInfo.loadLabel(mPm), null));
}
}
}
}

更多相关文章

  1. Android启动画面Splash
  2. Android(安卓)修改App中默认TextView的字体和颜色
  3. android HTTP post方法时,如何使用cookies
  4. Android将Uri转化为文件路径的方法
  5. Android(安卓)圆角图片 圆形图片
  6. Android(安卓)Support Multidex原理分析
  7. Android(安卓)NDK之----- C调用Java [GetMethodID方法的使用]
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android学习10-----Android组件通信 (7)
  2. 帮助android程序实现动画特效--Lemon动画
  3. ListView中getView的原理+如何在ListView
  4. [置顶] 开发第一个Android设备驱动程序
  5. 结合Android学设计模式--开篇
  6. Android(安卓)Rild模块源码分析
  7. Android中Handler作用
  8. android 字符串绘制示例
  9. EditText输入框的长度调整
  10. 亚马逊 CEO 称 Kindle Fire 是一个终端到