天天看點

《第一行代碼》讀書筆記(第七章,第八章,第九章)

第7章 跨程式共享資料 探究内容提供器 

7.2 通路其他程式中的資料  7.2.1 ContentResolver的基本用法  ContentResolver中的增删改查方法都是不接受表名參數的,而是使用一個Uri參數代替,這個參數被稱為内容Uri。内容Uri給内容提供器中的資料建立了唯一辨別符,它主要由兩部分組成,權限(authority)和路徑(path)。 權限是用來對不同的程式做區分的。路徑則是用于對同一應用程式中不同的表做區分的。

第8章 豐富你的程式,運用手機多媒體  8.1 通知  1、首先需要一個NotificationManager來對通知進行管理  2、建立一個Notification對象,這個對象用于存儲通知所需的各種資訊,我們可以使用它的有參構造函數來進行建立。Notification的有參構造函數接受三個參數,第一個參數用于指定通知的圖示,第二個參數用于指定通知的ticker内容,第三個參數用于指定通知被建立的時間,以毫秒為機關。 3、建立好Notification對象後,我們還需要對通知的布局進行設定,隻需要調用Notification的setLatestEventInfo()方法就可以給通知設定一個标準的布局。這個方法接受四個參數, 第一個參數是Context, 第二參數用于指定通知的标題内容,下拉系統狀态欄可以看到這部分内容, 第三個參數用于指定通知的正文内容,同樣下拉系統狀态欄可以看到這部分内容 第四個參數暫時用不到可以傳入null 4、調用NotificationManger的Notify()方法就可以讓通知顯示出來。notify有兩個參數,第一個參數是id,第二個參數是Notification對象。要保證為每個通知所指定的id都是不同的。第二參數則是Notification對象。

Pendingintent 從名字上看起來和Intent有些類似,它們之間也确實存在着不少共同點。比如它們都可以指明某一個意圖,都可以用于啟動活動,啟動服務以及發送廣播等。不同的是,Intent更加傾向于立即執行某個動作,而PendingIntent更加傾向于在某個合适的時機去執行某個動作。是以,也可以把PendingIntent簡單地了解為延遲執行的Intent。

PendingIntent主要提供了幾個靜态方法用于擷取PendingIntent的執行個體,可以根據需求來選擇是使用getactivity()方法,getBroadcast()方法,getService()方法。接受的參數是 1、context  2、一般用不到傳入0 3、傳入Intent對象 4、用于确定PendingIntent行為。四種值可選。

它可以在通知發出的時候播放一段音頻,這樣就能夠更好地告知使用者有通知到來。 我們還可以在通知到來的時候讓手機進行振動,使用的是vibrate這個屬性。它是一個長整型的數組,用于設定手機靜止和振動的時長,以毫秒為機關。下标為0的值表示手機靜止的時長,下标為1的值表示手機振動的時長,下标為2的值又表示手機靜止的時長。以此類推。

第9章 背景默默的勞動者,探究服務  9.1服務是什麼? 服務是Android中實作程式背景運作的解決方案,它非常适合用于去執行那些不需要和使用者互動而且還要求長期運作的任務。服務的運作不依賴于任何使用者界面,即使當程式被切換到背景。服務的運作不依賴于任何使用者界面,即使當程式被切換到背景,或者使用者打開了另外一個應用程式,服務仍然能夠保持正常運作。 不過需要注意的是,服務并不是運作在一個獨立的程序當衆,而是依賴于建立服務時所在的應用程式程序。當某個應用程式程序被殺掉時,所有依賴于該程序的服務也會停止運作。

9.2 Android 多線程 Android不允許在子線程中進行UI操作。

