《Android應用程序開發(fā)》課件-第4章_第1頁
《Android應用程序開發(fā)》課件-第4章_第2頁
《Android應用程序開發(fā)》課件-第4章_第3頁
《Android應用程序開發(fā)》課件-第4章_第4頁
《Android應用程序開發(fā)》課件-第4章_第5頁
已閱讀5頁,還剩78頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章通知、服務與廣播4.1通知(Notification)4.2服務(Service)4.3廣播Broadcast4.4綜合案例4.5實訓本章小結

4.1通知(Notification)

4.1.1簡單通知任務目標在任務欄上方顯示文字通知“你好,這是Android課程”。效果如圖4-1-1和圖4-1-2所示。圖4-1-1運行界面圖圖4-1-2發(fā)送通知圖

實施步驟

步驟1:新建一個Module,命名為Ex4_1_1,其它采用默認設置。

步驟2:修改MainActivity.java。

步驟3:修改布局文件activity_main.xml,設置兩個按鈕。

步驟4:在手機上運行并觀察效果。

案例分析

1.?MainActivity.java清單分析

2.?activity_main.xml清單分析

相關知識

通知(Notification)是一種具有全局效果的通知,可以在系統(tǒng)的通知欄中顯示。

通知的目的是告知用戶App事件。在平時的使用中,通知主要有以下幾個作用:

(1)顯示接收到短消息、及時消息等信息,如QQ、微信、新浪、短信。

(2)顯示客戶端的推送消息,如廣告、優(yōu)惠、版本更新、推薦新聞等。

(3)顯示正在進行的事物,如后臺運行的程序、音樂播放進度、下載進度等。

創(chuàng)建一個簡單的Notification,主要有以下三步:

(1)獲取NotificationManager實例。

(2)實例化NotificationCompat.Builder并設置相關屬性。必要的屬性有三個:小圖標,通過setSmallIcon()方法設置;標題,通過setContentTitle()方法設置;內容,通過setContentText()方法設置。這三個屬性必須設置,如果不設置則在運行時會拋出異常,其它屬性為可選項,可以不設置。

(3)通過builder.build()方法生成Notification對象,并發(fā)送通知。

下面介紹Notification的重要方法。

(1)?setSmallIcon()與setLargeIcon()。

在NotificationCompat.Builder中有設置通知的圖標大小的兩個方法。當setSmallIcon()與setLargeIcon()同時存在時,smallIcon顯示在largeIcon的右下角;當只設置setSmallIcon()時,smallIcon顯示在左側。

(2)設置提醒標志符flags。

可以設置提醒標志符,向通知添加聲音、閃燈和振動效果等達到提醒效果,也可以組合多個屬性。

各標志符的作用如表4-1-1所示。

(3)?setDefaults(intdefaults)。

向通知添加聲音、閃燈和振動效果的最簡單方法是使用默認(defaults)屬性,可以組合使用多個屬性。這是NotificationCompat.Builder中的方法,用于設置在通知到來時,通過什么方式進行提示,其可以設置的默認屬性如表4-1-2所示。

(4)?setVibrate(long[]pattern)。

(5)?.setLights(intledARGB,intledOnMS,intledOffMS)。

在使用這個方法時需要注意:

①只有在設置了標志符Flags為Notification.FLAG_SHOW_LIGHTS的時候,才支持三色燈提醒。

②顏色信息跟設備有關,不是所有的顏色都可以,需要有具體設備支持的顏色。

(6)?.setSound(Urisound)。

設置默認或自定義鈴聲。該方法可以設置消息提醒為默認的鈴聲,也可以設置為自定義的鈴聲。系統(tǒng)自帶的鈴聲效果的Uri位置為:Uri.withAppendedPath(Audio.Media.INTERNAL?_CONTENT_URI,"2"),設置系統(tǒng)默認的鈴聲,可以直接使用

(7)?setOngoing(booleanongoing)。

設置為ture,表示它為一個正在進行的通知。通常用來表示一個后臺任務,用戶正在參與(如播放音樂)或以某種方式正在等待,因此占用設備(如一個文件下載、同步操作、主動網(wǎng)絡連接等)。

