1,自定義吐司顯示風格android
①建立一個佈局文件(代碼註冊的View看不出效果,因此仍是定義佈局文件比較好)數據庫
這裏的背景是.9圖片會根據包裹內容來拉伸api
②在顯示自定義吐司的界面,顯示的吐司經過View.inflate()建立app
③在設置中心增長一條修改歸屬地顯示風格.ide
{"半透明","活力橙","衛士藍","金屬灰","蘋果綠"};工具
點擊以後彈出一個單選對話框.佈局
builder.setSingleChoiceItems(對應選擇的條目,默認選中的(回顯sp),監聽器(){post
重寫的方法(){動畫
傳進來的參數就是被選中的條目ui
保存選中的條目到sp中
顯示出來後關閉它自己.
}
});
④在服務類獲取到選中的條目,並賦值給對應的View便可
2,修改歸屬地顯示的位置
目標:用戶能夠拖動歸屬地吐司顯示的位置
①param.x(參照當前窗體的位移距離)距離水平方向的距離
param.y 距離豎直方向的距離,並更新給窗體:wm.updateViewLayout(view,param)
吐司默認是以手機中央爲出發點.
Param.gravity = Gravity.LEFT + Gravity.TOP//座標系爲窗體的左上角
②用戶拖動,就是觸摸位置的偏移量
View.onTouchListener(){
onTouch(v,event){
判斷event的動做
event.Action_Down:
獲取按下的座標
event.Action_MOVE:
獲取新的座標(移動一次獲取一次)而後把偏移量賦值給param.x.y
event.Action_up:
//返回爲true會一直獲取觸摸動做
}
};
③拖動的時候沒有日誌打印.
由於para.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE設置不可觸摸,刪除.
還須要修改Type類型 Type_PRIORITY_PHONE//跟電話相同優先級的窗體類型,能夠相應觸摸和點擊事件 表明的數字2007,Toast:2005,//其它類型用的限制大一些.
④須要權限SYSTEM_ALERT_WINDOW
額外:param 指定gravity屬性,指定窗體類型,配置權限.
3.拓展:小火箭效果
①小火箭其實是兩張圖片的切換,能夠經過animation-list節點的xml文件定義動畫
經過幫助文檔>>>Develop>>>APP Resource>>Animation and Graphics>>OverView
能夠看到xml文件定義的動畫
兩張圖片每一個播放200毫秒便可
②小火箭要在桌面上顯示出來,因此要建立一個服務,監聽桌面顯示事件.
對象windowmanager,建立一個imagerView,設置動畫到它的背景屬性中
經過AnimationDrawable xx = iv.getBackground();//獲取出來再強轉
xx.Start()
param參數,拷貝吐司的就行了.
修改type和不可觸摸屬性.指定對其方式
wm.addView(xx,param);
③定義一個主界面去開啓和中止服務
④添加權限System_ALERT_WINDOW//系統級別的窗體權限
⑤火箭要能在窗體上來回移動
註冊觸摸事件,獲取用戶手指移動的偏移量(移動距離-初始距離)賦值給param
⑥火箭發射動做,
MotionEvent.ACTION.UP //當手指鬆開的時候
判斷if(parmas.y>300&¶ms.x>100&¶m.x<300)//用尺子去量
其實煙霧效果是一個透明的activity//由於發射的時候界面不能點擊
Background 和Src的區別
src的範圍比Background要小一些(參考盒子模型,內容和背景)
配置這個界面成透明風格:@android:style/theme.transLcent.noTitleBar
⑦當火箭發射的時候開啓意圖便可(界面開啓XX秒以後finsh()掉)
startActivity()//報錯,若是是從非 activity中啓動activity
須要開啓一個新的任務棧(FLAG_ACTIVITY_NEW_TASK)
由於服務裏是沒有任務棧的
intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK)設置一個flag便可.
⑧發射火箭的時候,定義一個子線程,for循環把Y軸每隔XX秒依次減小便可(默認出發點在屏幕左上角,屏幕下方Y軸就會增長)
因爲是在子線程中更新ui,經過handler.post(new Runable(){更新ui邏輯});
額外:火箭發送完畢就應該消失掉,並關閉activity
火箭發送的時候,煙霧應該延遲XX秒再出現.
但願小火箭能夠移出屏幕:WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
4.短信備份的時候
經常使用工具裏,新建一個功能,短信備份
①點擊備份,經過內容提供者讀取短信數據庫mmssms,sms表
記得加讀寫短信數據庫的權限,經過xml文件序列化保存信息.
每一條短信都是一個節點(info,sms名字隨意啦)
而後經過添加子節點寫入信息便可(信息放在標籤之間的文本中serializer.text()添加便可)
文件保存在外部儲存卡上,記得也要加權限讀寫sd卡
最後記得關閉輸出流
②短信備份的細節問題:
異常不能所有捕獲,要分別提示
短信數量不少的狀況下,序列化保存須要花費不少時間,因此要放到子線程
放到子線程就不能直接打印吐司了,要經過handler發送消息到主線程.
handler.sendEmptyMessage(常量)//發送空信息,不用建立Message對象,簡化方式.
線程開啓以前,建立一個ProgressDiaLog()//進度條,設置水平顯示,並show()出來
Pd.setMax(cursor.getCount())//獲取返回結果集最大行數爲進度條的最大值
循環以前設置爲1,每備份一條進度就加1.
在finally之中關閉對話框
5,代碼的分工編寫
假設兩個工程師 ①小A ②小B
小A對界面比較熟悉 編寫ui相關邏輯,須要實現業務邏輯就調用B的工具類
小B對後臺比較熟悉 編寫業務實現的工具類,須要考慮實現業務邏輯的細節.
如:前面的短信,B編寫了備份的工具類,還須要考慮到ProgressDiaLog的進度問題.
6_接口和回調(重要)
場景,客戶改需求,不要進度條對話框,而是要界面顯示進度條
小A:經過ProgressBas控件實現,讓它跟界面的條目表框重疊就能暫時隱藏起來.
也可讓進度條覆蓋短信備份的整個條目
小B:修改工具類,設置pb的最大進度和循環進度
而後客戶又要改回來(版本控制checkOut出來便可)
其它需求:又要對話框,又要進度條
6.1 實際開發中,場景應該是這樣的:
小A :你暴露一個接口給我
小B :我提供一個回調給你
目的:下降兩我的業務之間的耦合性.
6.2 實現步驟
小B 在代碼中另外抽取一個方法,返回最大值和進度,這樣就不用關心是什麼控件來使用.
在工具類中定義一個接口,是備份邏輯的回調
接口中定義兩個抽象方法:一個設置最大值,一個短信備份的進度
而後在具體備份的方法中,參數再也不傳入控件,而是傳入這個接口的實現類(或匿名對象),而後把最大值和進度設置到這個實現類的方法中.
小A,使用備份的方法,傳入接口的實現類,重寫這兩個方法,能夠獲取到設置的最大值和進度.
爲何使用接口:由於調用這個備份的方法,是必需要重寫獲取最大值和進度的方法.
其實谷歌在設置代碼的時候就是採用的這樣一種模式,不關心具體實現的步驟,只負責創建連接.
7.1 短信的還原......................
按接口和回調的方式寫
8,程序管理器的ui (程序圖標,程序名,佔用內存,卸載按鈕)
8.1定義一個activity,程序管理界面,參考ui;
進行home界面的跳轉設置.
8.2手機可用內存,SD可用空間的數據填充
①機身內存 ROM(呵呵) 運行內存RAM,可用內存是指的機身內存
②定義系統信息的工具類,能夠獲取機身內存和可用內存
getInternalStorageSize()//自定義名稱,獲取系統內置存儲空間的總大小
File file = Environment.getDataDirectory()//返回機身內存目錄
Long length = file.getTotalSpace()//獲取當前分區的大小
getInternalStorageFreeSize()//自定義名稱,獲取系統內置存儲空間可用大小
File file = Environment,getDataDirectory()//返回機身內存目錄
Long length = file.getFreeSpace()//獲取可用分區大小
//獲取SD卡可用大小方法,略
③把數據展現在頁面上.
格式化器:Formatter.formatFileSize(上下文,數據);//格式化sd卡可用空間的數據顯示
裝在國產手機上可能獲取的內存空間和儲存卡空間爲0
由於有的手機是不支持外部存儲卡(sd卡)的(爲了把機身內存多賣點錢,很黑的),或者是直接把一塊SD卡焊死在主板上,修改了系統的API致使獲取的數據不正常.
④程序管理器的數據獲取
android下業務方法的分包:mobliesafe.engine包,放置業務邏輯相關的代碼
參考類名:AppInfoProvider.class,建立一個業務bean儲存應用程序的信息.
應用程序的圖標用Drawable保存,由於它的範圍比BitMap更廣.
應用程序的名稱,包名,app大小
新的api 程序管理器 PackageManager類,有各類各樣的信息關於應用的.
獲取方式PackageManager pm = Context.getPackageManager();
能夠獲取應用程序的圖標,權限,標籤,等不少信息
pm.getInstalledPackagers(flag(附加的可選標記,0))//返回一個packageinfo的集合.
Packageinfo.packagename //包名
packageinfo.applicationInfo //經過安裝包獲得應用程序的信息
Drawable appicon = packageinfo.applicationInfo .loadicon(pm)
String appname = packageinfo.applicationInfo.loadLabel(pm).toString()
應用程序的apk文件都是在/data/app目錄下,系統自帶的System/app目錄下
packageinfo.applicationInfo.sourceDir;//獲得文件的完整路徑
經過路徑能夠得到文件對象,再經過文件對象file.length返回文件大小.
最後給業務bena 保存信息便可