




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 手機衛(wèi)士Day761_ 短信備份的原理_301、 查看金山手機衛(wèi)士的短信備份功能。 短信備份的原理,是用內(nèi)容提供者讀取短信,然后保存。2、 在高級工具AtoolsActivity布局文件里添加短信備份,并處理點擊事件smsBackup3、 在com.itheima.mobilesafe.utils工具包目錄創(chuàng)建工具類SmsTools用于寫短信備份代碼 A:短信備份方法backup(Context context,String path) B:導出短信數(shù)據(jù)庫保存的路徑data/data/databases/mmssms.dbaddress 短信收件人發(fā)件人地址date 短信接收的時間type
2、1 發(fā)進來短信 2 發(fā)出去短信read 1已讀短信 0 未讀短信 C:參照源代碼Uri路徑怎么寫/備份所有的短信,未讀的、已讀的等待Uri uri = Uri.parse(content:/sms/); 讀取短信代碼:Cursor cursor = resolver.query(uri, new Stringaddress,date,type,body, null, null, null);while(cursor.moveToNext()String address = cursor.getString(0);String date = cursor.getString(1);String
3、type = cursor.getString(2);String body = cursor.getString(3);把短信生成XML文件,得到xml的序列化器,設(shè)置參數(shù) XmlSerializer serializer = Xml.newSerializer();File file = new File(path);FileOutputStream os = new FileOutputStream(file);/設(shè)置序列化器的參數(shù)serializer.setOutput(os, utf-8); 設(shè)置文檔的開頭和結(jié)束 serializer.startDocument(utf-8, tru
4、e); serializer.endDocument();設(shè)置文檔根節(jié)點smss開始和結(jié)束serializer.startTag(null, smss);serializer.endTag(, smss);設(shè)置sms里面具體內(nèi)容,在while循環(huán)里面做 serializer.startTag(null, sms);serializer.startTag(null, address);String address = cursor.getString(0);serializer.text(address);serializer.endTag(null, address); serializer.
5、endTag(null, sms);4、 使用寫好的短信備份工具 判斷sdcard是否存在if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),smsbackup.xml);try SmsTools.backup(this, file.toString();Toast.makeText(this, 短信備份成功, 0).show(); cat
6、ch (Exception e) / TODO Auto-generated catch blocke.printStackTrace();Toast.makeText(this, 短信備份失敗, 0).show();elseToast.makeText(this, sdcard不可用, 0).show();return;5、添加讀短信的權(quán)限知識拓展 生成excel表 poc62_接口和回調(diào)_261、 當前備份短信代碼,是寫在主線程,如果短信很多的話會出現(xiàn)ANR異常。2、 把短信備份代碼移植到子線程;new Thread() public void run() try SmsTools.bac
7、kup(AtoolsActivity.this, file.toString(); catch (Exception e) e.printStackTrace(); ;.start();3、 模擬短信備份耗時,在沒一個While循環(huán)里休眠1000毫秒4、 創(chuàng)建一個對話框ProgressDialog用戶等待備份時間,和消掉對話框 顯示對話框 final ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage(請稍等,正在備份鐘.); dialog.show(); 備份完后在子線程消掉對話框? dialog.dismi
8、ss();運行演示,看效果;5、 做成是有加載進度的對話框dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);但是我們需要知道總條數(shù)和當前備份了多少條;運行演示看效果在短信備份方法增加參數(shù)ProgressDialog dialog參數(shù)在備份方法里設(shè)置短信總條數(shù)/設(shè)置總條數(shù)dialog.setMax(cursor.getCount(); 定義進度/當前進度int progress = 0;在while循環(huán)里跟新進度progress +;dialog.setProgress(progress);考慮在工作中真實的情況:備份短信界面 UI
9、 是由A程序員寫的;備份短信的功能工具類 是用B程序員寫的;A程序員被老板叫去需要改成進度條,在布局文件修改 在代碼里初始化(ProgressBar) findViewById(R.gressBar1);并找程序員B幫忙吧參數(shù)修改成ProgressBar這時候程序員A又被老板叫去說,還沒有原來的好看,改成原來的吧;如果有版本控制工具,可以還原,但同時也還原了B程序員的代碼;這時候老板又突發(fā)奇想,說想要對話框同時顯示進度條A程序員就需要把注釋的地方打開,然后需要B程序員再增加一個參數(shù)ProgressDialog ,B程序員還需要做如下代碼:progressDialog.setMax(
10、cursor.getCount();在while循環(huán)里還得progressDialog.setProgress(progress);給我暴露一個接口吧給我提供一個回調(diào)6、接口的定義B工程師最關(guān)心的是備份的過程,并不關(guān)心如何更新UI;但B工程師知道在相應時間更新需要跟新對應UI;B工程師定義一個接口。暴露一些回調(diào);/ B 工程師就定義一個接口,暴露一些回調(diào)方法;public interface SmsBackupCallBack /* * 當短信備份前調(diào)用的方法 * param total 短信的總條數(shù) */public void beforeSmsBackup(int total); /* *
11、 當短信備份過程中調(diào)用 * param progress 備份的進度 */public void onSmsBackup(int progress);備份方法參數(shù)和里面的變化 backup(Context context, String path, SmsBackupCallBack backupCallBack) 當短信備份前調(diào)用的方法backupCallBack.beforeSmsBackup(cursor.getCount();While循環(huán)里面的代碼backupCallBack.onSmsBackup(progress);7、回調(diào)的使用new SmsBackupCallBack() O
12、verridepublic void onSmsBackup(int progress) dialog.setProgress(progress); progressBar1.setProgress(progress);Overridepublic void beforeSmsBackup(int total) dialog.setMax(total);progressBar1.setMax(total);A程序員有接到任務了,把進度掉去掉就行了,這樣就很方便了;63_獲取手機存儲空間信息_221、 要開發(fā)軟件管理這個功能了,啟動2.3模擬題,參照金山手機衛(wèi)士看一下;2、 創(chuàng)建AppManag
13、erActivity并在功能清單文件注冊,驗證完成跳轉(zhuǎn)邏輯;3、 參照金山手機衛(wèi)士,寫相對布局,用于保存 這里說的內(nèi)存和電腦說的內(nèi)存是有區(qū)別的,這里的內(nèi)存指的是手機內(nèi)部存儲空間,相當于手機內(nèi)置了一塊硬盤;4、 獲取某個路徑可用的空間的大小public long getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到有多少個可以使用int count =statfs.getAvailableBlocks();/得到每一個的容量int size = statfs.getBlockSize();return count*size;
14、解釋為什么要相乘在左面上創(chuàng)建一個空文件連續(xù)寫4個a一邊寫一遍看畫圖進一步分析5、 修改getTotalSpace()方法直接返回計算好的結(jié)構(gòu)/* * 獲取某一個路徑的可用空間的總大小 * param path * return */public String getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到一個可以用的區(qū)域的大小int count =statfs.getAvailableBlocks();/得到一個可以用的區(qū)域的個數(shù)int size = statfs.getBlockSize();return Form
15、atter.formatFileSize(this, count*size);Formatter的包是: 高端手機內(nèi)存比較大,int類型無法容納,需要改成long類型原理:int 最大值2147483647 2147483647/1024 = 2097151.999023438 KB 2097151.999023438/1024 = 2047.999999046326 MB; 2047.999999046326/1024 = 1.999999999068677 GB 支持2G左右的大小數(shù)據(jù),多余的就溢出了public String getTotalSpace(String path)StatF
16、s statfs = new StatFs(path);long count =statfs.getAvailableBlocks();long size = statfs.getBlockSize();return Formatter.formatFileSize(this, count*size); 64_獲取手機里面應用程序信息_201、 Android的應用程序安裝在哪里呀? pc電腦默認安裝在C:Program Files Android 的應用安裝在哪里呢,如果是用戶程序,安裝在data/app/目錄下 安裝Android軟件 做兩件事 A:把APK拷貝到data/app/目錄下
17、B:把安裝包信息寫到data/system/目錄下兩個文件packages.list 和 packages2、 安裝包信息在data/system/ Packages.list 里面的0 表示系統(tǒng)應用 1 表示用戶應用 Packages.xml是存放應用的一些權(quán)限信息的;系統(tǒng)帶應用安裝在system/app/目錄下3、 用PackageManger得到應用的信息; A、創(chuàng)建新包 里面創(chuàng)建新類AppInfoProvider B、在AppInfoProvider里面創(chuàng)建方法public List getAppInfos() C、創(chuàng)建實體類AppInfo,并實現(xiàn)set和get方法 private D
18、rawable icon; private String name; private String packageName; private boolean isRom;4、 部分代碼的實現(xiàn) PackageManager pm = context.getPackageManager();List infos = pm.getInstalledPackages(0);for(PackageInfo info : infos)AppInfo appinfo = new AppInfo();String packageName = info.packageName;Drawable icon = i
19、nfo.applicationInfo.loadIcon(pm);String name = info.applicationInfo.loadLabel(pm).toString();appinfo.setIcon(icon);appinfo.setName(name);appinfo.setPackageName(packageName);appinfos.add(appinfo);public class TestAppInfoProvider extends AndroidTestCase public void testgetAppInfos() List appinfos = Ap
20、pInfoProvider.getAppInfos(getContext(); for(int i = 0; i appinfos.size();i+)AppInfo info = appinfos.get(i);System.out.println(info.toString(); 6、為看方便打印,重新toString()方法 65_程序管理器的UI顯示_431、 獲取應用程序類型,是用戶應用還是系統(tǒng)應用 在AppInfo 實體類增加 boolean isUuserApp 并創(chuàng)建set和get方法 info.applicationInfo.flags; /flags是應用程序的特征標志。可
21、以是任意標志的組合。一個int在內(nèi)存中占4個字節(jié),一個字節(jié)占8個二進制位,所以一個int在內(nèi)存中表示32位。畫圖分析理解flags最多可以移位31位,因為總共有32位;這樣設(shè)計的目的是什么呢?看看生活中的案例-機讀卡看圖片答題卡 英語答題卡 參照機讀卡思路和原理我們開發(fā)一個機讀系統(tǒng)舉例生活中的例子,老師手工改試卷如何知道是系統(tǒng)應用還是用戶應用的,畫圖理解寫具體代碼了-判斷是系統(tǒng)應用還是用戶應用if(flas & ApplicationInfo.FLAG_SYSTEM)=0)/用戶應用else/系統(tǒng)應用判斷是按照在內(nèi)存里還是外部存儲里面if(flas & ApplicationInfo.FLAG
22、_EXTERNAL_STORAGE)=0)/手機內(nèi)存else/外部存儲與運算比if else 判斷效率高一些賦值測試運行;2、 布局文件寫上ListView ,并加上加載效果 3. 初始化ListView和加載效果線性布局并加載數(shù)據(jù) A:在onCreate()方法里,子線程加載數(shù)據(jù) new Thread() public void run() infos = AppInfoProvider.getAppInfos(AppManagerActivity.this); handler.sendEmptyMessage(0); .start(); 刷新界面用handler private Handl
23、er handler = new Handler()public void handleMessage(android.os.Message msg) adapter = new MyAppAdapter();ll_app_manager.setAdapter(adapter); B:自定義Adapter,并把數(shù)據(jù)傳進數(shù)據(jù),自定義每條的布局list_app_item.xml;布局文件模仿金山手機衛(wèi)士部分功能 代碼實現(xiàn)getView()里: View view = null;ViewHolder holder;if(convertView != null)view = convertView ;
24、holder = (ViewHolder) view.getTag();elseview =View.inflate(AppManagerActivity.this, R.layout.list_app_item, null);holder = new ViewHolder();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);holder.tv_name = (TextView) view.findViewById(R.id.tv_name);holder.tv_location = (TextView) view.fi
25、ndViewById(R.id.tv_location);view.setTag(holder);AppInfo info = infos.get(position);holder.iv_icon.setImageDrawable(info.getIcon();holder.tv_name.setText(info.getName();if(info.isRom()holder.tv_location.setText(手機內(nèi)存);elseholder.tv_location.setText(外部存儲); 4、 設(shè)置指定應用安裝在手機內(nèi)存中還是外部存儲卡中 在功能清單根節(jié)點處添加 android
26、:installLocation=auto auto:自動安裝,優(yōu)先安裝在手機內(nèi)存里面 ,可以切換;internalOnly:只安裝在手機內(nèi)存里面,不可以切換; preferExternal:安裝在外包存儲,可以選切換; 66_復雜的ListView的顯示_291、 把系統(tǒng)應用和用戶應用區(qū)分開來 定義兩個集合 List userInfos; 、List systemInfos; 初始化數(shù)據(jù),用for區(qū)分開來 userInfos = new ArrayList();systemInfos = new ArrayList();for(AppInfo info : infos)if(info.isU
27、serApp()/用戶應用userInfos.add(info);else/系統(tǒng)應用systemInfos.add(info);2、 在適配器 getCount()方法里重寫成如下; public int getCount() return userInfos.size()+systemInfos.size(); 在適配器的getView()方法如何修改呢?畫圖分析3、代碼實現(xiàn) AppInfo info = null;if(position userInfos.size()/加載用戶程序info = userInfos.get(position);else/加載系統(tǒng)程序/系統(tǒng)的0int new
28、position = position -userInfos.size() ;info = systemInfos.get(newposition); 系統(tǒng)應用和用戶應用的區(qū)別,系統(tǒng)的沒法卸載,用戶程序可以卸載4、 修改適配器增加 用戶程序 和 系統(tǒng)程序 條目 A:在適配器getCount()方法里修改 public int getCount() /多了兩個TextView的item 所以 +1 +1return userInfos.size()+1+systemInfos.size()+1; B:在getView()方法里修改 getView的作用:是控制每個位置顯示的內(nèi)容 添加用戶程序的T
29、extViewif(position = 0)/創(chuàng)建一個TextView顯示多少個用戶程序TextView view = new TextView(AppManagerActivity.this);view.setText(用戶程序(+userInfos.size()+);view.setTextColor(Color.WHITE);view.setBackgroundColor(Color.GRAY);return view;添加系統(tǒng)程序的TextViewelse if(position = userInfos.size() +1 )TextView view = new TextView(
30、AppManagerActivity.this);view.setText(系統(tǒng)程序(+systemInfos.size()+);view.setTextColor(Color.WHITE);view.setBackgroundColor(Color.GRAY);return view;特殊情況處理了,需要處理一般情況了,畫圖分析 用戶程序顯示else if(position = userInfos.size()/用戶程序int newposition = position -1;info = userInfos.get(newposition);系統(tǒng)程序顯示else/系統(tǒng)程序int newp
31、osition = position -1- userInfos.size() - 1;info = systemInfos.get(newposition);運行拖動演示報錯,講解報錯的原因刪除應用 ,進入應用管理 ,刪除應用 進入應用管理contverView 重用舊的視圖,如果可能的話。注意:您應該檢查,這個觀點是在使用非空和適當?shù)念愋汀H绻遣豢赡軐⑦@個視圖來顯示正確的數(shù)據(jù),這種方法可以創(chuàng)建一個新的視圖。異構(gòu)列表可以指定數(shù)量的視圖類型,以便這一觀點總是正確的類型(見getViewTypeCount()和getItemViewType(int)。5、解決報錯問題if(convertVi
32、ew!=null&convertView instanceof RelativeLayout)/.else/.6、回顧處理ListView 中的getCount()和getView()這個過程67_ListView的狀態(tài)欄_14 知識拓展,增加快速滾動條 在ListView布局文件加上: android:fastScrollEnabled=true1、 在布局文件添加TextView長得和getView里面創(chuàng)建的一樣 2. 給ListView設(shè)置滾動監(jiān)聽ll_app_manager.setOnScrollListener(new OnScrollListener() Overridepubli
33、c void onScrollStateChanged(AbsListView view, int scrollState) Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) if(systemInfos != null&userInfos != null)if(firstVisibleItem userInfos.size()/顯示系統(tǒng)應用tv_status.setText(系統(tǒng)程序(+systemInfos.size()+
34、);else/顯示用戶應用tv_status.setText(用戶程序(+userInfos.size()+););68_popupwindow的使用_441、 打開2.3模擬器演示聯(lián)系人效果2、 創(chuàng)建一個新工程專門學習popupwindow一個彈出窗口,可以用來顯示一個任意視圖。彈出窗口是一個浮動的容器,出現(xiàn)在當前活動的頂端。 在按鈕中添加點擊事件初識popupWindowTextView contentView = new TextView(this);contentView.setText(我是PopupWindow);contentView.setTextColor(Color.RED
35、);View parent = findViewById(R.id.rl_root);PopupWindow window = new PopupWindow(contentView, 200, 100);window.showAtLocation(parent, Gravity.LEFT + Gravity.TOP, 200, 100);左上角對齊通過設(shè)置PopupWindow 的背景,了解它有多大PopupWindow window = new PopupWindow(contentView, 200, 100);window.setBackgroundDrawable(new Color
36、Drawable(Color.GREEN);window.showAtLocation(parent, Gravity.LEFT + Gravity.TOP, 200, 100);點擊返回直接退出Activity 對話框點擊退出是消掉,那么PopupWindow是否也可以呢?PopupWindow window = new PopupWindow(contentView, 200, 100,true);3、 把學習好的PopupWindow 移植到工程中 A:監(jiān)聽每點一條的事件,并打印日志; Object obj = ll_app_manager.getItemAtPosition(position); System.out.println(obj=+obj); getItemAtPosition(position): 獲取數(shù)據(jù)列表中指定的位置。 B:在適配器中修改如下,運行點擊,看日志public Object getItem(int position) return asbllldkk;解決該問題:Overridepublic Object getItem(int position) AppInfo info = null
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 緊跟時代步伐的農(nóng)業(yè)職業(yè)經(jīng)理人考試試題及答案
- 地槽電纜敷設(shè)施工方案
- 2024年項目管理資格特點試題及答案
- 2025年資料員-崗位技能(資料員)證模擬考試題及答案
- 硅冶煉與可持續(xù)發(fā)展考核試卷
- 銀行從業(yè)資格證考試綜合能力評估試題及答案
- 電氣工程與智能電網(wǎng)考核試卷
- 2024年項目管理資格考試的通識知識點試題及答案
- 橡膠制品在建筑領(lǐng)域的應用考核試卷
- 窗簾面料的智能抗菌特性考核試卷
- 2025年長春汽車職業(yè)技術(shù)大學單招職業(yè)技能測試題庫參考答案
- 心理健康案例報告-青少年網(wǎng)癮的成因及對策
- 湖北省襄陽襄城區(qū)四校聯(lián)考2025屆中考化學模擬試卷含解析
- 幼兒園獲獎公開課:大班語言《我是霸王龍》微課件
- 2025 年意識形態(tài)工作計劃(方案)
- 2025年河南省煙草專賣局(公司)高校畢業(yè)生招聘180人高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年江蘇省張家港市文化中心管委辦招聘3人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年河南應用技術(shù)職業(yè)學院單招職業(yè)適應性測試題庫含答案
- 私募股權(quán)投資風險識別技術(shù)-深度研究
- 衛(wèi)生院、社區(qū)衛(wèi)生服務中心公民個人信息安全管理制度
- 微訓練 一文多考 備考高效之小說《十八歲的李響》蔡楠-教師版
評論
0/150
提交評論