楊光福-手機(jī)衛(wèi)士day7_第1頁(yè)
楊光福-手機(jī)衛(wèi)士day7_第2頁(yè)
楊光福-手機(jī)衛(wèi)士day7_第3頁(yè)
楊光福-手機(jī)衛(wèi)士day7_第4頁(yè)
楊光福-手機(jī)衛(wèi)士day7_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 手機(jī)衛(wèi)士Day761_ 短信備份的原理_301、 查看金山手機(jī)衛(wèi)士的短信備份功能。 短信備份的原理,是用內(nèi)容提供者讀取短信,然后保存。2、 在高級(jí)工具AtoolsActivity布局文件里添加短信備份,并處理點(diǎn)擊事件smsBackup3、 在com.itheima.mobilesafe.utils工具包目錄創(chuàng)建工具類SmsTools用于寫(xiě)短信備份代碼 A:短信備份方法backup(Context context,String path) B:導(dǎo)出短信數(shù)據(jù)庫(kù)保存的路徑data/data/databases/mmssms.dbaddress 短信收件人發(fā)件人地址date 短信接收的時(shí)間type

2、1 發(fā)進(jìn)來(lái)短信 2 發(fā)出去短信read 1已讀短信 0 未讀短信 C:參照源代碼Uri路徑怎么寫(xiě)/備份所有的短信,未讀的、已讀的等待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è)置文檔的開(kāi)頭和結(jié)束 serializer.startDocument(utf-8, tru

4、e); serializer.endDocument();設(shè)置文檔根節(jié)點(diǎn)smss開(kāi)始和結(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、 使用寫(xiě)好的短信備份工具 判斷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)限知識(shí)拓展 生成excel表 poc62_接口和回調(diào)_261、 當(dāng)前備份短信代碼,是寫(xiě)在主線程,如果短信很多的話會(huì)出現(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、 模擬短信備份耗時(shí),在沒(méi)一個(gè)While循環(huán)里休眠1000毫秒4、 創(chuàng)建一個(gè)對(duì)話框ProgressDialog用戶等待備份時(shí)間,和消掉對(duì)話框 顯示對(duì)話框 final ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage(請(qǐng)稍等,正在備份鐘.); dialog.show(); 備份完后在子線程消掉對(duì)話框? dialog.dismi

8、ss();運(yùn)行演示,看效果;5、 做成是有加載進(jìn)度的對(duì)話框dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);但是我們需要知道總條數(shù)和當(dāng)前備份了多少條;運(yùn)行演示看效果在短信備份方法增加參數(shù)ProgressDialog dialog參數(shù)在備份方法里設(shè)置短信總條數(shù)/設(shè)置總條數(shù)dialog.setMax(cursor.getCount(); 定義進(jìn)度/當(dāng)前進(jìn)度int progress = 0;在while循環(huán)里跟新進(jìn)度progress +;dialog.setProgress(progress);考慮在工作中真實(shí)的情況:備份短信界面 UI

9、 是由A程序員寫(xiě)的;備份短信的功能工具類 是用B程序員寫(xiě)的;A程序員被老板叫去需要改成進(jìn)度條,在布局文件修改 在代碼里初始化(ProgressBar) findViewById(R.gressBar1);并找程序員B幫忙吧參數(shù)修改成ProgressBar這時(shí)候程序員A又被老板叫去說(shuō),還沒(méi)有原來(lái)的好看,改成原來(lái)的吧;如果有版本控制工具,可以還原,但同時(shí)也還原了B程序員的代碼;這時(shí)候老板又突發(fā)奇想,說(shuō)想要對(duì)話框同時(shí)顯示進(jìn)度條A程序員就需要把注釋的地方打開(kāi),然后需要B程序員再增加一個(gè)參數(shù)ProgressDialog ,B程序員還需要做如下代碼:progressDialog.setMax(

10、cursor.getCount();在while循環(huán)里還得progressDialog.setProgress(progress);給我暴露一個(gè)接口吧給我提供一個(gè)回調(diào)6、接口的定義B工程師最關(guān)心的是備份的過(guò)程,并不關(guān)心如何更新UI;但B工程師知道在相應(yīng)時(shí)間更新需要跟新對(duì)應(yīng)UI;B工程師定義一個(gè)接口。暴露一些回調(diào);/ B 工程師就定義一個(gè)接口,暴露一些回調(diào)方法;public interface SmsBackupCallBack /* * 當(dāng)短信備份前調(diào)用的方法 * param total 短信的總條數(shù) */public void beforeSmsBackup(int total); /* *

11、 當(dāng)短信備份過(guò)程中調(diào)用 * param progress 備份的進(jìn)度 */public void onSmsBackup(int progress);備份方法參數(shù)和里面的變化 backup(Context context, String path, SmsBackupCallBack backupCallBack) 當(dāng)短信備份前調(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程序員有接到任務(wù)了,把進(jìn)度掉去掉就行了,這樣就很方便了;63_獲取手機(jī)存儲(chǔ)空間信息_221、 要開(kāi)發(fā)軟件管理這個(gè)功能了,啟動(dòng)2.3模擬題,參照金山手機(jī)衛(wèi)士看一下;2、 創(chuàng)建AppManag

13、erActivity并在功能清單文件注冊(cè),驗(yàn)證完成跳轉(zhuǎn)邏輯;3、 參照金山手機(jī)衛(wèi)士,寫(xiě)相對(duì)布局,用于保存 這里說(shuō)的內(nèi)存和電腦說(shuō)的內(nèi)存是有區(qū)別的,這里的內(nèi)存指的是手機(jī)內(nèi)部存儲(chǔ)空間,相當(dāng)于手機(jī)內(nèi)置了一塊硬盤(pán);4、 獲取某個(gè)路徑可用的空間的大小public long getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到有多少個(gè)可以使用int count =statfs.getAvailableBlocks();/得到每一個(gè)的容量int size = statfs.getBlockSize();return count*size;

14、解釋為什么要相乘在左面上創(chuàng)建一個(gè)空文件連續(xù)寫(xiě)4個(gè)a一邊寫(xiě)一遍看畫(huà)圖進(jìn)一步分析5、 修改getTotalSpace()方法直接返回計(jì)算好的結(jié)構(gòu)/* * 獲取某一個(gè)路徑的可用空間的總大小 * param path * return */public String getTotalSpace(String path)StatFs statfs = new StatFs(path);/得到一個(gè)可以用的區(qū)域的大小int count =statfs.getAvailableBlocks();/得到一個(gè)可以用的區(qū)域的個(gè)數(shù)int size = statfs.getBlockSize();return Form

15、atter.formatFileSize(this, count*size);Formatter的包是: 高端手機(jī)內(nèi)存比較大,int類型無(wú)法容納,需要改成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_獲取手機(jī)里面應(yīng)用程序信息_201、 Android的應(yīng)用程序安裝在哪里呀? pc電腦默認(rèn)安裝在C:Program Files Android 的應(yīng)用安裝在哪里呢,如果是用戶程序,安裝在data/app/目錄下 安裝Android軟件 做兩件事 A:把APK拷貝到data/app/目錄下

17、B:把安裝包信息寫(xiě)到data/system/目錄下兩個(gè)文件packages.list 和 packages2、 安裝包信息在data/system/ Packages.list 里面的0 表示系統(tǒng)應(yīng)用 1 表示用戶應(yīng)用 Packages.xml是存放應(yīng)用的一些權(quán)限信息的;系統(tǒng)帶應(yīng)用安裝在system/app/目錄下3、 用PackageManger得到應(yīng)用的信息; A、創(chuàng)建新包 里面創(chuàng)建新類AppInfoProvider B、在AppInfoProvider里面創(chuàng)建方法public List getAppInfos() C、創(chuàng)建實(shí)體類AppInfo,并實(shí)現(xiàn)set和get方法 private D

18、rawable icon; private String name; private String packageName; private boolean isRom;4、 部分代碼的實(shí)現(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、 獲取應(yīng)用程序類型,是用戶應(yīng)用還是系統(tǒng)應(yīng)用 在AppInfo 實(shí)體類增加 boolean isUuserApp 并創(chuàng)建set和get方法 info.applicationInfo.flags; /flags是應(yīng)用程序的特征標(biāo)志???/p>

21、以是任意標(biāo)志的組合。一個(gè)int在內(nèi)存中占4個(gè)字節(jié),一個(gè)字節(jié)占8個(gè)二進(jìn)制位,所以一個(gè)int在內(nèi)存中表示32位。畫(huà)圖分析理解flags最多可以移位31位,因?yàn)榭偣灿?2位;這樣設(shè)計(jì)的目的是什么呢?看看生活中的案例-機(jī)讀卡看圖片答題卡 英語(yǔ)答題卡 參照機(jī)讀卡思路和原理我們開(kāi)發(fā)一個(gè)機(jī)讀系統(tǒng)舉例生活中的例子,老師手工改試卷如何知道是系統(tǒng)應(yīng)用還是用戶應(yīng)用的,畫(huà)圖理解寫(xiě)具體代碼了-判斷是系統(tǒng)應(yīng)用還是用戶應(yīng)用if(flas & ApplicationInfo.FLAG_SYSTEM)=0)/用戶應(yīng)用else/系統(tǒng)應(yīng)用判斷是按照在內(nèi)存里還是外部存儲(chǔ)里面if(flas & ApplicationInfo.FLAG

22、_EXTERNAL_STORAGE)=0)/手機(jī)內(nèi)存else/外部存儲(chǔ)與運(yùn)算比if else 判斷效率高一些賦值測(cè)試運(yùn)行;2、 布局文件寫(xiě)上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ù)傳進(jìn)數(shù)據(jù),自定義每條的布局list_app_item.xml;布局文件模仿金山手機(jī)衛(wèi)士部分功能 代碼實(shí)現(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(手機(jī)內(nèi)存);elseholder.tv_location.setText(外部存儲(chǔ)); 4、 設(shè)置指定應(yīng)用安裝在手機(jī)內(nèi)存中還是外部存儲(chǔ)卡中 在功能清單根節(jié)點(diǎn)處添加 android

26、:installLocation=auto auto:自動(dòng)安裝,優(yōu)先安裝在手機(jī)內(nèi)存里面 ,可以切換;internalOnly:只安裝在手機(jī)內(nèi)存里面,不可以切換; preferExternal:安裝在外包存儲(chǔ),可以選切換; 66_復(fù)雜的ListView的顯示_291、 把系統(tǒng)應(yīng)用和用戶應(yīng)用區(qū)分開(kāi)來(lái) 定義兩個(gè)集合 List userInfos; 、List systemInfos; 初始化數(shù)據(jù),用for區(qū)分開(kāi)來(lái) userInfos = new ArrayList();systemInfos = new ArrayList();for(AppInfo info : infos)if(info.isU

27、serApp()/用戶應(yīng)用userInfos.add(info);else/系統(tǒng)應(yīng)用systemInfos.add(info);2、 在適配器 getCount()方法里重寫(xiě)成如下; public int getCount() return userInfos.size()+systemInfos.size(); 在適配器的getView()方法如何修改呢?畫(huà)圖分析3、代碼實(shí)現(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)應(yīng)用和用戶應(yīng)用的區(qū)別,系統(tǒng)的沒(méi)法卸載,用戶程序可以卸載4、 修改適配器增加 用戶程序 和 系統(tǒng)程序 條目 A:在適配器getCount()方法里修改 public int getCount() /多了兩個(gè)TextView的item 所以 +1 +1return userInfos.size()+1+systemInfos.size()+1; B:在getView()方法里修改 getView的作用:是控制每個(gè)位置顯示的內(nèi)容 添加用戶程序的T

29、extViewif(position = 0)/創(chuàng)建一個(gè)TextView顯示多少個(gè)用戶程序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;特殊情況處理了,需要處理一般情況了,畫(huà)圖分析 用戶程序顯示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);運(yùn)行拖動(dòng)演示報(bào)錯(cuò),講解報(bào)錯(cuò)的原因刪除應(yīng)用 ,進(jìn)入應(yīng)用管理 ,刪除應(yīng)用 進(jìn)入應(yīng)用管理contverView 重用舊的視圖,如果可能的話。注意:您應(yīng)該檢查,這個(gè)觀點(diǎn)是在使用非空和適當(dāng)?shù)念愋汀H绻遣豢赡軐⑦@個(gè)視圖來(lái)顯示正確的數(shù)據(jù),這種方法可以創(chuàng)建一個(gè)新的視圖。異構(gòu)列表可以指定數(shù)量的視圖類型,以便這一觀點(diǎn)總是正確的類型(見(jiàn)getViewTypeCount()和getItemViewType(int)。5、解決報(bào)錯(cuò)問(wèn)題if(convertVi

32、ew!=null&convertView instanceof RelativeLayout)/.else/.6、回顧處理ListView 中的getCount()和getView()這個(gè)過(guò)程67_ListView的狀態(tài)欄_14 知識(shí)拓展,增加快速滾動(dòng)條 在ListView布局文件加上: android:fastScrollEnabled=true1、 在布局文件添加TextView長(zhǎng)得和getView里面創(chuàng)建的一樣 2. 給ListView設(shè)置滾動(dòng)監(jiān)聽(tīng)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)應(yīng)用tv_status.setText(系統(tǒng)程序(+systemInfos.size()+

34、);else/顯示用戶應(yīng)用tv_status.setText(用戶程序(+userInfos.size()+););68_popupwindow的使用_441、 打開(kāi)2.3模擬器演示聯(lián)系人效果2、 創(chuàng)建一個(gè)新工程專門(mén)學(xué)習(xí)popupwindow一個(gè)彈出窗口,可以用來(lái)顯示一個(gè)任意視圖。彈出窗口是一個(gè)浮動(dòng)的容器,出現(xiàn)在當(dāng)前活動(dòng)的頂端。 在按鈕中添加點(diǎn)擊事件初識(shí)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);左上角對(duì)齊通過(guò)設(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);點(diǎn)擊返回直接退出Activity 對(duì)話框點(diǎn)擊退出是消掉,那么PopupWindow是否也可以呢?PopupWindow window = new PopupWindow(contentView, 200, 100,true);3、 把學(xué)習(xí)好的PopupWindow 移植到工程中 A:監(jiān)聽(tīng)每點(diǎn)一條的事件,并打印日志; Object obj = ll_app_manager.getItemAtPosition(position); System.out.println(obj=+obj); getItemAtPosition(position): 獲取數(shù)據(jù)列表中指定的位置。 B:在適配器中修改如下,運(yùn)行點(diǎn)擊,看日志public Object getItem(int position) return asbllldkk;解決該問(wèn)題:Overridepublic Object getItem(int position) AppInfo info = null

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論