(8)?setProgress(intmax,intprogress,booleanindeterminate)。

設置帶進度條通知的方法,可以在下載中使用。進度條通知的屬性與含義見表4-1-3。

4.1.2Notification中啟動Activity

任務目標

設計一個Notification,點擊后啟動另一個Acticity。效果如圖4-1-3所示。圖4-1-3點擊通知后跳轉Activity

實施步驟

步驟1:使用上一個項目Ex4_1_1。

步驟2:修改java文件MainActivity.java。步驟3:添加NewActivity.java。

步驟4:修改布局文件activity_main.xml。

步驟5:添加一個布局文件new_activity.xml。

步驟6:注冊NewActivity,在AndroidManifest.xml中增加如下內容。

步驟7:在手機上運行并觀察效果。

案例分析

1.?MainActivity.java清單分析

2.?NewActivity.java清單分析

3.?activity_main.xml清單分析

4.?new_activity.xml清單分析

5.?AndroidManifest.xml清單分析

App啟動后界面與圖4-1-1一致,點擊“發(fā)送通知”按鈕后發(fā)送Notification,界面與圖4-1-2一致,本項目增加了一個功能,點擊通知會跳轉到一個Activity,跳轉后界面如圖4-1-3所示。

相關知識

要在通知中啟動另一個Activity,需要先使用PendingIntent。

PendingIntent是一種特殊的Intent,主要的區(qū)別在于Intent的執(zhí)行是立刻的,而PendingIntent的執(zhí)行不是立刻的。

PendingIntent對象,使用方法類的靜態(tài)方法如下:

(1)跳轉到一個activity組件,使用方法getActivity(Context,int,Intent,int)。

(2)打開一個廣播組件,使用方法getBroadcast(Context,int,Intent,int)。

(3)打開一個服務組件,使用方法getService(Context,int,Intent,int)。

在Notification中使用PendingIntent分為三步:

4.2服務(Service)

4.2.1Service任務目標練習使用Service,在DDMS的LogCat界面產(chǎn)生LOG信息。

實施步驟

步驟1:新建一個Module,命名為Ex4_2_1,其它默認設置。

步驟2:新建一個繼承自Service的類MyService.java,并重寫父類的onCreate()、onStartCommand()和onDestroy()方法。

步驟3:修改activity_main.xml作為程序的主布局文件,設置兩個按鈕,一個用于啟動Srevice,一個用于停止Service。

步驟4:修改MainActivity.java,作為程序的主Activity,在里面加入啟動Service和停止Service的邏輯。

步驟5:項目中的每一個Service都必須在AndroidManifest.xml中注冊,所以還需要編輯AndroidManifest.xml文件。

步驟6:在手機上運行并觀察效果。

案例分析

1.?MyService.java清單分析

2.?activity_main.xml清單分析

3.?MainActivity.java清單分析

4.?AndroidManifest.xml清單分析

pp運行后的界面如圖4-2-1所示,點擊“啟動服務”按鈕,啟動Service,因為在這之前Service沒有運行,第一次啟動后,會執(zhí)行onCreate()和onStartCommand()兩個方法,該Service會在DDMS的LogCAT界面輸出兩行信息,如圖4-2-2所示。圖4-2-1Service啟動界面圖4-2-2點擊“啟動”按鈕后LogCAT界面

當再次點擊“啟動服務”按鈕,因為此時Service已經(jīng)在運行,則只執(zhí)行onStartCommand(),輸出一行信息,如圖4-2-3所示。圖4-2-3再次點擊“啟動”按鈕后LogCAT界面

只要Service在運行,啟動該Service時就只會執(zhí)行onStartCommand(),onCreate()方法只有在第一次啟動Service時才會執(zhí)行。點擊“停止服務”按鈕后,Service被終止,如圖4-2-4所示。圖4-2-4點擊停止按鈕后LogCAT界面

相關知識

1.?Service簡介

Service的啟動有兩種方式:context.startService()和context.bindService()。它們的區(qū)別如下:

(1)通過context.startService()啟動Service,則訪問者與Service之間沒有關聯(lián),即使訪問者退出了,Service仍然運行。

