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