關於Service常駐記憶體不被清理的解決方法

2022-02-01 20:45:20 字數 3626 閱讀 2659

言歸正傳, android的系統程序分為五個等級, foreground process(前台程序), visible process(可見程序), service process(服務程序), background process(後台程序), empty process(空程序), service的程序處於第三個位置. 系統的**會從低到高依次**, 所以我們必須提高service的等級, 仔細看service的api會發現這麼個方法.

public

final

void startforeground (int id, notification notification)

我們可以這樣.

private

void

startforegroundcompat()

} catch

(exception e)

}

為什麼要低於版本18呢, 那你這句就問的就是廢話了. 有bug唄, 開個玩笑, 在版本18以及以上, 會彈出個預設的通知, so, 要低於版本18.

那有人可能又想, 那我們寫成這樣呢. 

startforeground(1120, null

);

當然也不行了, 要是行還new個空的幹嘛, 這樣會報錯滴. 

如果這樣做之後, 你會發現一鍵清理對你的service是完全不起作用的(再也沒有那該死的正在重新啟動了, 你這麼吊, 你經理知道嗎, 啊. 啊). 你可以哈哈大笑了, 總算解決了個殘留很久的問題了. 但是,但是...miui必須在自啟動管理裡允許, 否則下文一切都是扯淡.

網上還有說通過startcommand的返回值讓service是否重新啟動, 我覺著這樣很不好.

最後, 咱最終還是本著決定權在使用者手裡的原則, 你要是真的讓我走, 我絕不宕機白咧, 但是我得知道, 你真的指的是我, 走, 也要走的唯一! 

按常理的話, 題目的解釋到這裡就完成了. 

但是我這人吧, 就喜歡多做一點點. 永遠超出別人的預期.  吼哈.... 

有的人會想, 那我api18以後怎麼辦, 我, 我, 我也不知道撒...

<

receiver

android:name

=".notifyreceiver"

>

<

intent-filter

>

<

action

android:name

="android.intent.action.boot_completed"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.net.conn.connectivity_change"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.intent.action.time_set"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.intent.action.date_changed"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.intent.action.timezone_changed"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.intent.action.package_added"

/>

<

action

android:name

="android.intent.action.package_removed"

/>

<

action

android:name

="android.intent.action.package_replaced"

/>

<

data

android:scheme

="package"

/>

intent-filter

>

<

intent-filter

>

<

action

android:name

="android.intent.action.media_bad_removal"

/>

<

action

android:name

="android.intent.action.media_eject"

/>

<

action

android:name

="android.intent.action.media_mounted"

/>

<

action

android:name

="android.intent.action.media_removed"

/>

<

action

android:name

="android.intent.action.media_scanner_finished"

/>

<

action

android:name

="android.intent.action.media_scanner_started"

/>

<

action

android:name

="android.intent.action.media_shared"

/>

<

action

android:name

="android.intent.action.media_unmounted"

/>

<

data

android:scheme

="file"

/>

intent-filter

>

receiver

>

你註冊這麼個廣播接收器, 在裡面啟動你的service(當然啟動的時候最好判斷下是否啟動), 除非使用者不操作手機, 不安裝, 不解除安裝, 網路環境一直不變化. 否則, 嘿嘿

what, 我這是在扇自己的臉嗎. 我只是說有這麼個方案, 當然不太建議大家去這麼做, 簡直太流氓了, 反正我是這麼做了. 需求讓人迷失自己!!! 迷失 noooooooo, 程式設計師是沒有自己的. 

常駐記憶體理解

比如你扔了乙個物件到容器裡,那麼你每次從容器裡拿這個物件,都是這乙個物件 那麼你某個請求裡改了這個物件的某個引數,其他請求進來,這個引數也是修改過的,第二點就是協程切換,乙個程序可以同時處理多個請求 然後每個請求裡靜態變數 容器物件啥的也是共用的,但同時處理的只有一處 這就導致你呼叫了協程切換的 a...

android如何保證service不被殺死

android開發的過程中,每次呼叫startservice intent 的時候,都會呼叫該service物件的onstartcommand intent,int,int 方法,然後在onstartcommand方法中做一些處理。從android官方文件中,我們知道onstartcommand有4...

Android怎麼保證service不被殺死

官方文件告訴我們,android系統會盡量保持擁有service的程序執行,只要在該service已經被啟動 start 或者客戶端連線 bindservice 到它。當記憶體不足時,需要保持,擁有service的程序具有較高的優先順序。1 如果service正在呼叫oncreate,onstart...