android 後台應用程序在「當前執行的程序」中

2021-09-01 20:28:07 字數 2008 閱讀 7928

[b]問題[/b]

最近工作用用到了非同步service的非同步程序間通訊,這裡不講這個,要講的是,開發過程中,有個需求是讓我們的apk一直執行在設定->應用程式管理->當前執行的程序中而不是快取程序中。以前沒注意過走一些彎路。[color=red]遇到的問題是以startservice方式啟動service當程式後台執行時,檢視程式狀態程式處於當前執行狀態。當已bindservice方式啟動service程式進入後台執行時,檢視程式狀態處於快取程序中。[/color]

[b]基礎知識[/b]

1:service的生命週期方法

oncreate, onstart, ondestroy

[b]2:service啟動方式[/b]

startservice 和 bindservice

service會經歷 oncreate --> onstart,stopservice的時候直接ondestroy,如果是 呼叫者 直接退出而沒有呼叫stopservice的話,[color=red]service會一直在後台執行。即呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。[/color]下次呼叫者再起來仍然可以stopservice

bindservice只會執行oncreate, 這個時候[color=red] 呼叫者和service繫結在一起,呼叫者退出了,srevice就會呼叫onunbind-->ondestroyed所謂繫結在一起就共存亡了[/color]。

[b]3:注意[/b]

[color=blue]service的oncreate的方法只會被呼叫一次,[/color]

就是你無論多少次的startservice又 bindservice,service只被建立一次。

[color=blue]如果先是bind了[/color],那麼start的時候就直接執行service的onstart方法,

[color=blue]如果先是start,[/color]那麼bind的時候就直接執行onbind方法。如果你先bind上了,就stop不掉了,只能先unbindservice, 再stopservice,所以是先start還是先bind行為是有區別的。

如果打算採用context.startservice()方法啟動服務,在服務未被建立時,系統會先呼叫服務的oncreate()方法,

接著呼叫onstart()方法。如果呼叫startservice()方法前服務已經被建立,多次呼叫startservice()方法並不會導致多次建立服務,

但會導致多次呼叫onstart()方法。採用startservice()方法啟動的服務,只能呼叫context.stopservice()方法結束服務,服務結束時會呼叫ondestroy()方法。

如果打算採用context.bindservice()方法啟動服務,在服務未被建立時,系統會先呼叫服務的oncreate()方法,

接著呼叫onbind()方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先呼叫服務的onunbind()方法,

接著呼叫ondestroy()方法。如果呼叫bindservice()方法前服務已經被繫結,

多次呼叫bindservice()方法並不會導致多次建立服務及繫結(也就是說oncreate()和onbind()方法並不會被多次呼叫)。

如果呼叫者希望與正在繫結的服務解除繫結,可以呼叫unbindservice()方法,呼叫該方法也會導致系統呼叫服務的onunbind()-->ondestroy()方法.

[b]解決方案[/b]

注意紅字部分,相信大家應該明白了吧,startservice方式啟動的service與啟動它的應用無關聯,所以當應用進入到後台時service仍然在執行,所以該程式的程序在「當前執行」欄中,而bindservice啟動的service是應用繫結的同生共死,即應用退出了服務也就退出了,所以當應用執行緒會在「快取程序」中。

[color=green]方案一:[/color]如果不需要與服務互動,通過startservice方式啟動即可。

[color=green]方案二:[/color]如果需要與服務互動,則先通過bindservice方式繫結服務,再通過startservice方式啟動。

提高Android應用的後台存活

每個android 應用程序都會分配一定的執行記憶體,當超出執行記憶體時就會報oom。平常 開發時要注意記憶體洩漏的問題,記憶體洩漏的問題本質就是生命週期較長的物件持有生命週期較短的物件的引用,導致生命週期較短的例項無法釋放 所謂的程序保活實際上就是降低oom adj的值 oom adj值對應程序分...

Android 應用實現多程序

android service 跨程序實現 同乙個應用程式中實現多個程序通訊 通訊機制 使用aidl通訊 具體步驟 1 新建aidl檔案 例 iclickaidlinte ce.aidl inte ce iclickaidlinte ce 以上步驟,如果沒有差錯,重新編譯,會自動生成乙個 iclic...

Android喚起後台應用到前台

場景 當應用隱藏在後台而沒有關閉,通過本身的懸浮窗體來喚起。方法 通過activitymanager獲取runningtasks,獲取應用對應的task,再通過activitymanager的movetasktofront 方法來把應用喚起到前台。判斷應用是否已經在前台了 public boolea...