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.如下图:
所以在复用convertView时,不仅要判断是否为空,还要判断这个convertView是否是合适的类型去复用。如:if(converView != null && convertViewinstanceof RelativeLayout)
如果想让ListView滑动时,Textview的位置不动,其实现方法是将ListView放到帧布局中,并且在ListView后面再定义一个Textview(帧布局的显示效果是:靠后定义的位于靠前定义的上面,这样就可以实现Textview不会滑动的效果),然后给ListView添加一个滚动监听器,在onScroll方法中,判断参数firstVisibleItem是否大于用户程序数,如果大于则设置Textview为系统程序,else为用户程序。
ListView右边快速滚动的实现,增加属性:
android:fastScrollEnabled="true"