如何获取系统的应用程序的相关信息
2011-10-10 09:08
501 查看
有的时候我们需要获取系统的应用程序,比如说Home界面的时候,我们需要获取在Manifest里面注册的所有的应用的信息,并将这些应用的图标,名字显示出来,同时还要获取他们的action或者CompanentName,以便点击他们的时候可以跳转到相应的应用。
下面就是一个例子:
先上运行出来的效果图:
很明显,这需要一个ListView,看一下layout文件:
我们需要一个文件来显示应用程序的信息:比如应用的名字,图标,已经点击的Intent等,如下所示:
好了,现在我们要开始获取应用的信息了,并把获得的信息封装在一个List<ApplicationInfo>中,具体是这样的:
首先是拿到packageManager,然后扫描带有Action_main和Category_Launcher的Intent_filter.查询到的返回值是一个List<ResolveInfo>,里面的每一个ResolveInfo就是一个应用的信息。
然后我们需要遍历这个List,拿到每一个应用的相关信息(我们需要的那些信息),然后将拿到的我们需要的信息放在一个ApplicationInfo对象中,然后讲所有的应用的ApplicationInfo放到一个List里面,这个List里面就是我们需要的数据。
然后我们需要写一个Adapter,将数据传递进去,让ListView现实出我们需要显示的东西:
Adapter如下:
Adapter里面就是getView里面显示每一个Item项,这里我就不在多废话了,这里我们需要显示应用的图标和名字,所以在布局中我们需要一个ImageView和一个TextView,Adapter的item项的布局文件如下:
这里整个ListView就已经可以显示出来了,我们还需要写点击事件:
下面把主Activity放出来:
还有一种情况是这样的,我们有时需要获取安装的应用的信息,而不是整个系统的应用的信息,
这是需要换一种方式来获取安装的应用的信息:
从本地的包中可以获取安装的包,注意,这里的安装的包是指说有的包,包括系统的包,我们只需要我们自己安装的,不需要系统的,怎么办呢,这时我们需要将系统的包过滤掉,我们可以做判断如果if((info.applicationInfo.flags & info.application.FLAG_SYSTEM) <= 0),就说明不是系统的包,是后来安装上去的,我们就可以把它加到List中去了。
获取安装的包的Adapter:
获取安装的应用的Activity:
获取安装的应用的效果图:
好了,就写这么多吧。。。
源代码下载地址如下:
点击我下载代码
下面就是一个例子:
先上运行出来的效果图:
很明显,这需要一个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 <ListView 15 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 @Override 24 public int getCount () { 25 return apps.size(); 26 } 27 28 @Override 29 public Object getItem (int position) { 30 return position; 31 } 32 33 @Override 34 public long getItemId (int position) { 35 return position; 36 } 37 38 @Override 39 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 <TextView 12 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 @Override 2 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 @Override 26 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 @Override 59 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 @Override 27 public int getCount () { 28 return mApps.size(); 29 } 30 31 @Override 32 public Object getItem (int position) { 33 return position; 34 } 35 36 @Override 37 public long getItemId (int position) { 38 return position; 39 } 40 41 @Override 42 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 @Override 24 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 @Override 48 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 }
获取安装的应用的效果图:
好了,就写这么多吧。。。
源代码下载地址如下:
点击我下载代码
相关文章推荐
- 如何获取系统的应用程序的相关信息
- 如何获取系统的应用程序的相关信息
- Android中如何获取系统应用程序列表与AndroidManifest.xml信息
- [Mac OS X Cocoa编程]如何获取其他应用程序的窗体标题以及相关信息?
- Android中如何获取系统应用程序列表与AndroidManifest.xml信息
- 如何查询Linux系统的一些相关信息
- 如何获取系统信息
- 获取系统名字及相关信息的函数
- ubuntu下如何查看用户登录及系统授权相关信息【转】
- 如何在Linux系统上获取命令的帮助信息,请详细列出,并描述man文档的章节是如何划分的。
- 如何使用sigar包获取系统信息
- 获取windows系统处理器相关信息 GetSystemInfo(SYSTEM_INFO &si)
- android 调用系统方法获取应用程序信息 如缓存大小
- Android之获取手机上已安装的所有的应用程序的信息,并判断是否安装了某应用程序(系统程序或非系统应用程序判断)
- android系统如何获取手机信息
- 获取linux的文件系统相关信息的知识点
- Android系统信息获取 之十:移动网络相关信息获取
- Linux下的C程序如何调用系统命令,并获取系统的输出信息到C程序中
- Android中应用程序如何获得系统应用才能获取的权限
- 如何使Android应用程序获取系统权限【转】