(2)通過context.bindService()方法啟動Service,則訪問者與Service綁定在了一起,訪問者一旦退出,Service就會終止。

2.?Service啟動流程

1)?context.startService()啟動流程

context.startService()→onCreate()→onStartCommand()→Servicerunning→context.stopService()→onDestroy()→Servicestop

調用startService的生命周期為onCreate→onStart

Command(可多次調用)→onDestroy,如圖4-2-5所示。圖4-2-5Service的生命周期

2)?context.bindService()啟動流程

context.bindService()→onCreate()→onBind()→Servicerunning→onUnbind()→onDestroy()→Servicestop

3.?Service方法介紹

1)?onBind()方法

當另一個組件想通過調用bindService()與服務綁定(例如執(zhí)行RPC)時,系統(tǒng)將調用此方法。

2)?onCreate()方法

首次創(chuàng)建服務時,系統(tǒng)將調用此方法來執(zhí)行一次性設置程序(在調用onStartCommand()或onBind()之前)。

3)?onStartCommand()方法

當另一個組件(如Activity)通過調用startService()請求啟動服務時,系統(tǒng)將調用此方法。

onStartCommand(Intentintent、intflags、intstartId)方法有3個傳入?yún)?shù),它們的含義如下:

4)?onDestroy()

當服務不再使用且將被銷毀時,系統(tǒng)將調用此方法。服務應該實現(xiàn)此方法來清理所有資源,如線程、注冊的偵聽器、接收器等,這是服務接收的最后一個調用。

4.2.2bindService

任務目標

練習使用bindService,在DDMS的LogCat界面產(chǎn)生LOG信息,說明綁定Service時會執(zhí)行哪些方法,解綁Service時會執(zhí)行哪些方法。

實施步驟

步驟1:新建一個Module,命名為Ex4_2_2,其它設置默認。

步驟2:新建一個類LocalService.java。步驟3:修改MainActivity.java。

步驟4:如下清單activity_main.xml是布局文件,設置了三個按鈕。

步驟5:在AndroidManifest.xml中注冊Service,增加如下內容。

實施步驟

步驟1:新建一個Module,命名為Ex4_2_2,其它設置默認。

步驟2:新建一個類LocalService.java。

步驟3:修改MainActivity.java。

步驟4:如下清單activity_main.xml是布局文件,設置了三個按鈕。

步驟5:在AndroidManifest.xml中注冊Service,增加如下內容。

運行界面如圖4-2-6所示。圖4-2-6運行界面

點擊“綁定服務器”按鈕,執(zhí)行綁定服務器功能,如圖4-2-7所示。當?shù)谝淮吸c擊綁定服務時,LocalService服務端的onCreate()、onBind方法會依次被調用,此時客戶端的ServiceConnection的onServiceConnected()被調用并返回LocalBinder對象,接著調用LocalBinder的getService方法返回LocalService實例對象,此時客戶端便持有LocalService的實例對象,可以任意調用LocalService類中的聲明公共方法。圖4-2-7點擊綁定服務器

綁定服務器后,多次點擊“綁定服務器”按鈕進行多次綁定,如圖4-2-8所示。圖4-2-8多次點擊綁定服務器

再點擊獲取服務端的數(shù)據(jù),點擊了3次,通過getRandomNumber()獲取了服務端的3個不同數(shù)據(jù),如圖4-2-9所示。圖4-2-9點擊獲取數(shù)據(jù)

最后點擊解除綁定,如圖4-2-10所示,此時LocalService的onUnBind、onDestroy方法依次被回調,并且多次綁定只需一次解綁即可。這說明綁定狀態(tài)下的Service生命周期方法的調用依次為onCreate()、onBind、onUnBind、onDestroy。圖4-2-10點擊解除綁定

相關知識

bindService使用開發(fā)步驟如下:

(1)創(chuàng)建bindService服務端,繼承自Service并在類中,創(chuàng)建一個實現(xiàn)IBinder接口的實例對象并提供公共方法給客戶端調用。

(2)從onBind()回調方法返回此Binder實例。

