最近在做项目的时候,需要获取手机上的应用程序并启动,一个类似桌面软件的应用。
1.布局我们使用一个GridView来呈现应用程序这里就不贴代码了,首先来获取已安装的app
new Thread(new Runnable() {
@Override
public void run() {
List<PackageInfo> packageInfo = getPackageManager()
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
GetAppInfo getAppInfo = new GetAppInfo(MainActivity.this, packageInfo);
apps = getAppInfo.getApps();
handler.sendEmptyMessage(0);
}
}).start();
AppAdapter adapter = new AppAdapter(apps, MainActivity.this);
gridView.setAdapter(adapter);
2.来具体看下GetAppInfo类中的处理
/**ApplicationInfo 中为我们封装了一系列app的属性和相关的东西,
这里只获取了我需要的几个内容没有兴趣的可以看下ApplicationInfo 都封装了什么*/
private List<PackageInfo> packageInfo;
private PackageManager packageManager;
private List<AppItem> list;
public GetAppInfo(Context context, List<PackageInfo> packageInfo) {
this.packageInfo = packageInfo;
packageManager = context.getPackageManager();
list = new ArrayList<>();
}
public List<AppItem> getApps() {
for (PackageInfo info : packageInfo) {
ApplicationInfo appInfo = info.applicationInfo;
if (!filterApp(appInfo)) {
continue;
}
Drawable icon = appInfo.loadIcon(packageManager);
String appName = appInfo.loadLabel(packageManager).toString();
String packageName = appInfo.packageName;
String apkePath = appInfo.sourceDir;
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
AppItem appItem = new AppItem(icon, appName, packageName, intent);
list.add(appItem);
}
return list;
}
过滤一些系统app
/**
* 判断某一个应用程序是不是系统的应用程序,
* 如果是返回true,否则返回false。
*/
public boolean filterApp(ApplicationInfo info) {
if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
return true;
} else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
return true;
}
return false;
}
3.AppItem是一个实体类,对获取到的东西进行封装这里就不贴出代码了。既然获取到应用了,那我们来尝试打开
startActivity(apps.get(position).getIntent());
国际惯例最后上效果图