Android程序管理器容易实现
Android程序管理器简单实现
list_app_item.xml
AppInfo.java 用于保存和获取Item数据
AppInfoProvider.java 用于得到应用的图标,名称,应用的路径和大小
MainActivity.java
应用功能:
列出手机所有应用,点击下方按钮,对应用进行apk大小由大到小排序,再次点击则由小到大排序。
效果图:
首先是布局文件: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); } } }