需求:获取手机系统应用程序和用户系统应用程序,并把他们显示到activity上
效果图:
对这个界面简单的介绍一下:
首先,整个是的一个TabHost,用来切换其Content,然后每个Content中是一个ListView,用来显示程序信息(应用程序的图片,名字,版本)。显示呢,就是为ListView设置Adapter(之前前面提到的自定义Adapter的应用),从而达到显示内容的目的。
今天的代码主要是:怎样获取应用程序信息,并且区分应用程序是系统应用程序还是用户应用程序package cn.cbd.mobilesaft.activity.provider;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import cn.cbd.mobilesaft.activity.bean.AppInfo;
/**
* 应用程序信息提供者 用来获取系统应用程序和用户应用程序
* @author YSY
*/
public class AppInfoProvider
{
// 自定义一个上下文对象
private Context context;
// 构造函数
public AppInfoProvider(Context context)
{
this.context = context;
}
// 定义AppInfo对象的集合
private List appInfos;
/**
* 获取所有应用程序的信息
*
* @return AppInfo集合对象
*/
public List getAllAppInfo()
{
// 获取应用程序包的管理者
PackageManager pm = context.getPackageManager();
// 获取所有安装的程序的包信息对象
List packageInfos = pm.getInstalledPackages(0);
// 新建一个AppInfo集合,用来存放AppInfo类的对象
appInfos = new ArrayList();
AppInfo appInfo = null;
// for循环,遍历集合List
for (PackageInfo packageInfo : packageInfos)
{
appInfo = new AppInfo();
// 添加应用程序的包名到appInfo
appInfo.setPackagename(packageInfo.packageName);
// 添加应用程序的版本号到appInfo
appInfo.setVersion(packageInfo.versionName);
// 获取应用程序信息对象
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
// 添加应用程序的名称到appInfo
appInfo.setName(applicationInfo.loadLabel(pm).toString());
// Drawable转换为BitMap
Drawable drawbale = applicationInfo.loadIcon(pm);
BitmapDrawable bd = (BitmapDrawable) drawbale;
Bitmap bm = bd.getBitmap();
// 添加应用程序的包名到appInfo
appInfo.setBitmap(bm);
// 判断程序是否是用户程序或系统程序
if (isUserApp(applicationInfo))
{
appInfo.setIsuserapp(true);
} else
{
appInfo.setIsuserapp(false);
}
// 把各个appInfo对象放到appInfos集合当中
appInfos.add(appInfo);
}
// 返回集合对象
return appInfos;
}
/**
* 判断该应用程序是否为用户自定义安装程序
*
* @param applicationInfo
* 当前应用的包信息对象
* @return true表示用户程序,false表示系统程序
*/
private boolean isUserApp(ApplicationInfo applicationInfo)
{
if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1)
{
return false;
} else
{
return true;
}
}
}
获取存放应用程序信息的集合后,即得到一个集合,然后自定义Adapter并把数据显示到ListView上package cn.cbd.mobilesaft.activity;
import java.util.ArrayList;
import java.util.List;
import cn.cbd.mobilesaft.activity.adapter.AppInfoAdapter;
import cn.cbd.mobilesaft.activity.bean.AppInfo;
import cn.cbd.mobilesaft.activity.provider.AppInfoProvider;
import cn.cbd.mobilesaft.activity.utils.GetAvailableSize;
import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class UserApplication extends Activity
{
private List userAppInfos;
private GetAvailableSize getAvailableSize;
private TextView tv_userApplication_Memory;
private ListView lv_userApplication;
private AppInfoProvider appInfoProvider;
private AppInfoAdapter adapter;
private RelativeLayout rl_userApplication_loading;
// private ListView userApplication;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userapplication);
// 填充数据
fillData(this);
}
public void fillData(final Context context)
{
// 开启一个异步任务
new AsyncTask()
{
protected void onPreExecute()
{
// 设置第一层(加载页面)可见
rl_userApplication_loading = (RelativeLayout) findViewById(R.id.rl_userApplication_loading);
rl_userApplication_loading.setVisibility(View.VISIBLE);
tv_userApplication_Memory = (TextView) findViewById(R.id.tv_userApplication_Memory);
getAvailableSize = new GetAvailableSize(context);
// 获取手机内存空间,和SDCard内存空间
String getRomSize = getAvailableSize.getAvailableRomSize();
String getSDCardSize = getAvailableSize
.getAvailableSDCardSize();
CharSequence availableMemory = "ROM:" + getRomSize + " SD:"
+ getSDCardSize;
tv_userApplication_Memory.setText(availableMemory);
lv_userApplication = (ListView) findViewById(R.id.lv_userApplication);
};
protected Void doInBackground(Void... params)
{
userAppInfos = new ArrayList();
appInfoProvider = new AppInfoProvider(context);
// 获取应用程序数据数据
List appInfos = appInfoProvider.getAllAppInfo();
for (AppInfo appInfo : appInfos)
{
// 如果是用户应用程序,添加到用户程序集合userAppInfos(下面的newnew
// AppInfoAdapter(context, userAppInfos)会用到)
if (appInfo.isIsuserapp())
{
userAppInfos.add(appInfo);
}
}
return null;
}
protected void onPostExecute(Void result)
{
// 设置第一层不可见
rl_userApplication_loading.setVisibility(View.INVISIBLE);
// 判断adapter是否为空
if (adapter == null)
{
adapter = new AppInfoAdapter(context, userAppInfos);
lv_userApplication.setAdapter(adapter);
} else
{
// 通知数据发生变化
adapter.notifyDataSetChanged();
}
};
}.execute();
}
}
上面这个是获取并显示用户信息的,获取显示系统应用程,判断时有所不同protected Void doInBackground(Void... params)
{
systemAppInfos = new ArrayList();
appInfoProvider = new AppInfoProvider(context);
List appInfos = appInfoProvider.getAllAppInfo();
for (AppInfo appInfo : appInfos)
{
// 判断是否是系统应用程序
if (!appInfo.isIsuserapp())
{
systemAppInfos.add(appInfo);
}
}
return null;
}
大家都看到,上面会用到一个AppInfo类,这个类呢使我们自己自定义的一个实体类package cn.cbd.mobilesaft.activity.bean;
import android.graphics.Bitmap;
/**
* 管理应用程序类 来存放所用的应用程序(用户和系统应用程序)
*
* @author Administrator
*
*/
public class AppInfo
{
// 应用程序的名称
private String name;
// 版本号
private String version;
// 包名
private String packagename;
// 图标
private Bitmap bitmap;
// 是否是用户应用程序
private boolean isuserapp;
// 个数
private int appNum;
// get和set方法
public int getAppNum()
{
return appNum;
}
public void setAppNum(int appNum)
{
this.appNum = appNum;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getPackagename()
{
return packagename;
}
public void setPackagename(String packagename)
{
this.packagename = packagename;
}
public Bitmap getBitmap()
{
return bitmap;
}
public void setBitmap(Bitmap bitmap)
{
this.bitmap = bitmap;
}
public boolean isIsuserapp()
{
return isuserapp;
}
public void setIsuserapp(boolean isuserapp)
{
this.isuserapp = isuserapp;
}
}
希望这个在获取应用程序信息方面对你们有所帮助。