如何获取系统的应用程序的相关信息
来源:互联网 发布:python实现二叉树 编辑:程序博客网 时间:2024/05/21 06:13
下面就是一个例子:
先上运行出来的效果图:
很明显,这需要一个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 }
获取安装的应用的效果图:
好了,就写这么多吧。。。
源代码下载地址如下:
点击我下载代码
- 如何获取系统的应用程序的相关信息
- 获取系统的相关信息
- Android-获取系统的应用程序的信息
- 获取Android系统中应用程序的信息
- android开发_如何获取android应用程序的相关信息并显示
- [Mac OS X Cocoa编程]如何获取其他应用程序的窗体标题以及相关信息?
- iOS获取当前系统的相关信息
- 获取系统相关信息的方法
- 获取iOS系统的相关信息
- JAVA获取系统相关的信息
- Android获取系统相关的信息
- php获取系统信息的相关方法
- ManagementFactory-JAVA获取系统相关的信息
- 如何获取请求行的相关信息
- 获取应用程序的信息
- 获取手机内所有应用程序相关信息的方法
- 得到系统中存在桌面图标的应用程序的相关信息
- 如何获取系统的串口信息
- JS MVC 用例子来说明他的好处
- ASP.NET连接数据库并获取数据
- 关于JAVA Static的初始化顺序(及递归错误)
- 经典面试之n线分割最多面与n面分割最多空间
- android EditText限制输入长度
- 如何获取系统的应用程序的相关信息
- SQL养成一个好习惯是一笔财富
- 用ViewFlipper和GestureDetector实现手势翻页的效果
- Java代码查错题
- 华为如何通过ACL访问控制列表限制上网
- 二分法HDU2199
- Android学习系列(5)--App布局初探之简单模型
- MVC学习1-------------MVC流程
- windows创建问题