如何获取系统的应用程序的相关信息

来源:互联网 发布:python实现二叉树 编辑:程序博客网 时间:2024/05/21 06:13
 有的时候我们需要获取系统的应用程序,比如说Home界面的时候,我们需要获取在Manifest里面注册的所有的应用的信息,并将这些应用的图标,名字显示出来,同时还要获取他们的action或者CompanentName,以便点击他们的时候可以跳转到相应的应用。

  下面就是一个例子:

  先上运行出来的效果图:

  

          

  

  很明显,这需要一个ListView,看一下layout文件:

  

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:orientation="vertical" 4     android:layout_width="match_parent" 5     android:layout_height="match_parent"> 6      7     <TextView   8         android:layout_width="match_parent"  9         android:layout_height="wrap_content" 10         android:text="@string/hello"11         android:textColor="@android:color/white"12         android:textSize="24sp"/>13     14     <ListView15         android:id="@+id/mylist"16         android:layout_width="match_parent"17         android:layout_height="0dip"18         android:layout_weight="1"/>19 </LinearLayout>

  我们需要一个文件来显示应用程序的信息:比如应用的名字,图标,已经点击的Intent等,如下所示:

  

 1 package com.android.test; 2  3 import android.content.ComponentName; 4 import android.graphics.drawable.Drawable; 5  6 public class ApplicationInfo { 7      8     String name; 9     ComponentName intent;10     Drawable icon;11     12     public String getName () {13         return name;14     }15     16     public void setName (String name) {17         this.name = name;18     }19     20     public ComponentName getIntent () {21         return intent;22     }23     24     public void setIntent (ComponentName intent) {25         this.intent = intent;26     }27     28     public Drawable getIcon () {29         return icon;30     }31     32     public void setIcon (Drawable icon) {33         this.icon = icon;34     }35 }

  好了,现在我们要开始获取应用的信息了,并把获得的信息封装在一个List<ApplicationInfo>中,具体是这样的:

  

 1 private List<ApplicationInfo> loadAppInfomation(Context context) { 2         List<ApplicationInfo> apps = new ArrayList<ApplicationInfo>(); 3         PackageManager pm = context.getPackageManager(); 4         Intent intent = new Intent(Intent.ACTION_MAIN, null); 5         intent.addCategory(Intent.CATEGORY_LAUNCHER); 6         List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0); 7         Collections.sort(infos, new ResolveInfo.DisplayNameComparator(pm)); 8         if(infos != null) { 9             apps.clear();10             for(int i=0; i<infos.size(); i++) {11                 ApplicationInfo app = new ApplicationInfo();12                 ResolveInfo info = infos.get(i);13                 app.setName(info.loadLabel(pm).toString());14                 app.setIcon(info.loadIcon(pm));15                 app.setIntent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));16                 apps.add(app);17             }18         }19         return apps;20     }

  首先是拿到packageManager,然后扫描带有Action_main和Category_Launcher的Intent_filter.查询到的返回值是一个List<ResolveInfo>,里面的每一个ResolveInfo就是一个应用的信息。

  然后我们需要遍历这个List,拿到每一个应用的相关信息(我们需要的那些信息),然后将拿到的我们需要的信息放在一个ApplicationInfo对象中,然后讲所有的应用的ApplicationInfo放到一个List里面,这个List里面就是我们需要的数据。

  然后我们需要写一个Adapter,将数据传递进去,让ListView现实出我们需要显示的东西:

  Adapter如下:

  

 1 package com.android.test; 2  3 import java.util.List; 4  5 import android.content.Context; 6 import android.view.LayoutInflater; 7 import android.view.View; 8 import android.view.ViewGroup; 9 import android.widget.BaseAdapter;10 import android.widget.ImageView;11 import android.widget.TextView;12 13 public class ApplicationAdapter extends BaseAdapter {14     15     private List<ApplicationInfo> apps;16     private LayoutInflater inflater;17     18     public ApplicationAdapter (Context context, List<ApplicationInfo> infos) {19         this.apps = infos;20         inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);21     }22     23     @Override24     public int getCount () {25         return apps.size();26     }27     28     @Override29     public Object getItem (int position) {30         return position;31     }32     33     @Override34     public long getItemId (int position) {35         return position;36     }37     38     @Override39     public View getView (int position, View convertView, ViewGroup parent) {40         ViewHolder holder;41         if(convertView == null) {42             holder = new ViewHolder();43             convertView = inflater.inflate(R.layout.app_adapter_list_item, null);44             holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);45             holder.name = (TextView) convertView.findViewById(R.id.app_name);46             convertView.setTag(holder);47         } else {48             holder = (ViewHolder) convertView.getTag();49         }50         holder.icon.setImageDrawable(apps.get(position).getIcon());51         holder.name.setText(apps.get(position).getName());52         return convertView;53     }54     55     class ViewHolder {56         ImageView icon;57         TextView name;58     }59 }

  Adapter里面就是getView里面显示每一个Item项,这里我就不在多废话了,这里我们需要显示应用的图标和名字,所以在布局中我们需要一个ImageView和一个TextView,Adapter的item项的布局文件如下:

  

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout 3   xmlns:android="http://schemas.android.com/apk/res/android" 4   android:layout_width="match_parent" 5   android:layout_height="match_parent" 6   android:orientation="horizontal"> 7   <ImageView 8       android:id="@+id/app_icon" 9       android:layout_width="wrap_content"10       android:layout_height="wrap_content"/>11   <TextView12       android:id="@+id/app_name"13       android:layout_width="0dip"14       android:layout_weight="1"15       android:gravity="center"16       android:textColor="@android:color/white"17       android:textSize="20sp"18       android:layout_height="wrap_content"/>    19 </LinearLayout>

 这里整个ListView就已经可以显示出来了,我们还需要写点击事件:

  

