获取系统中应用程序的另一种方式

  上次说到了从package中获取manifest中已经注册的应用,然后作为数据传送到ListView上显示。其实系统中有一个类,只需要继承这个类,然后重写一个方法就同样可以实现了,这个类就是LauncherActivity,看一下LauncherActivity里面的代码:也是从package中拿到的:

  

 1   @Override
2 protected void onCreate(Bundle icicle) {
3 super.onCreate(icicle);
4
5 mPackageManager = getPackageManager();
6
7 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
8 setProgressBarIndeterminateVisibility(true);
9 onSetContentView();
10
11 mIconResizer = new IconResizer();
12
13 mIntent = new Intent(getTargetIntent());
14 mIntent.setComponent(null);
15 mAdapter = new ActivityAdapter(mIconResizer);
16
17 setListAdapter(mAdapter);
18 getListView().setTextFilterEnabled(true);
19
20 setProgressBarIndeterminateVisibility(false);
21 }

 我们可以看到mIntent = new Intent(getTargetIntent()); 那我们就看看是怎么拿到Intent的:

  

1 /**
2 * Get the base intent to use when running
3 * {@link PackageManager#queryIntentActivities(Intent, int)}.
4 */
5 protected Intent getTargetIntent() {
6 return new Intent();
7 }

 它只是返回了一个Intent的对象而已,并没用设置它的action和category之类的,那我们就需要重写这个方法,然后设置它的action和category:

1 @Override
2 protected Intent getTargetIntent () {
3 Intent intent = new Intent();
4 intent.setAction(Intent.ACTION_MAIN);
5 intent.addCategory(Intent.CATEGORY_LAUNCHER);
6 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
7 return intent;
8 }

  完了之后运行,我们可以看到效果了:

  

      

  随便点一个进去看看有没用点击事件:

  

  

  有点击事情,很好,跟上次实现的功能一样,但明显这个更简洁,用起来更方便。。。

 

原文地址:https://www.cnblogs.com/shang53880/p/2159555.html