天天看點

Android學習筆記17——Service(3)

建立一個Bound Service

      一個bound Service用于建立一個長連接配接并允許應用程式組 件通過調用bindService方法綁定,一般來說它不運作元件通過調用startService方法來啟動它。

      當我們想要我們應用程式的Activities和其他元件與這個Service互動,或者想要通過内部程序調用來使自己應用程式的一部分功能開放給其他應用程式的時候,我們可以建立一個Bound Service。

      為了建立一個Bound Service,我們必須實作onBind()這個回調方法并且傳回一個IBinder對象,這個對象定義了和這個Service交流的接口。這樣其他應用程式元件就能夠通過調用bindService方法來連接配接這個接口并且開始調用這個Service中的方法。這個Service就是為了服務于這些綁定到它的元件的,是以當這些元件全部與這個Service解除綁定的時候,系統會自動銷毀這個Service,我們不需要自己去停止他們。

      而為了建立一個Bound Service,我們首先應該做的事情是定義一個用戶端怎麼和這個Service互動的接口。在這個Service和用戶端之間的接口必須是一個IBinder的實作,并且必須從你的Service的這個onBind回調方法傳回。一旦用戶端收到了這個IBinder,用戶端就會通過這個接口和這個Service進行互動。

      多個用戶端能夠一次綁定到這個Service。當一個用戶端和這個Service完成互動的時候,它能通過調用unbindService解除綁定,一旦沒有任何用戶端綁定到這個Service的時候,系統将會銷毀這個Service。

發送通知給使用者

      一旦Service運作以後,它能夠通過用Toast Notifications或着Status Bar Notifications來通知使用者事件。

     一個Toast Notification就是一條出現在目前窗體很短一段時間的消息,然後就會消失。而一個狀态欄通知就是一條在狀态欄中擁有圖示的消息體,使用者能夠通過他進行一些操作。

    通常,狀态欄通知是一個最好的技術,當一些背景操作完成的時候,使用者能夠通過它進行一些操作。當使用者通過擴充的視圖來選擇某個通知的時候,這個通知能夠開啟一個Activity。

在前台運作一個Service

     一個前台的Service通常是一個使用者積極去做的事情并且當系統記憶體較低的時候不能被殺死。一個前台的Service必須在狀态欄提供一個通知,這個通知不會消失直到這個Service停止或者從前台移除掉。

     例如,一個播放音樂的Service應該被設定為前台的Service,因為這樣使用者能夠很清楚的知道它的操作,在狀态欄中的通知可能會推測出目前播放的音樂并且允許使用者通過一個Activity來和這個播放器進行互動。

     我們可以通過調用startForeground方法來開啟一個前台的Service。這個方法需要兩個參數:一個整數用來辨別出這個通知,和通知欄的這個Notification。

Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
        System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
        getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);
           

注意:這個ID不能是0.

        為了在前台中移除這個Service,我們可以調傭stopForeground方法。這個方法需要一個boolean參數,用來辨別是否移除這個狀态欄的通知,這個方法不會停止這個Service。然而,如果當一個前台Service正在運作的時候,你停止了這個Service,那麼這個通知也就會被移除。