1,应用管理的ui界面
条目界面的参考ui
①然后显示在ListView上即可(记得优化,程序大小的格式化等)
②获取ListView需要花费一定时间,所以放在子线程,再通过runOnUiThread()更新ui即可
③创建一个FrameLayout,包含ListView,然后设置一个等待框,在获取的时候显示在页面上.
2,应用程序的flags (可以区分应用程序的安装位置,系统和用户安装的程序等)
2.1
①在遍历每一个包信息的时候packInfo.application.flags(可能是多个标记的组合)
查看源码,发现安卓的flags定义都是1<<N(1向左位移N位来区分)(这样加起来也可以保证数据组合唯一)
这个flags的定义可以参考答题卡,通过光标扫描获取成绩.思想差不多.
类似与答题卡,扫描到0(空白)就没有选中,扫描到1(黑块)就视作选中了
所以flags可能是任意程序标志的组合,多种标记的组合具有唯一性.
②想要判断这个 flags属于什么样的组合,只需要把flags与对应的标识进行&运算(相同取1,不同取0)可以判断出应用程序所具有的标识.
使用这种方法和直接用数字和JSON串表示的区别:
运行速度快,因为计算机底层用的是二进制运算,这样的标识都是二进制计算,效率快.
组合多,好识别,每一位的状态都是成指数性增长(int数最大范围的组合),比JSON 串更好识别.
(①还是 JSON串的组合比较多,不过这也要运用在超过int数最大组合的情况下使用,例如细胞,生物种类,区分每个人的信息等,但这又是有别的算法去优化了
②,因为int的只有4个8位,所以当条目对(1,0可以看做代表一组互斥的条件对)的数量超过32的时候,使用它就不合适了.
③,小范围来看,这种计算只适合互斥的条件对,如果对于一种情况有三种或以上的条件对就不适合了.)
③把需要的标识保存在业务bean(安装位置,系统和用户应用,两种选择可以通过boolean区分)
额外:①在清单文件中,manifest配置属性installLocation=”安装位置”可以配置优先安装位置.
②应用程序的安装类型,可以通过小图标来美化.参考ui
2.2 ListView中区分系统应用和用户ui(上面为用户应用,下面为系统应用)
获取到List集合的时候进行遍历,增加两个小集合(一个保存为用户的集合,一个保存为系统的集合)
adapter中返回条目数的时候,把两个小集合的长度加起来放进去.
返回view条目显示的时候,用户集合的get(position)可以正常显示,系统应用的集合应为在用户集合的下面,所以它的索引对应是position-userlist.size()
2.3 ListView的标签(目的:用来区分系统应用和用户应用的两个小条目)
①返回count条目数的时候,增加两条(一个用户应用条目,一个系统应用条目)
②返回view的时候,在position==0,和position==userlist.size()的时候插入这两个条目,这两个条目本质上就是两个TextView而已.
③userlist和systemlist的索引现在为position-1,和position-userlist-1-1(两个条目)
2.4 复用历史缓存bug
利用debug查看空指针的位置(链式变成不方便直接区分的时候).
因为复用convertView的时候,也把小条目给复用了,所以在复用converView的时候还需要判断它是否是一个RelativerLayout(应用程序条目的布局文件类型)(或者直接判断getTag()是否为空);
3.程序管理的浮动图标
在ListView中增加一个fastScrollEnable=”true”//快速拖动的属性
①需求希望系统应用和用户应用的区分小条目一直浮现在窗口的第一个位置.
在LIstView的所在的帧布局FrameLayout中指定一个TextView控件(因为是帧布局,它会一直悬浮在ListView的上方)
②给ListView注册一个滚动的监听器
onScoll()方法,一旦滚动就执行
在这个方法里,判断firstVisibleItem是否大于userlist.size(),代表用户应用已经被滚动到不可见的位置,这时候就可以修改悬浮TextView控件的内容了,否则就显示为用户应用(else即可,没必要再判断了.因为不是系统应用,就是用户应用,当第一个条目小于userlist.size(),就代表最前面是用户应用了)
出现空指针异常,因为userlist集合是在子线程,可能会出现线程还未执行完的情况,所以修改之前要判断userlist是否为空.
onScollStateChanger(),当滚动的状态发生变化的时候就执行:静止>>滚动.滚动到>>静止
4,悬浮窗体
4.1 对话框的缺点:位于屏幕中间,样式和大小不方便控件(要自定义控件,样式文件等.)
属于一个重量级的控件,对资源消耗高一些
4.2 悬浮窗体:PopupWindow
①用户点击按钮就显示一个悬浮窗体
②悬浮窗体的代码实现步骤:
//一个悬浮的容器,在当前的activity 上显示
PopupWindow popupwindow = new PopupWindow(View,width,height);
Width,Height:-2(WRAP_CONTENT,MATCH_PARENT=-1)
额外:每一个布局都有LinearLayout.Layloutparams属性
显示popupwindow到屏幕上
popup.showAtLocation(parent(显示的父窗体view),gravity(对其方式,一般设置为左上角),x,y(窗体水平和竖直方向的偏移量 ))
4.3 希望点击条目的时候弹出悬浮窗体
Listview.setOnItemClickListener(){
PopupWindow pw = new PopupWindow(View(自定义),width,height);
//修改悬浮窗体的位置,因为这个位置是从条目在窗体的位置来决定
int []location =new int[2]
View(方法上的参数).getLocationInWindow(location);//需要一个int数组作为参数来保存坐标x,y
//希望在窗体上只有一个pw存在
//抽取出来做成一个成员变量,创建之前,判断一下是否已经存在悬浮窗体
If(pw!=null){
Pw.dismiss();
Pw = null;
}
//拖动界面的时候窗体还在悬浮
当listView被滚动的时候,把它注销掉
}
4.4 好看的popup窗体(自定义一个view)
参考样式.ps.TextView 的ems属性可以设置单行显示数目s
出现悬浮窗体的时候动画效果(从小到大变化,缩放动画即可)
但是指定了动画却没有生效的原因:
①手机自身问题:比如华为默认开启了省电模式,在设置中可以关闭动画效果
②动画要求启动必须要有背景色,popup默认是没有背景色的
popup.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))//设置popup的背景
4.5悬浮窗体的点击事件
①指定点击事件的时候可以通过setOnClickListener(外部类.this);让外部类去继承实现
②点击了对应的项目应该关闭popup窗体.
当用户点击返回,或者 activity关闭的时候应该关闭popup窗体,不然会报红色异常窗体泄露.