程序卸载器
程序卸载器是很常见的系统管理应用,很多应用管理软件也内置了这个功能。其实功能实现起来非常简单,只需要调用系统的应用卸载服务即可。应用运行界面如下:
系统运行效果
卸载应用关键代码
卸载应用需要得到应用的包名,使用Intent传递给Android系统的应用卸载服务,源码如下:
Uri uri = Uri.parse("package:" + packageName);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
MainActivity.this.startActivity(intent);
获取应用信息关键代码
卸载应用是需得到应用的包名,获取应用的包名可以使用PackageManager。实现的关键代码如下: PackageManager pm = context.getPackageManager();
List<PackageInfo> list = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : list) {
// 只加载非系统应用
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
AppInfo i = new AppInfo();
i.setPackageName(packageInfo.packageName);
i.setAppName(pm
.getApplicationLabel(packageInfo.applicationInfo) .toString());
// 在API 9 (2.3)中加入
// i.setFirstInstallTime(packageInfo.firstInstallTime);
i.setFirstInstallTime(new File(
packageInfo.applicationInfo.sourceDir).lastModified());
i.setIcon(pm.getApplicationIcon(packageInfo.applicationInfo));
i.setVersionCode(packageInfo.versionCode);
appList.add(i);
} else {
Log.v(TAG, "忽略系统应用");
}
}
这段代码中使用PackageManager获得已安装的应用PackageInfo信息列表,使用PackageInfo封装的信息即可得到应用的全部信息,如packageInfo.firstInstallTime等字段在高版本API中加入,使用中需要注意。这个实例忽略掉了系统自带应用。
因为获取系统应用信息列表可能需要较多时间操作,所以最好在子线程中执行。
列表排序比较器
得到的应用列表,为了方便用户查找,应该按照应用名优先排序。Collections工具类提供了sort方法,为了排序自定义元素,需要自定义Comparator的实现类。源代码如下:
package com.frank.appsmanager;
import java.util.Comparator;
public class AppInfoComparator implements Comparator<AppInfo> {
@Override
public int compare(AppInfo lhs, AppInfo rhs) {
if (!lhs.getAppName().equals(rhs.getAppName())) {
return lhs.getAppName().compareTo(rhs.getAppName());
} else {
return lhs.getPackageName().compareTo(rhs.getPackageName());
}
}
}
图标大小处理
不同应用得到的图标大小不同,所以需要对列表中的图标的大小进行重新调整。代码如下:
package com.frank.appsmanager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
public class DrawableUtil {
public static Bitmap drawableToBitmap(Drawable drawable) {
Bitmap bitmap = Bitmap
.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
}
}
调用位置:
// 匹配不同应用icon的大小
int size = ((WindowManager) context
.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay()
.getWidth() / 6;
Bitmap iconBitmap = Bitmap.createScaledBitmap(
DrawableUtil.drawableToBitmap(i.getIcon()), size, size, true);
holder.iv_icon.setImageBitmap(iconBitmap);
全部代码
完整应用源代码可通过以下链接下载:
http://download.csdn.net/detail/f40346839100/6886407