获得所有安装的应用,复杂ListView的显示

39.获得手机上安装的所有应用程序信息

要获得手机上安装的应用程序的信息,需要用包管理器:PackageManager.

获得所有已经安装在手机上的应用程序包信息

List<PackageInfo> packInfos = pm.getInstalledPackages(int flags);

其中,参数flags: Additional option flags,是可选的,以后遇到这样的flags,我们直接赋为0.

for (PackageInfo packInfo : packInfos){

这里的每个packInfo都相当于一个应用程序apk包的清单文件,而一个程序的安装信息都在清单文件中。

包名、版本号、版本名都在manifest根节点下,可以直接获得,如获得程序包名

String packname = packInfo.packageName;


而应用程序的图标、应用程序名等信息都是在清单文件的application节点下需要先拿到application节点,然后再获得相应的信息,如获得应用程序的图标及应用程序名

Drawable icon = packInfo.applicationInfo.loadIcon(pm);

String name = packInfo.applicationInfo.loadLabel(pm).toString();


判断应用程序是否为系统应用程序时,需要先得到该应用程序的标记,然后跟系统应用的标记做与操作,如果不为0,则为系统应用程序:

int flags = packInfo.applicationInfo.flags;

if((flags & ApplicationInfo.FLAG_SYSTEM) == 0){

该应用程序为用户安装程序

}else{

该程序为系统应用程序

}


判断应用程序是否安装在SD卡上,也需要用应用程序的标记跟外部存储的标记做与操作,如果不为0,则应用程序就安装在SD卡上

if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0){

该应用程序安装在手机内存上

}else{

该应用程序安装在SD卡上

}

}


设置应用程序的优先安装位置为外部存储设备

在清单文件中的manifest节点属性中,增加android:installLocation="preferExternal"代码即可。默认情况是装在手机内存上。


40.复杂ListView的显示

如:显示程序列表的ListView,由于程序分为用户程序和系统程序,所以可以在所有用户程序显示之前添加一个TextView来显示用户程序的个数,在系统程序之前也添加一个TextView用来显示系统程序的个数,而显示程序的布局跟这个Textview是不同的。此时的ListView的长度比之前要+2.如下图:

获得所有安装的应用,复杂ListView的显示_第1张图片

所以在复用convertView时,不仅要判断是否为空,还要判断这个convertView是否是合适的类型去复用。如:if(converView != null && convertViewinstanceof RelativeLayout)


如果想让ListView滑动时,Textview的位置不动,其实现方法是将ListView放到帧布局中,并且在ListView后面再定义一个Textview(帧布局的显示效果是:靠后定义的位于靠前定义的上面,这样就可以实现Textview不会滑动的效果),然后给ListView添加一个滚动监听器,在onScroll方法中,判断参数firstVisibleItem是否大于用户程序数,如果大于则设置Textview为系统程序,else为用户程序。


ListView右边快速滚动的实现,增加属性:

android:fastScrollEnabled="true"

你可能感兴趣的:(获得所有安装的应用,复杂ListView的显示)