設定service為前台服務很簡單,在api大於5的系統上,只需在onstartcommand()方法中新增如下**即可:
startforeground(id, new notification());
服務銷毀時呼叫:
stopforeground
(boolean removenotification)
其中引數id是通知的標識,notificationmanager可以通過此標識來更新notification。如果沒有仔細的閱讀startforeground(int id, notification notification)方法的注釋,很容易就會為id賦值為0。而注釋中的引數解釋很明確,這個id值一定不能是0.讀者可以去原始碼中自己檢視。
那麼為什麼不能設定為0呢,我們就需要檢視系統原始碼了。
查詢原始碼路徑為
.activitymanagerproxy --> com
.android
.server
.am.acivitymanagerservice --> com
.android
.server
.am.activeservices
public void setserviceforegroundlocked(componentname classname, ibinder token,
int id, notification notification, boolean removenotification)
if (r.foregroundid != id)
notification.flags |= notification.flag_foreground_service;
r.foregroundnoti = notification;
r.isforeground = true;
r.postnotification();
}getservicemap(r.userid).ensurenotstartingbackground(r);
} else
}if (removenotification) }}
} finally
}那麼這個id在什麼時候為0.答案就在service中的停止前台服務的方法中:
public
final
void
stopforeground(boolean removenotification) catch (remoteexception ex)
}
結論:在設定前台服務時,notification的id不能為0.
那為什麼在startforeground時需要指定id,而stopforeground時不需要指定id呢?
安卓程序保活之Service設定為前台服務
一 前台服務和普通服務有啥區別 普通服務使用者是無法感知的,只是在後台默默執行,而且優先順序比較低 前台服務優先順序更高,記憶體吃緊的時候更不容易被 而且狀態列會顯示前台服務 設定前台服務出現通知的時候會有提示音,可通過builder.setsound null,null 設定靜音 二 如何實現 在...
Android8 0 啟動前台Service
1.啟動service if build.version.sdk int build.version codes.o else2.在被啟動service中的oncreate方法呼叫 private void startnotificationforeground notification notif...
前台程序 後台程序 守護程序
後台程序又叫守護程序,你知道嗎?作業系統中,前台程序和後台程序有什麼區別?特徵是什麼?後台程式基本上不和使用者互動,優先級別稍微低一點 前台的程式和使用者互動,需要較高的響應速度,優先級別稍微高一點 直接從後台手工啟動乙個程序用得比較少一些,除非是該程序甚為耗時,且使用者也不急著需要結果的時候。假設...