(3)在客戶端中,從onServiceConnected()回調方法接收Binder,并使用提供的方法調用綁定服務。

在客戶端中創(chuàng)建了一個ServiceConnection對象conn,代表與服務的連接,它只有兩個方法,分別是onServiceConnected方法和onServiceDisconnected方法。這兩個方法講解如下:

(1)?onServiceConnected(ComponentNamename,IBinderservice),系統(tǒng)會調用該方法以傳遞服務的onBind()方法返回的IBinder。

(2)?onServiceDisconnected(ComponentNamename),Android系統(tǒng)會在與服務的連接意外中斷時(例如當服務崩潰或被終止時)調用該方法。

(3)?bindService(Intentservice,ServiceConnectionconn,intflags),該方法執(zhí)行綁定服務操作,其中Intent是要綁定的服務(也就是LocalService)的意圖,而ServiceConnection代表與服務的連接,它只有兩個方法,前面已分析過,flags則是指定綁定時是否自動創(chuàng)建Service,0代表不自動創(chuàng)建,BIND_AUTO_CREATE則代表自動創(chuàng)建。

(4)?unbindService(ServiceConnectionconn),該方法執(zhí)行解除綁定的操作,其中ServiceConnection代表與服務的連接。

4.2.3IntentService

任務目標

練習使用IntentService,在DDMS的LogCat界面產(chǎn)生LOG信息,演示IntentService啟動后執(zhí)行的動作。

實施步驟

步驟1:新建一個Module,命名為Ex4_2_3,其它默認設置。

步驟2:新建一個Service,如下的intentServiceTest.java所示,實現(xiàn)了一個繼承了IntentService的類intentServiceTest.java,并在各個方法中插入LOG語句,顯示調試信息。

步驟3:修改MainActivity.java,啟動intentServiceTest類。

步驟4:修改布局文件activity_main.xml,實現(xiàn)一個按鈕并設定了點擊動作執(zhí)行的方法。

步驟5:在AndroidManifest.xml中注冊IntentService,增加如下語句。

步驟6:在手機上運行并觀察效果。

案例分析

1.?intentServiceTest.java清單分析

2.?MainActivity.java清單分析

MainActivity.java是主類。

行16~32:實現(xiàn)按鈕點擊動作,如圖4-2-11所示。圖4-2-11啟動界面

程序運行如圖4-2-12所示。從結果可以看到,onCreate方法只執(zhí)行了一次,而onStartCommand和onStart方法執(zhí)行了兩次,開啟了兩個WorkThread,這就證實了之前所說的啟動多次但IntentService的實例只有一個的說法,這跟傳統(tǒng)的Service是一樣的。Operation1也是先于Operation2打印,并且兩個操作間停頓了2s,最后是onDestroy銷毀了IntentService。圖4-2-12輸出信息

相關知識

在Android中,應用的響應性被活動管理器(ActivityManager)和窗口管理器(WindowManager)這兩個系統(tǒng)服務所監(jiān)視。當用戶觸發(fā)了輸入事件后(如鍵盤輸入,點擊按鈕等),如果應用5秒內沒有響應,那么,Android會認為該應用無響應,便會彈出(ApplicationNoResponse)無響應異常對話框。

IntentService可以看作Service和HandlerThread的結合體,在完成使命之后會自動停止,適合需要在工作線程處理與UI無關任務的場景。IntentService有如下特點:

(1)?IntentService是繼承自Service并處理異步請求的一個類,在IntentService內有一個工作線程來處理耗時操作。

(2)當任務執(zhí)行完后,IntentService會自動停止,不需要去手動結束。

(3)如果多次啟動IntentService,那么每一個耗時操作會以工作隊列的方式在IntentService的onHandleIntent回調方法中執(zhí)行,每次只會執(zhí)行一個工作線程,執(zhí)行完第一個再執(zhí)行第二個,以此類推,直到執(zhí)行自動結束。

(4)所有請求都在一個單線程中,不會阻塞應用程序的主線程(UIThread),同一時間只處理一個請求。