9.2.3解析異步消息處理機制  Android中的異步消息處理主要由四個部分組成,Message、Handler ,MessageQueue和Looper。 1、Message Message是線上程之間傳遞的消息,它可以在内部攜帶少量的消息,用于在不同線程之間交換資料。使用Message的what字段,除此之外還可以使用arg1和arg2,使用obj字段攜帶一個Object對象。 2、Handler Handler顧名思義也就是處理者的意思,它主要是用于發送和處理消息的,發送消息一般是使用Handler的sendMessage()方法,而發出的消息經過一系列輾轉處理後,最終會傳遞到handler的handleMessage()方法中。 3、MessageQueue MessageQueue是消息隊列的意思,它主要用于存放所有通過Handler發送的消息。這部分消息會一直存在于消息隊列中,等待被處理。每個線程中隻會有一個MessageQueue對象。 4、Looper Looper是每個線程中的MessageQueue的管家,調用Looper的loop()方法後,就會進入到一個無限循環當中,然後每當發現MessageQueue中存在一個消息,就會将它取出,并傳遞到Handler的handlemessage()方法。 (1)首先需要在主線程當中建立一個Handler對象,并重寫handleMessage()方法 (2)然後當子線程中需要進行UI操作時,就建立一個Message對象,并通過Handler對象将這條消息發送出去。 (3)之後這條消息會被添加到Messagequeue的隊列中等待被處理,而Looper則會一直嘗試從MessageQueue中取出待處理消息。 (4)最後分發回Handler的handleMessgae()方法。 

9.2.4 使用AsyncTask AsyncTask是一個抽象類,是以如果我們想使用它,就必須要建立一個子類去繼承它。在繼承時,我們可以為AsyncTask類指定三個泛型參數,這三個參數的用途如下: 1、Params  在執行AsyncTask時需要傳入的參數,可用于在背景任務中使用。 2、Progress 背景任務執行時,如果需要在界面上顯示目前的進度,則使用這裡指定的泛型作為進度機關。 3、Result 當任務執行完畢後,如果需要對結果進行傳回,則使用這裡指定的泛型作為傳回值類型。

例: class DownloadTask extend AsyncTask<Void ,Integer,Boolean>{} 第一個參數void,在執行AsyncTask不需要傳入參數給背景任務 第二個參數Integer,使用整型資料來作為進度顯示機關  第三個參數Boolean,使用布爾型資料來回報執行結果

1、onPreExecute() 這個方法會在背景任務開始執行之前調用。用于一些界面上的初始化操作 2、doInbackground(Params。。) 這個方法中的所有代碼都會在子線程中運作,我們應該在這裡去處理所有的耗時任務。回報目前任務的執行進度,可以調用PublishgProgress(Progress...)方法來完成。 3、onProgressUpdate(Progress...) 當在背景任務中調用了publishProgress(Progress。。)方法後,這個方法就會很快被調用。 4、onPostExecute(Result) 當背景任務執行完畢并通過return語句進行傳回時,這個方法很快會被調用。傳回的的資料進行一些UI操作。

9.3 服務的基本用法  9.3.1 定義一個服務 

一旦在項目的任何位置調用了Context的startService()方法,相應的服務就會啟動起來,并回調onStartCommand()方法。如果這個服務之前還沒有建立過,onCreate會先于onStartCommand()方法執行。服務啟動了之後會一直保持運作狀态,直到stopService或stopSelf()方法執行。每個服務隻會存在一個執行個體。

還可以調用Context的bindService()來擷取一個服務的持久連接配接,這時就會回調服務中的onBinde()方法。類似地,如果這個服務之前還沒有建立過,onCreate()方法會先于onBind()方法執行。

9.5.1 使用前台服務  這種服務一旦啟動之後,就會一直處于運作狀态,必須調用stopService()或者stopSelf()方法才能讓服務停止下來。 Android專門提供了一個IntentService類。這個類很好地剞劂了前面所提到的兩種尴尬。

Android中的定時任務一般有兩種實作方式,一種是使用java API裡提供的Timer類,一種是使用Android 的Alarm機制。這種方式在多數情況下都能實作類似的效果,但Timer有一個明顯的短闆,它并不太适用于那些需要長期在背景運作的定時任務。 Alarm機制則不存在這種情況,它具有喚醒CPU的功能,即可以保證每次需要執行定時任務的時候,CPU都能正常工作。

用于指定指定AlarmManager的工作類型,有四種值可選,分别是 ELapsed-Realtime:讓定時任務從開系統開機開始算起 ELapsed_realtime_wakeup::讓定時任務從開系統開機開始算起 ,但會喚醒CPU  RTC :讓定時任務的觸發事件從1970年1月1日0點開始算起 RTC_WAKEUP:讓定時任務的觸發事件從1970年1月1日0點開始算起,但會喚醒CPU 

繼續閱讀