9.5.1 使用前台服務
服務幾乎都是在后台運行的,一直以來它都是默默地做着辛苦的工作。但是服務的系統 優先級還是比較低的,當系統出現內存不足的情況時,就有可能會回收掉正在后台運行的服 務。如果你希望服務可以一直保持運行狀態,而不會由於系統內存不足的原因導致被回收, 就可以考慮使用前台服務。前台服務和普通服務最大的區別就在於,它會一直有一個正在運 行的圖標在系統的狀態欄顯示,下拉狀態欄后可以看到更加詳細的信息,非常類似於通知的 效果。當然有時候你也可能不僅僅是為了防止服務被回收掉才使用前台服務的,有些項目由於特殊的需求會要求必須使用前台服務,比如說墨跡天氣,它的服務在后台更新天氣數據的同時,還會在系統狀態欄一直顯示當前的天氣信息,如圖 9.11 所示。
圖 9.11
那么我們就來看一下如何才能創建一個前台服務吧,其實並不復雜,修改 MyService 中 的代碼,如下所示:
public class MyService extends Service {
……
@Override
public void onCreate() {
super.onCreate();
Notification notification = new Notification(R.drawable.ic_launcher, "Notification comes", System. currentTimeMillis());
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, "This is title", "This is content", pendingIntent);
startForeground(1, notification);
Log.d("MyService", "onCreate executed");
}
……
}
可以看到,這里只是修改了 onCreate()方法中的代碼,相信這部分的代碼你會非常眼熟。 沒錯!這就是我們在上一章中學習的創建通知的方法。只不過這次在構建出 Notification 對 象后並沒有使用 NotificationManager 來將通知顯示出來,而是調用了 startForeground()方法。 這個方法接收兩個參數,第一個參數是通知的 id,類似於 notify()方法的第一個參數,第二 個參數則是構建出的 Notification 對象。調用 startForeground()方法后就會讓 MyService 變成 一個前台服務,並在系統狀態欄顯示出來。
現在重新運行一下程序,並點擊 Start Service 或 Bind Service 按鈕,MyService 就會以前 台服務的模式啟動了,並且在系統狀態欄會顯示一個通知圖標,下拉狀態欄后可以看到該通 知的詳細內容,如圖 9.12 所示。
圖 9.12