標籤:
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查看null 指標的位置(鏈式變成不方便直接區分的時候).
因為複用convertView的時候,也把小條目給複用了,所以在複用converView的時候還需要判斷它是否是一個RelativerLayout(應用程式條目的布局檔案類型)(或者直接判斷getTag()是否為空白);
3.程式管理的浮動表徵圖
在ListView中增加一個fastScrollEnable=”true”//快速拖動的屬性
①需求希望系統應用和使用者應用的區分小條目一直浮現在視窗的第一個位置.
在LIstView的所在的幀布局FrameLayout中指定一個TextView控制項(因為是幀布局,它會一直懸浮在ListView的上方)
②給ListView註冊一個滾動的監聽器
onScoll()方法,一旦滾動就執行
在這個方法裡,判斷firstVisibleItem是否大於userlist.size(),代表使用者應用已經被滾動到不可見的位置,這時候就可以修改懸浮TextView控制項的內容了,否則就顯示為使用者應用(else即可,沒必要再判斷了.因為不是系統應用,就是使用者應用,當第一個條目小於userlist.size(),就代表最前面是使用者應用了)
出現null 指標異常,因為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表單,不然會報紅色異常表單泄露.
手機衛士08_應用程式的flags_PopupWidnow懸浮表單