只重寫onHandleIntent()方法后LOG信息,從圖4-2-13展示出的信息中可以看到,兩個操作Operation1和Operation2均得到了執(zhí)行。圖4-2-13只實現(xiàn)onHandleIntent()方法后輸出結果

4.3廣播Broadcast

任務目標Service在后臺計數(shù),利用廣播Broadcast把計數(shù)值傳遞給主界面,在主界面中顯示出計數(shù)值。界面如圖4-3-1所示。圖4-3-1啟動界面

實施步驟

步驟1:新建一個Module,命名為ex4_3_1,其它默認設置。

步驟2:新建一個接口文件ICounterService.java。步驟3:新建一個Service文件CounterService.java,用于實現(xiàn)后臺計數(shù)。

步驟3:修改文件MainActivity.java。

步驟4:修改布局文件activity_main.xml。

步驟5:新建變量文件string.xml。

步驟6:修改文件AndroidManifest.xml,注冊Service。

步驟7:在手機上運行并觀察效果。

案例分析

1.?ICounterService.java清單分析

2.?CounterService.java清單分析

3.?MainActivity.java清單分析

4.?activity_main.xml清單分析

5.?string.xml清單分析

6.?AndroidManifest.xml清單分析

程序運行后的界面如圖4-3-1所示,有兩個按鈕:一個用于啟動計數(shù),另一個用于停止計數(shù)。此外,還有一個計數(shù)值。

啟動后,通過圖4-3-2的LogCat信息可以看到,創(chuàng)建了計數(shù)服務器,然后連接到服務器上。圖4-3-2啟動后LogCat信息

單擊“開始計數(shù)”啟動計數(shù)程序,獲得返回的計數(shù)值,如圖4-3-3所示。圖4-3-3運行界面

運行時的LogCat信息如圖4-3-4所示,COUNTER的數(shù)值在不斷變化,LogCat也在不斷地輸出提示信息。圖4-3-4運行中的LogCat信息

點擊“停止計數(shù)”按鈕停止計數(shù)后,計數(shù)值保持不變,如圖4-3-5所示。圖4-3-5停止界面

停止計數(shù)后,LogCat輸出的信息如圖4-3-6所示。從圖中可以看到,停止計數(shù)后Service依然發(fā)送了一個計數(shù)值,并被客戶端接收到了。圖4-3-6停止后LogCat信息

若退出App,LogCat輸出的信息如圖4-3-7所示,從圖中可以看到,當App退出后,Service也被銷毀了。圖4-3-7退出后LogCat信息

相關知識

Broadcast是Android四大組件之一,也是一種廣泛運用在應用程序之間傳輸信息的機制,Android發(fā)送的廣播內容是一個Intent,這個Intent中可以攜帶要發(fā)送的數(shù)據(jù)。

廣播作為Android組件間的通信方式,可以使用的場景如下:

(1)同一App內有多個進程的不同組件之間的消息通信。

(2)不同App組件之間消息的通信。

廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發(fā)送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現(xiàn)的。通常一個廣播的Intent可以被訂閱了此Intent的多個廣播接收者所接收。要實現(xiàn)一個廣播接收者的方法有以下兩步。

第一步:定義廣播接收者,繼承BroadcastReceiver,并重寫onReceive()方法。

第二步:訂閱感興趣的廣播Intent。訂閱方法有兩種:

(1)使用代碼進行訂閱(動態(tài)訂閱)。

(2)在AndroidManifest.xml文件中的<application>節(jié)點里進行訂閱(靜態(tài)訂閱)。

使用廣播有以下兩個步驟。

第一步:廣播的接收者需要通過調用registerReceiver函數(shù)告訴系統(tǒng),它對什么樣的廣播有興趣,即指定IntentFilter,并且向系統(tǒng)注冊廣播接收器,即指定BroadcastReceiver。

第二步:廣播的發(fā)送者通過調用sendBroadcast函數(shù)來發(fā)送一個指定的廣播,并且可以指定廣播的相關參數(shù)。

4.4綜合案例

任務目標設計一個帶進度條的Notification,利用DownloadService下載,然后在Notification中顯示下載進度

實施步驟

步驟

溫馨提示

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

評論

0/150

提交評論