關於設定前台Service程序的誤區

2021-08-01 13:10:30 字數 1431 閱讀 7135

設定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...

前台程序 後台程序 守護程序

後台程序又叫守護程序,你知道嗎?作業系統中,前台程序和後台程序有什麼區別?特徵是什麼?後台程式基本上不和使用者互動,優先級別稍微低一點 前台的程式和使用者互動,需要較高的響應速度,優先級別稍微高一點 直接從後台手工啟動乙個程序用得比較少一些,除非是該程序甚為耗時,且使用者也不急著需要結果的時候。假設...