Android程序管理器容易实现

Android程序管理器简单实现

应用功能:

列出手机所有应用,点击下方按钮,对应用进行apk大小由大到小排序,再次点击则由小到大排序。

效果图:

Android程序管理器容易实现Android程序管理器容易实现

首先是布局文件:activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:weightSum="2"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_1"
        android:layout_width="fill_parent"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:text="姓名:cofen"
        android:textSize="15sp" />

    <ListView
        android:id="@+id/list_app_item"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:cacheColorHint="@android:color/transparent" >
    </ListView>

    <Button
        android:layout_gravity="bottom"
        android:id="@+id/bt_1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:onClick="click"
        android:text="按照程序apk大小排序" />

</LinearLayout>

list_app_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:src="@drawable/app" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dip"
        android:layout_marginTop="3dip"
        android:text="软件名称"
        android:textColor="#000000"
        android:layout_toRightOf="@id/iv_icon"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/tv_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_name"
        android:layout_marginLeft="3dip"
        android:layout_marginTop="1dip"
        android:text="程序大小"
        android:textColor="#99000000"
        android:layout_toRightOf="@id/iv_icon"
        android:textSize="16sp" />

</RelativeLayout>

AppInfo.java  用于保存和获取Item数据


import android.graphics.drawable.Drawable;

public class AppInfo {
	private Drawable icon;
	private String name;
	private String packageName;
	private String apksize;
	public Drawable getIcon() {
		return icon;
	}
	public void setIcon(Drawable icon) {
		this.icon = icon;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPackageName() {
		return packageName;
	}
	public void setPackageName(String packageName) {
		this.packageName = packageName;
	}
	public String getApksize() {
		return apksize;
	}
	public void setApksize(String apksize) {
		this.apksize = apksize;
	}
	
	@Override
	public String toString() {
		return "AppInfo [name=" + name + ", apksize=" + apksize + "]";
	}

	
}

AppInfoProvider.java   用于得到应用的图标,名称,应用的路径和大小

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
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.drawable.Drawable;

/**
 * 得到应用的图标,名称,应用的路径和大小
 * 
 * @author lenovo
 * 
 */
public class AppInfoProvider {

	private static int size;
	private static int len;

	public static List<AppInfo> getAllAppInfo(Context context) {
		ArrayList<AppInfo> appInfos = new ArrayList<AppInfo>();
		// 得到包管理器
		PackageManager pm = context.getPackageManager();
		List<PackageInfo> packInfos = pm.getInstalledPackages(0);
		for (PackageInfo info : packInfos) {
			AppInfo appInfo = new AppInfo();
			// 得到包的名字
			String packageName = info.packageName;
			// 得带应用图标
			Drawable icon = info.applicationInfo.loadIcon(pm);
			// 得到应用名称
			String name = (String) info.applicationInfo.loadLabel(pm);
			// 得到应用的路径
			String sourceDir = info.applicationInfo.sourceDir;
			//得到应用的大小
			File file = new File(sourceDir);
			long length = file.length();

			appInfo.setApksize(length + "");
			appInfo.setIcon(icon);
			appInfo.setName(name);
			appInfo.setPackageName(packageName);
			// 应用程序的标志,可以是任意标志的组合
			int flags = info.applicationInfo.flags;

			appInfos.add(appInfo);
		}

		return appInfos;

	}
}

MainActivity.java 


import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

	private MyAdapter adapter;
	private List<AppInfo> infos;
	private ListView list_app_item;
	private int flag = 0;

	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			adapter = new MyAdapter();
			list_app_item.setAdapter(adapter);
			// 刷新页面
			adapter.notifyDataSetChanged();
		}
	};
	private Map<String, Integer> mp;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		list_app_item = (ListView) findViewById(R.id.list_app_item);
		infos = AppInfoProvider.getAllAppInfo(MainActivity.this);

		// 发一个消息更新界面
		handler.sendEmptyMessage(0);

	}

	private class MyAdapter extends BaseAdapter {

		@Override
		public int getCount() {
			return infos.size();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {

			AppInfo info = infos.get(position);

			View view = null;

			if (convertView != null) {
				view = convertView;
			} else {
				view = View.inflate(MainActivity.this, R.layout.list_app_item,
						null);
			}

			TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
			ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon);
			TextView tv_location = (TextView) view
					.findViewById(R.id.tv_location);

			String apksize = info.getApksize();
			String name = info.getName();
			tv_location.setText(apksize);
			iv_icon.setImageDrawable(info.getIcon());
			tv_name.setText(name);

			return view;
		}

	}

	public void click(View v) {
		if (flag == 0) {
			Collections.sort(infos, new strlenComparator());
			flag = 1;
			handler.sendEmptyMessage(0);
			
		}else if(flag == 1){
			Collections.sort(infos, new strlenComparator2());
			flag = 0;
			handler.sendEmptyMessage(0);
		}

		// 刷新页面
		adapter.notifyDataSetChanged();
	}

	// 定义比较器,由大到小
	class strlenComparator implements Comparator<AppInfo> {

		@Override
		public int compare(AppInfo lhs, AppInfo rhs) {
			String size1 = lhs.getApksize();
			Integer valueOf1 = Integer.valueOf(size1);

			String size2 = rhs.getApksize();
			Integer valueOf2 = Integer.valueOf(size2);

			if (valueOf1 > valueOf2)
				return -1;
			if (valueOf2 > valueOf1)
				return 1;

			return valueOf1.compareTo(valueOf2);
		}

	}
	
	
	// 定义比较器,由小到大
		class strlenComparator2 implements Comparator<AppInfo> {

			@Override
			public int compare(AppInfo lhs, AppInfo rhs) {
				String size1 = lhs.getApksize();
				Integer valueOf1 = Integer.valueOf(size1);

				String size2 = rhs.getApksize();
				Integer valueOf2 = Integer.valueOf(size2);

				if (valueOf1 > valueOf2)
					return 1;
				if (valueOf2 > valueOf1)
					return -1;

				return valueOf1.compareTo(valueOf2);
			}

		}

}