17. 在ContentProvider中定義的getType()方法是定義URI的內容類型。html
18. SQLiteDatabase類中的insert/delete/update/query方法其實也挺好用的,我在EquipmentProvider類中作了實現java
19. Android專門有個單元測試項目(Android Test Project),在這個項目中,能夠新建一個繼承AndroidTestCase類的具體測試類來單元測試某個功能。我新建了一個AndroidTestProject項目,在其中創建一個測試類專門測試Hello_wangle APP項目發佈的Equipment Content Provider.android
20. 在Android中對於Content Provider中數據變化的監聽,是採用觀察者模式來實現的:web
(1)在一個AA APP中的EquipmentContentProvider中在某個方法中,好比Insert方法中,添加ContentResolver類中的notifyChange方法來通知訂閱者:「this.getContext().getContentResolver().notifyChange(uri, null)」;json
(2)在一個BB APP應用OnCreate方法中,使用ContentResolver類中的registerContentObserver方法來註冊成觀察者,訂閱某個服務:「this.getContentResolver().registerContentObserver(uri, true, new EquipContentObserver(new Handler()));」windows
(3)在一個CC APP應用中,好比AndroidTestProject測試APP中,執行testInsert方法來調用AA APP中的EquipmentContentProvider中的Insert方法時(通知觀察者),此時BB APP中的EquipContentObserver(觀察者)中的onChange方法會被自動執行。數組
21. 在Android系統中,內部的通信錄、短信、圖片等內容都是經過Content Provider對外提供的。它們Content Provider的URI經過文檔或Android源碼來獲取。服務器
22. Content Provider中有個applyBatch方法,用來處理在同一個事務中完成多個ContentProvider中的操做方法(insert/update/delete等)。網絡
23. 經過網絡URL打開HttpURLConnection,以後得到InputStream,讀成byte[]:多線程
若是是圖片的話,使用BitmapFactory轉化爲Bitmap;
若是是網頁的話,轉化成String便可。
24. 滾動視圖ScrollView,當擁有不少內容,屏幕顯示不完,須要經過滾動條來顯示的視圖。
25. 在string.xml文件中定義了某個元素後,在android的代碼上可使用R.string.xxx來表明元素內容;在java代碼上可使用getResources().getString(R.string.xxx)來獲取內容值。
26. web項目中,咱們可使用JSP返回HTML頁面、XML數據和JSON數據:
在JSP頁面裏,使用page命令中的contentType屬性指定返回類型(text/html、text/xml、text/plain),以後使用html格式內容、xml格式內容或者json格式內容(json格式的字符串數據)來填充便可。
例如,返回json的jsp頁面內容:<%@ page language=」java」 contentType=」text/plain; charset=utf-8」 pageEncoding=」UTF-8」 %>${json}//(json格式數據)
返回xml的jsp頁面內容: <%@ page language=」java」 contentType=」text/xml; charset=utf-8」 pageEncoding=」UTF-8」 %><xyz>…${data}…</xyz>//(xml數據)
27. 使用GET或者POST方式提交參數給WEB應用,使用URL原始方式或者HTTPClient第三方jar包來實現。一般只提交參數咱們使用URL原始方式來,若是使用到Cookie或者HTTPS的協議,HttpClient第三方jar包使用起來更方便。
GET方式:參數名值對跟在uri後面,使用總體數據建立URL,發送數據到WEB;
POST方式:uri創建鏈接,使用輸出流發送實體數據(參數名值對拼接字符串)給WEB.
28. 使用網頁上傳文件到WEB項目時,使用IE中的httpwatch插件能夠查看到網頁在上傳文件和輸入數據時提交的數據實體內容,咱們在android中編寫上傳文件程序時,就是拼接此實體數據內容,把他們發送給WEB項目。
對於比較大的文件,咱們可使用屢次outputstream輸出文件中的內容;固然,對於相對比較小的文件,能夠獲得byte數組一次輸出。具體上傳文件的功能能夠參考SocketHttpRequester類。
29. WEB SERVICE就是網絡上的API,咱們在java裏面有WEB SERVICE的第三方框架調用,不會涉及到內部知識。在ANDROID中,咱們發送內容類型爲「soap+xml」 的XML數據給WEB SERVICE服務提供者,實現WEB SERVICE調用;而WEB SERVICE服務提供者也會返回響應XML數據,須要獲取、解析發送的指令是否正確。
30. Android重要原則:
(1)耗時的工做應該在子線程中執行,若是主線程執行耗時的工做,處於工做狀態超過5秒的話,因主線程阻塞而沒法處理用戶的輸入事件,系統會拋出「應用無響應」的錯誤。
(2) UI控件畫面的重繪(更新)是由主線程負責處理的,若是在子線程中更新UI控件的值,更新後的值不會重繪到屏幕上。必定要在主線程中更新UI的值,這樣才能在屏幕上顯示出來。
(3)Handler做用是用於往建立Handler對象的線程所綁定的消息隊列發送消息。sendMesage方法是往消息隊列中發送消息;handleMessage方法是處理消息,消息隊列中有消息時,主線程自動調用handleMessage,須要重寫Handler類,覆蓋Handler類的handleMessage方法。
31. (1)經過HTTP協議實現多線程斷點續傳下載;
(2)經過TCP/IP(socket)實現文件斷點上傳:
http協議不支持斷點上傳。此功能須要客戶端和服務器端自定義協議來完成。客戶端在鏈接時發送文件長度、文件名稱和sourceid(客戶端標識,第一次鏈接時爲空)給服務器,服務器返回sourceid(服務器端定義)和position(文件寫的位置)給客戶端,客戶端從這個位置讀取文件信息,發送給服務器,服務器也會從文件的這個位置開始寫入數據。若是在客戶端上傳一次大文件過程當中斷電,當客戶端使用原先分配的sourceid再次鏈接到服務器時,此是服務器會給客戶端發送上次已經將要上傳文件位置position,客戶端從這個位置開始取文件內容發送給服務器,服務器也會今後文件位置開始寫數據,達到斷點續傳功能。
32. Intent(意圖)用於激活組件,還能夠攜帶數據。
startActivityForResult用於新啓動的Activity在關閉時向老的Activity發送數據。當老的Acitivity調用finish關閉時,會自動執行新Activity的onActivityResult方法。因此在新的Activity中要重構onActivityResult方法
33. 滾動視圖的實現用scrollview,scrollview中能夠加入textview;scrollview中也能夠加入linearlayout,這樣至關於scrollview中能夠加入多個view,從而作到滾動視圖。
34. Activity啓動模式:
(1)standard:默認啓動模式,每次激活「Activity時都會建立Acitivity實例,並放入任務棧中
(2)singleTop:若是在任務的棧頂正好存放該Activity實例,會重用該實例(調用實例的onNewIntent方法),不然會建立新的Activity實例放入棧頂。(注:即便棧中已經存放Activity實例,只要再也不棧頂,就會建立該Activity實例放入棧中)。
(3)singleTask:若是在棧中有Acitivity實例,就重用該實例(調用該實例的onNewIntent方法)。重用時,會讓該實例移到棧頂,所以在其上面的實例會被移出棧。若是棧中不存在該實例,會建立該實例放入棧中。
(4)singleInstance:在一個新棧中建立該Activity實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例存在於某棧中,任何應用再激活該Activity時都會重用該棧中的實例,其效果至關於多個應用程序共享一個應用,無論誰激活該Activity都會進入同一個應用中。
35 在Android中,使用Intent能夠激活Android應用的三種類型的核心組件:活動、服務、廣播接收者。
Intent能夠劃分顯式意圖和隱式意圖。
顯式意圖明確指定了要激活的組件是哪一個組件;
隱式意圖:沒有明確指定組件名的Intent. Android系統會根據隱式Intent中設置的動做(action)、類別(category)、數據(URI和數據類型)來找到最合適的組件來處理這個意圖。
l startActivity(intent)會爲intent增長android.intent.category.DEFAULT類別
l 只要Intent中Action、category(和數據)都出如今組件的intent-filter中,就能與之匹配,不然匹配失敗。
36 Activity的生命週期:
Activity的三種狀態:運行狀態、暫停狀態、中止狀態
Activity完整生命週期:第一次調用onCreate開始,調用onDestroy爲止;
Activity可視生命週期:調用onStart開始,調用onStop爲止;
Activity前臺生命週期:調用onResume開始,調用onPause爲止;
37 解惑:Activity的啓動模式和Activity生命週期
l Activity的4種啓動模式,指的是激活活動的狀況下,程序中可用startActivity(intent)來激活;固然咱們在手機上能夠用手點程序圖標來激活活動;
l 手機上的後退按鍵若是把應用回退到桌面上,那麼會把這個應用的啓動Acitivity殺死(onDestroy方法)。若是在應用裏,從主活動中激活一個子活動,這個子活動的視圖顯示在手機界面上,主活動的狀態從onResume()進入onPause(),可能也可能進入onStop()狀態,若是此時使用回退按鍵回退到主活動的界面,那麼主活動從而又進入onResume(),在此過程當中,主活動只是狀態發生變化,沒有激活主活動過程,固然就是不涉及活動的啓動模式。
38 廣播接收者:
l 廣播接收者用於接收廣播intent。
l 實現廣播接受者,須要擴展BroadcastReceiver類,當接收到廣播intent內容後,會執行此類的onReceiver方法,此方法中的intent參數就是接收到的廣播intent。
l 廣播接收者是一個Android組件,須要在android清單文件(AndroidManifest.xml)中使用<receiver/>元素聲明,在此聲明中,能夠註明廣播接收者要處理的廣播intent內容,也能夠聲明處理intent的優先級別。
l MIUI系統短信攔截功能的正常運行前提是關閉MIUI系統默認的「系統短信優先」選項。2014-5-19
l 系統在接收到短信後,會發送一個有序廣播intent,我在項目中實現了一個短信攔截功能,當攔截到短信intent 後,會把收到的短信內容保存在存儲卡上的message.txt文件中。
l 短信竊聽原理:當系統收到短信時,會發送一個廣播Intent,Intent的action名稱爲android.provider.Telephony.SMS_RECEIVED,該Intent存放了系統接收到的短信內容,咱們使用「pdus」便可從Intent中獲取短信內容。
l 廣播intent的發送是經過調用context.sendBroadcast(),context.sendOrderedBroadcast()來實現的。一般一個廣播intent能夠被訂閱了此intent的多個廣播接收者所接收。
l 廣播分紅兩種:普通廣播和有序廣播。普通廣播是徹底異步的,能夠在同一時刻(邏輯上)被全部廣播者接收到,使用的方法是context.sendBroadcast(),相對於有序廣播傳輸效率高,缺點是接收者不能將結果傳輸給下一個接收者,而且發送終止廣播intent的傳播;有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。優先級別在<intent-fileter>中的android:priority屬性中聲明,數值越大,優先級別越過,取值範圍:-1000~1000.有序廣播的接收者能夠終止廣播intent 的傳播(使用abortBroadcast()方法),廣播intent的廣播一旦終止,後續廣播接收者就沒法接收到廣播。有序廣播的接受者能夠將數據傳遞給下一個接收者(經過setResultData()和getResultData()方法)。
l 系統接收短信,發送的廣播屬於有序廣播。若是想阻止用戶收到短信,能夠調整接收者的優先級別,讓自定義的接收者優先接收到短信廣播,而後關閉短信廣播的傳輸便可實現。
l 電話撥打的廣播Intent在發送時就肯定要撥號的接收者接收,因此攔截功能是使用setResultData(null)來傳遞給撥號器的接收者,檢測爲null後,不會把電話撥出去。小米手機Adroid4.0系統沒有可以攔截外撥電話的功能,應該跟系統有關係,就再也不糾結於此了。2014-5-20
l 在Android系統中,每次廣播消息到來時都會建立BroadcastReceiver實例而且執行onReceiver()方法,onReceiver()方法執行完後,BroadcastReceiver的實例就會被銷燬。當onReceiver()方法在10秒內沒有執行完畢,Android會認爲該程序無響應。因此,若是須要執行耗時的工做,應該經過發送Intent給Service,由Service來完成,這裏不能用子線程來解決。由於BroadcastReceiver的生命週期很短,子線程可能尚未結束BroadcastReceiver就先結束了。
l 除了短信到來廣播Intent,Android還有不少廣播Intent,好比開機啓動、電池電量變化、時間已經改變等廣播Intent。
l 廣播接收者一旦安裝在系統後,就是本身運行的。
39 服務:
l 是一個Android組件,相似於windows的服務,服務通常沒有用戶操做界面,它運行於系統中不容易被用戶發覺,可使用它開發監控之類的程序。
l 服務繼承自Service類,須要在AndroidManifest.xml文件中配置;
l 服務不能本身運行,須要經過context.startService()或者context.bindService()方法啓動服務。使用startService()方法啓動服務,訪問者與服務之間沒有關聯,即便訪問者退出了,服務仍然運行。使用bindService()方法啓動服務,訪問者與服務綁定在了一塊兒,訪問者一旦退出,服務就終止。
l 採用context.startService()方法啓動服務,只能調用context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
l 當service第一次被啓動時會調用onCreate()方法,而後再調用onStartCommand()方法。在該service的生命週期內,若是再次啓動這個service,就會直接調用onStartCommand()方法了,並且啓動的是同一個service對象。
l 服務結束時會調用onDestroy()方法,注意對於服務啓動時新建的子線程,要將其中止。有時在服務A啓動時會啓動另一個服務(好比電話監聽服務),若是在服務A結束時不手動將其結束,那麼另一個服務(由這個服務啓動的服務,好比電話監聽服務)仍然會運行。
l 若是服務和訪問者之間須要方法調用或者傳遞參數,則須要使用bindService()和unbindService()方法啓動關閉服務。
l 採用context.bindService()方法啓動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onBind()方法,這個時候訪問者和服務綁定在一塊兒。若是訪問者與服務進行通訊,那麼,onBind()方法必須放回IBinder對象。若是訪問者但願與正在綁定的服務解除綁定,能夠調用unbindService()方法,調用該方法也會致使系統調用服務的onUnbind()-àonDestroy()方法。若是訪問者退出了,系統也會調用服務的onUnbind()-àonDestroy()方法。
l 訪問者(好比Acitivity一個實例)調用Service中方法的過程原理:
l 使用AIDL(Android Interface Definition Language:接口定義語言)和遠程服務來實現進程通訊(IPC)。
AIDL是一種接口定義語言,用於約束兩個進程間的通信規則,供編譯器生成代碼,實現Android設備上的兩個進程間通訊(IPC).
咱們能夠在一個APP中使用bindService(intent)來激活遠程服務(在另一個APP中),intent能夠只賦值action便可,不要賦值class(在同一個APP中使用的)。
過程原理:
咱們在服務端APP程序裏,使用AIDL定義一個接口A,A定義要實現的方法,Android會自動生成符合java語言規範的接口A代碼,再來定義一個類B來繼承接口A中的Stub類(存根類),實現A中定義的方法,而後經過OnBind方法返回B的實例(存根類裏面已經實現了IBinder接口);
在訪問者APP應用中,首先也會定義一個AIDL接口(把服務端的AIDL接口拷貝便可),Android也會自動生成相關的接口代碼,而後咱們在繼承ServiceConnection類的類方法onServiceConnected中把參數IBinder接口轉換成接口A(要使用接口A中的Stub類方法),這樣應用方法中就可使用A來作方法調用了。
40 服務的生命週期:
l 當採用Context.startService()方法啓動服務,與之相關的生命週期方法:
OnCreate()--àonStart()--àonDestroy()
onCreate()方法只會被調用一次,服務只會建立一次。
onStart()方法可能會被調用屢次,屢次調用startService()方法會被屢次調用。
OnDestroy()方法在服務被終止時調用。
l 當採用Context.bindService()方法啓動服務,與之有關的生命週期方法:
onCreate()--àonBind()--àonUnbind()--àonDestroy()
屢次調用bindService()方法不會致使onBind()方法被屢次調用,在啓動服務時纔會回調該方法;
OnUnbind方法在調用者與服務解除綁定時被調用。