#获取应用程序信息# (重点)
/**
* 获取系统中安装所有应用程序
* @return
*/
public static List<AppInfo> getAppInfos(Context context){
List<AppInfo> list = new ArrayList<AppInfo>();
//1.获取出包的管理者
PackageManager pm = context.getPackageManager();
//2.获取系统中安装的所有应用信息
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
//3.遍历集合
for (PackageInfo packageInfo : installedPackages) {
//4.获取应用程序的包名
String packageName = packageInfo.packageName;
//5.获取应用程序的版本号
String versionName = packageInfo.versionName;
//6.获取应用程序中applicaiton的信息
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
//6.1获取应用程序的图标
Drawable icon = applicationInfo.loadIcon(pm);
//6.2获取应用程序的名称
String name = applicationInfo.loadLabel(pm).toString();
//6.3判断应用程序是否是系统应用
//获取应用系统中的所有标签
boolean isUser;
int flags = applicationInfo.flags;
if((flags & applicationInfo.FLAG_SYSTEM) == applicationInfo.FLAG_SYSTEM){
//系统应用
isUser = false;
}else{
//用户应用
isUser = true;
}
//6.4是否安装到sd卡
boolean isSD;
if((flags & applicationInfo.FLAG_EXTERNAL_STORAGE) == applicationInfo.FLAG_EXTERNAL_STORAGE){
//安装到了SD卡
isSD = true;
}else{
//安装到手机内存
isSD = false;
}
//7.将获取的信息通过bean对象进行保存
AppInfo appInfo = new AppInfo(name, icon, packageName, versionName, isSD, isUser);
//8.添加到list集合中
list.add(appInfo);
}
return list;
}
#软件管理的界面展示# (重点,listview复用缓存,添加textview条目)
1.创建activity,清单文件配置,复制选择联系人界面,修改控件的id
2.在activity中使用异步加载框架去加载数据
private void filldata() {
//获取应用程序信息
new MyAsyncTask() {
@Override
public void preTask() {
loading.setVisibility(View.VISIBLE);
}
@Override
public void postTask() {
lv_softmanager_applications.setAdapter(new MyAdapter());
loading.setVisibility(View.INVISIBLE);//数据显示完成,隐藏进度条
}
@Override
public void doinBack() {
//获取应用程序信息
list = AppEngine.getAppInfos(getApplicationContext());
}
}.execute();
}
3.在adapter使用listview缓存复用操作,并填充数据
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
if (convertView == null) {
view = View.inflate(getApplicationContext(), R.layout.item_softmanager, null);
//new ViewHolder
viewHolder = new ViewHolder();
//将初始化的控件保存到viewholder中
viewHolder.iv_itemsoftmanager_icon = (ImageView) view.findViewById(R.id.iv_itemsoftmanager_icon);
viewHolder.tv_itemsoftmanager_name = (TextView) view.findViewById(R.id.tv_itemsoftmanager_name);
viewHolder.tv_itemsoftmanager_issd = (TextView) view.findViewById(R.id.tv_itemsoftmanager_issd);
viewHolder.tv_itemsoftmanager_versionname = (TextView) view.findViewById(R.id.tv_itemsoftmanager_versionname);
//将viewholder绑定到view上
view.setTag(viewHolder);
}else{
//获取view
view = convertView;
//获取viewholder
viewHolder = (ViewHolder) view.getTag();
}
//获取条目对应的信息
AppInfo appInfo = list.get(position);
//数据填充操作
//设置图片
viewHolder.iv_itemsoftmanager_icon.setImageDrawable(appInfo.getIcon());
//设置名称
viewHolder.tv_itemsoftmanager_name.setText(appInfo.getName());
//设置安装位置
if (appInfo.isSD()) {
viewHolder.tv_itemsoftmanager_issd.setText("SD卡");
}else{
viewHolder.tv_itemsoftmanager_issd.setText("手机内存");
}
//设置版本号
viewHolder.tv_itemsoftmanager_versionname.setText(appInfo.getVersion());
return view;
}
}
static class ViewHolder{
ImageView iv_itemsoftmanager_icon;
TextView tv_itemsoftmanager_name,tv_itemsoftmanager_issd,tv_itemsoftmanager_versionname;
}
#用户程序和系统程序拆分#(重点)
1.在异步加载框架中,将list分拆成userappinfos和systemappinfos,分别存放用户程序和系统程序
@Override
public void doinBack() {
//获取应用程序信息
list = AppEngine.getAppInfos(getApplicationContext());
//根据应用是否是用户程序将应用程序分别放到用户应用程序的集合和系统应用程序的集合
userAppInfos = new ArrayList<AppInfo>();
systemAppInfos = new ArrayList<AppInfo>();
//遍历list集合,分拣用户程序和系统程序
for (AppInfo appinfo : list) {
if (appinfo.isUser()) {
//用户程序
userAppInfos.add(appinfo);
}else{
//系统程序
systemAppInfos.add(appinfo);
}
}
}
2.在adapter的getcount中将原来的list.size()改成userappinfos.size+systemappinfos.size
@Override
public int getCount() {
//方便我们从不同的集合中拿出数据
return userAppInfos.size()+systemAppInfos.size()
}
3.因为用户程序和系统程序,我们要从不同的集合中去拿,所以在getview中要根据显示的条目数据去判断是从userAppInfos去拿数据还是从systemAppInfos中去拿数据
//获取条目对应的信息
AppInfo appInfo;
//判断用户程序是否展示完
if (position <= userAppInfos.size()-1) {
//获取用户程序
appInfo = userAppInfos.get(position);
}else{
//系统程序
appInfo = systemAppInfos.get(position - userAppInfos.size());
}
4.将数据分别显示了,但是还要添加textiview显示
a.在getcount中添加两个条目的长度
@Override
public int getCount() {
//方便我们从不同的集合中拿出数据
return userAppInfos.size()+systemAppInfos.size()+2;
}
b.在getview中添加textview条目
if (position == 0) {
//添加用户程序多少个
TextView textView = new TextView(getApplicationContext());
textView.setText("用户程序("+userAppInfos.size()+")");
textView.setTextColor(Color.WHITE);
textView.setBackgroundColor(Color.GRAY);
return textView;
}else if(position == userAppInfos.size()+1){
//添加系统程序多少个
TextView textView = new TextView(getApplicationContext());
textView.setText("系统程序("+systemAppInfos.size()+")");
textView.setTextColor(Color.WHITE);
textView.setBackgroundColor(Color.GRAY);
return textView;
}
c.因为添加了两个条目,所以要改变获取数据的方式
//获取条目对应的信息
AppInfo appInfo;
//判断用户程序是否展示完
if (position <= userAppInfos.size()) {
//获取用户程序
appInfo = userAppInfos.get(position-1);
}else{
//系统程序
appInfo = systemAppInfos.get(position - userAppInfos.size()-2);
}
#浮动显示程序多少个操作# (重点)
给listview添加滑动监听
lv_softmanager_applications.setOnScrollListener(new OnScrollListener() {
//滑动状态改变的时候调用
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
//滑动的时候调用
//view : listview
//firstVisibleItem : 界面可见的第一个条目的位置
//visibleItemCount : 界面可见条目的个数,多少可见
//totalItemCount : 总条目数 包含可见和不可见所有条目,listview的所有条目个数
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//为null的原因:因为listview在初始化的时候就会调用onScroll
if (userAppInfos != null && systemAppInfos !=null) {
//根据可见条目来判断是否是显示的系统程序的个数,是显示系统程序多少个,不是显示用户程序多少个
if (firstVisibleItem >= userAppInfos.size()+1) {
tv_softmanager_count.setText("系统程序("+systemAppInfos.size()+")");
}else{
tv_softmanager_count.setText("用户程序("+userAppInfos.size()+")");
}
}
}
});
}