手機衛士07_自定義吐司_桌面小火箭_短信備份_接口和回調_應用程序信息,

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 保存信息便可

相關文章
相關標籤/搜索