爲何android.util.log會提供五種不一樣級別的打印輸出方式?(打印輸出在Logcat窗口)好比:Log.v()用於打印比較瑣碎的信息;Log.d()用於打印調試信息;Log.i()用於打印比較重要的數據信息;Log.w()用於打印一些警告信息,提示程序可能存在的潛在風險;Log.e()打印程序中錯誤信息。-->我的理解:可在應用程序中的任何地方使用以上五種不一樣的Log輸出方式,可是建議「有目的和區分度」地使用,只有這樣纔可以方便使用其過濾功能,並可以分析程序的執行路徑(在不一樣的路徑使用不用的級別輸出Log)。android
Android應用程序的AndroidManifest.xml文件,在註冊activity時,使用的label標籤指定活動(Activity)中標題欄內容。標題欄是顯示在活動最頂的;此外,給主活動指定的label不只會成爲標題欄中的內容,還會成爲啓動器Launcher中應用顯示的名稱。sql
活動Activity部分,總結:四種狀態(針對於Activity存在於任務棧中的狀態:運行狀態、暫停狀態、中止狀態和銷燬狀態)、三種生存期(針對於生命週期而言:完整生存期、可見生存期和前臺生存期)和七個回調方法(onCreate() onStart() onResume() onPause() onStop() onDestory() onRestart()),以及四種啓動模式(Standard-->SingleTop-->SingleTask-->SingleInstance)。數據庫
多個Activity之間傳遞值時,使用包名做爲前綴(確保惟一性),例如: public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";安全
不要BroadcastReceiver的onReceive()中執行過多的邏輯或者進行任何的耗時操做,由於廣播接受者中是不容許開啓線程的,當onReceive()運行了較長時間而沒有結束時,程序就會報錯。廣播接受者更多的是扮演一種打開程序其餘組件的角色,好比建立一條狀態欄通知,或者啓動一個服務等。app
廣播是一種跨進程的通訊方式(應用程序可以接受系統廣播)。異步
正是因爲廣播機制是一種跨進程的通訊方式,頗有可能會致使程序的不安全性。爲了解決廣播的安全性問題,Android引入了一套本地廣播機制,使用這個機制發出的廣播只可以字應用程序內部進行傳遞,而且廣播接受者也只能接收來自本應用程序發出的廣播,這樣全部的安全性問題就都不存在了。ide
使用本地廣播的幾點優點:工具
1. 明確地知道正在發送的廣播不會離開咱們的程序,不須要擔憂機密數據泄露;oop
2. 其餘程序沒法將廣播發送到咱們的程序內部,不須要擔憂會有安全漏洞的隱患;單元測試
3. 發送本地廣播比起發送系統全局廣播會帶來更高效率。
Android系統提供三種方式用於簡單地實現數據持久化功能,即:文件存儲、SharedPreference存儲以及數據庫存儲。除了這三種方式以外,還能夠將數據保存到手機的SD卡上,不過使用前三種方式相對簡單,且比起存儲到SD卡中會更加安全。
文件存儲方式:不對存儲的內容進行任何的格式化處理,全部數據都是原封不動地保存到文件當中的,比較適合用於存儲一些簡單的文本信息或二進制數據。若是想使用文件存儲的方式來保存一些複雜的文本數據,就須要定義一套本身的格式規範,方便之後將數據從文件中從新解析出來。
Context類提供openFileOutput()用於將數據存儲到指定的文件中,全部文件默認保存到/data/data/<packagename>/files/目錄下。
文件存儲方式不適合用於保存一些較爲複雜的文本數據。
三種方式獲得SharedPreferences實例:
1. Context類中的getSharedPreferences()
方法接收兩個參數,前者爲SharedPreferences文件名,後者爲操做模式。SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/目錄下的。MODE_PRIVATE模式表示只有當前應用程序才能夠對這個文件進行讀寫操做;MODE_MULTI_PROCESS模式(This constant was deprecated in API level 23.)通常用於會在多個進程中對同一個SharedPreferences文件讀寫。MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE兩種模式:This constant was deprecated in API level 17. 官方已經再也不推薦使用這種方式實現進程間的數據共享。而推薦使用更加安全可靠的內容提供器技術。
2. Activity類中的getPreferences()
使用這個方法時,會自動將當前的類名做爲SharedPreferences文件名。
3. PreferenceManager類中的getDefaultSharedPreferences()
是一個靜態方法,自動使用當前應用程序的包名做爲前座來命名SharedPreferences文件。
SharedPreferences文件是使用XML的格式來對數據進行管理的。
SQLite數據庫文件會存放到/data/data/<packagename>/databases/目錄下。使用數據庫存儲數據,通常包含兩個部分:數據庫,以及存儲在數據庫中的表——table。
若是想要使用adb工具,須要將adb tool所在的路徑配置到系統環境變量中;若是須要操做數據庫,首先進入到數據庫所在的目錄,而後輸入:sqlite3 database_name。
數據庫操做支持事務處理,也就是讓事務支持的業務邏輯執行完畢時才產生想要的效過,若中途崩潰,則退回到啓動事務的起點。
ContentProvider內容提供者能夠選擇只對哪個部分數據進行共享,從而保證隱私數據的安全性。
內容提供者通常有兩種使用方式:一是使用現有的內容提供者來讀取和操做相應程序的數據;二是建立本身的內容提供者給咱們程序中的數據提供外部訪問接口。
Service:Android的後臺運行功能,也就是說,應用程序即便在關閉的狀況下仍然能夠再後臺繼續運行;IOS是不支持後臺的,當應用程序不在前臺運行時就會進入到掛起狀態。服務Service是Android中實現後臺運行的解決方案,適合去執行那些不須要和用戶交互並且還要求長期運行的任務。服務的運行不依賴於任何用戶界面,即便當程序被切換到後臺,或者用戶打開了另外一個應用程序,服務仍然能保持正常運行。
須要注意的是,服務並非運行在一個獨立地應用程序中的,而是依賴於建立服務時所在的應用程序進程。當某個應用程序進程被殺掉時,全部依賴於該進程的服務也會中止運行。
實際上服務並不會自動開啓線程,全部代碼都是默認運行在主線程中的。也就是說,咱們須要在服務內部手動建立子線程,並在這裏執行具體的任務,不然就有可能出現主線程被阻塞的的狀況。
Android的UI是線程不安全的。若是想要更新應用程序裏的UI元素,則必須在主線程中進行,不然就會出現異常。若是確實須要在子線程執行耗時任務,而後根據任務的執行結果來更新相應的UI控件,該如何處理?
Android中的異步和同步機制:Synchronous同步和Asynchronous異步的概念最初來自通訊領域。通訊同步指客戶端在發出請求後,必需要在服務端有迴應後客戶端才繼續發送其餘請求,全部的請求都會在服務端獲得同步,直到服務端發返回請求;通訊異步指客戶端在發送請求後,沒必要等待服務端的迴應就能夠發送下一個請求,對全部的請求動做來講將會在服務端獲得異步,這條請求的鏈路就像是一個請求隊列,全部的請求動做在這裏都不會獲得同步。
異步消息處理機制解決子線程中進行UI操做的問題。Android中的異步消息處理主要有四個部分組成,Message(用於在不一樣線程之間交換數據,是在線程之間傳遞的消息)、Handler(主要用於發送和處理消息的)、MessageQueue(用於存放全部經過Handler發送的消息,每一個線程都會有一個MessageQueue)和Looper(是每一個線程中的MessageQueue的管家,每一個線程只會有一個Looper對象)。
另外一個工具:AsyncTask,背後的實現原理也是基於異步消息處理機制,只是Android進行了封裝。
中止Service的方式:在Activity中決定服務什麼時候啓動和中止,startService()和stopService()用於服務的啓動和中止。此外,在服務中調用本身的stopSelf()能夠實現服務的中止。
活動和服務的通訊:在活動中指揮服務去幹什麼,服務就去幹什麼;經過bindService()實現活動和服務的交互。
服務中的代碼默認運行在主線程中,若是直接在服務裏去處理一些耗時的邏輯,就很容易出現ANR。所以,須要在服務中建立子線程,而後在這裏去處理那些耗時的邏輯。通常是在onStartCommand()中建立並開啓子線程,並在其中調用stopSelf()中止服務。
Android專門提供了IntentService(),用於解決上述的兩個步驟。複寫onHandleIntent(),並在其中執行耗時操做,由於這個方法中的內容會在子線程中執行,而沒必要擔憂ANR的問題。在執行完上述方法後,會自動結束去執行onDestory()。上述IntentService實例集開啓線程和自動中止於一身。
實踐P376 中的定時任務。
使用Intent實例傳遞自定義對象,必要條件:自定義類必須實現Serializable或者Parcelable接口。不一樣之處在於:前者是將對象進行序列化,後者則將一個完整的對象進行分解,而分解後的每一部分都是Intent所支持的數據類型。雖而後者在實現上會顯得複雜,但效率會更好,因此推薦使用後者。
編寫測試用例,建立測試工程,進行單元測試,實踐P468的單元測試功能。