1  @Override2     public void onItemClick (AdapterView<?> parent, View view, int position, long id) {3         Intent intent = new Intent();4         intent.setComponent(apps.get(position).getIntent());5         startActivity(intent);6     }

  下面把主Activity放出来:

  

 1 package com.android.test; 2  3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6  7 import android.app.Activity; 8 import android.content.ComponentName; 9 import android.content.Context;10 import android.content.Intent;11 import android.content.pm.PackageManager;12 import android.content.pm.ResolveInfo;13 import android.os.Bundle;14 import android.view.View;15 import android.widget.AdapterView;16 import android.widget.AdapterView.OnItemClickListener;17 import android.widget.ListView;18 19 public class GetApplicationOfSystem extends Activity implements OnItemClickListener {20     21     private ListView mListView;22     private ApplicationAdapter mAdapter;23     private List<ApplicationInfo> apps;24     25     @Override26     protected void onCreate (Bundle savedInstanceState) {27         super.onCreate(savedInstanceState);28         setContentView(R.layout.system_app);29         30         mListView = (ListView) findViewById(R.id.mylist);31         mListView.setOnItemClickListener(this);32         apps = loadAppInfomation(this);33         mAdapter = new ApplicationAdapter(this, apps);34         mListView.setAdapter(mAdapter);35     }36     37     private List<ApplicationInfo> loadAppInfomation(Context context) {38         List<ApplicationInfo> apps = new ArrayList<ApplicationInfo>();39         PackageManager pm = context.getPackageManager();40         Intent intent = new Intent(Intent.ACTION_MAIN, null);41         intent.addCategory(Intent.CATEGORY_LAUNCHER);42         List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);43         Collections.sort(infos, new ResolveInfo.DisplayNameComparator(pm));44         if(infos != null) {45             apps.clear();46             for(int i=0; i<infos.size(); i++) {47                 ApplicationInfo app = new ApplicationInfo();48                 ResolveInfo info = infos.get(i);49                 app.setName(info.loadLabel(pm).toString());50                 app.setIcon(info.loadIcon(pm));51                 app.setIntent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));52                 apps.add(app);53             }54         }55         return apps;56     }57 58     @Override59     public void onItemClick (AdapterView<?> parent, View view, int position, long id) {60         Intent intent = new Intent();61         intent.setComponent(apps.get(position).getIntent());62         startActivity(intent);63     }64 }

 

 

  还有一种情况是这样的,我们有时需要获取安装的应用的信息,而不是整个系统的应用的信息,

  这是需要换一种方式来获取安装的应用的信息:

  

 1 private List<PackageInfo> loadPackageInfo(Context context) { 2         List<PackageInfo> apps = new ArrayList<PackageInfo>(); 3         PackageManager pm = context.getPackageManager(); 4         List<PackageInfo> packageList = pm.getInstalledPackages(0); 5         for(int i=0; i<packageList.size(); i++) { 6             PackageInfo info = packageList.get(i); 7             if((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) { 8                 apps.add(info); 9             }10         }11         return apps;12     }

 从本地的包中可以获取安装的包,注意,这里的安装的包是指说有的包,包括系统的包,我们只需要我们自己安装的,不需要系统的,怎么办呢,这时我们需要将系统的包过滤掉,我们可以做判断如果if((info.applicationInfo.flags & info.application.FLAG_SYSTEM) <= 0),就说明不是系统的包,是后来安装上去的,我们就可以把它加到List中去了。

  获取安装的包的Adapter:

  

 1 package com.android.test; 2  3 import java.util.List; 4  5 import android.content.Context; 6 import android.content.pm.PackageInfo; 7 import android.view.LayoutInflater; 8 import android.view.View; 9 import android.view.ViewGroup;10 import android.widget.BaseAdapter;11 import android.widget.ImageView;12 import android.widget.TextView;13 14 public class InstalledPackageAdapter extends BaseAdapter {15     16     private List<PackageInfo> mApps;17     private LayoutInflater inflater;18     private Context mContext;19     20     public InstalledPackageAdapter (Context context, List<PackageInfo> infos) {21         this.mContext = context;22         this.mApps = infos;23         inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);24     }25     26     @Override27     public int getCount () {28         return mApps.size();29     }30     31     @Override32     public Object getItem (int position) {33         return position;34     }35     36     @Override37     public long getItemId (int position) {38         return position;39     }40     41     @Override42     public View getView (int position, View convertView, ViewGroup parent) {43         ViewHolder holder;44         if(convertView == null) {45             holder = new ViewHolder();46             convertView = inflater.inflate(R.layout.app_adapter_list_item, null);47             holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);48             holder.name = (TextView) convertView.findViewById(R.id.app_name);49             convertView.setTag(holder);50         } else {51             holder = (ViewHolder) convertView.getTag();52         }53         holder.icon.setImageDrawable(mApps.get(position).applicationInfo.loadIcon(mContext.getPackageManager()));54         holder.name.setText(mApps.get(position).applicationInfo.loadLabel(mContext.getPackageManager()));55         return convertView;56     }57     58     class ViewHolder {59         ImageView icon;60         TextView name;61     }62 }

 获取安装的应用的Activity:

  

 1 package com.android.test; 2  3 import java.util.ArrayList; 4 import java.util.List; 5  6 import android.app.Activity; 7 import android.content.Context; 8 import android.content.Intent; 9 import android.content.pm.PackageInfo;10 import android.content.pm.PackageManager;11 import android.os.Bundle;12 import android.view.View;13 import android.widget.AdapterView;14 import android.widget.AdapterView.OnItemClickListener;15 import android.widget.ListView;16 17 public class GetApplicationOfInstalled extends Activity implements OnItemClickListener {18     19     private ListView mListView;20     private InstalledPackageAdapter maAdapter;21     private List<PackageInfo> mApps;22     23     @Override24     protected void onCreate (Bundle savedInstanceState) {25         super.onCreate(savedInstanceState);26         setContentView(R.layout.installed_app);27         mListView = (ListView) findViewById(R.id.mylist);28         mListView.setOnItemClickListener(this);29         mApps = loadPackageInfo(this);30         maAdapter = new InstalledPackageAdapter(this, mApps);31         mListView.setAdapter(maAdapter);32     }33     34     private List<PackageInfo> loadPackageInfo(Context context) {35         List<PackageInfo> apps = new ArrayList<PackageInfo>();36         PackageManager pm = context.getPackageManager();37         List<PackageInfo> packageList = pm.getInstalledPackages(0);38         for(int i=0; i<packageList.size(); i++) {39             PackageInfo info = packageList.get(i);40             if((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) {41                 apps.add(info);42             }43         }44         return apps;45     }46 47     @Override48     public void onItemClick (AdapterView<?> parent, View view, int position, long id) {49         Intent intent = new Intent();50         PackageInfo packageInfo = mApps.get(position);51         startActivity(intent);52     }53 }

  获取安装的应用的效果图:

  

  

   好了,就写这么多吧。。。

  源代码下载地址如下:

  点击我下载代码