Android應用被淺殺和深殺

2021-10-24 02:35:00 字數 3178 閱讀 9328

ontaskremoved()方法在當使用者移除應用的乙個task棧時被呼叫。也就是當使用者在最近任務介面把該應用的乙個task劃掉時,或者在最近任務介面進行清理時。這兩種情況下ontaskremoved()都會被呼叫,但在大多android機型上,這兩種情況有所不同:第一種情況即應用被淺殺(使用者只劃掉這乙個task),該task棧會被清理,但如果有後台service在執行,該應用的程序不會被殺掉,後台service仍然在執行。第二種即應用被深殺(使用者在最近任務介面直接按清理按鈕),該應用的程序會被直接殺掉,後台的service當然也停止了。對於不同的手機品牌和機型在最近任務進行各種清理時過程可能不太一樣,但應用淺殺和深殺對於所有android手機都是有普遍意義的。

下面分析在應用被淺殺和被深殺以及先淺殺再深殺後的生命週期:

淺殺:

04-21 17:55:13.733 8264-8264/com.qintong.test d/qintong: vcardservice ontaskremoved.
深殺:

會出現兩種情況:

(a).

04-26 16:20:00.349 32674-32674/? d/qintong: service ontaskremoved.

04-26 16:21:01.621 2936-2936/? d/qintong: service is being created.

04-26 16:21:01.628 2936-2936/? d/qintong: service onstartcommand.

(b).

04-21 17:59:58.397 8264-8264/com.qintong.test d/qintong: service oncreate.

04-21 17:59:58.404 8264-8264/com.qintong.test d/qintong: service ontaskremoved.

淺殺+深殺 (service 的 onstartcommand 返回 sticky):

04-21 18:05:12.717 8264-8264/com.qintong.test d/qintong: service ontaskremoved.

04-21 18:05:29.214 9207-9207/com.qintong.test d/qintong: service oncreate.

04-21 18:05:29.223 9207-9207/com.qintong.test d/qintong: service onstartcommand.

我們來分析這幾種情況:

(1).淺殺時:應用程序沒被殺掉,service仍然在執行,service的ontaskremoved()立即被呼叫。

(2).深殺時:有兩種情況:第一種情況是深殺後直接呼叫ontaskremoved()且service停止,過段時間後service重啟呼叫其oncreate()和onstartcommand()。第二種是應用的程序被殺掉,過一會後service的oncreate()方法被呼叫,緊接著ontaskremoved()被呼叫。由於被深殺後應用的程序立刻停止了,所以service的ontaskremoved()無法被立即呼叫。而過若干秒後,service重啟,oncreate()被呼叫,緊接著ontaskremoved()被呼叫。而這裡service的其他方法並沒有被呼叫,即使onstartcommand()返回sticky,service重啟後onstartcommand()方法也沒有被呼叫。

(3).淺殺+深殺時(service 的 onstartcommand 返回 sticky):ontaskremoved()立刻被呼叫(淺殺後),深殺後過段時間oncreate()和onstartcommand()相繼被呼叫。執行淺殺task被清理,應用的程序還在,ontaskremoved()被呼叫,過程與(1)一樣。再執行深殺:由於該應用的task棧已經沒有了,所有再深殺ontaskremoved()不會再被呼叫,深殺後service停止。而由於實驗時候onstartcommand()返回sticky,所有service過段時間會被再次啟動,執行了oncreate()方法和onstartcommand()方法。

所以綜上所述,service的ontaskremoved()在應用淺殺後會被立即呼叫而在service被深殺後,會直接呼叫ontaskremoved或service會被重啟並呼叫ontaskremoved()。

回到我們的問題:應用被殺後,如何取消notification:

我們先看最後的解決方案,在來分析為何能work。

service的**如下:

@override

public void oncreate()

@override

public int onstartcommand(intent intent, intflags, intid)

@override

public void ontaskremoved(intent rootintent)

如上**,在淺殺時候:只執行ontaskremoved(),通知被取消,但service仍然在執行,所以還會繼續發通知,正常執行。

深殺時:第一種情況直接呼叫ontaskremoved()且service停止,通知被取消。第二種情況,程序被殺掉,幾秒後service重啟,oncreate() -> ontaskremoved(),執行結果就是深殺後過幾秒後notification被取消。

淺殺+深殺時:淺殺後ontaskremoved()被呼叫,service仍在執行,通知仍然在更新。深殺時,oncreate() -> onstartcommand(),在onstartcommand()時候取消通知。

另外,mnotificationmanager.cancelall()會清除應用的所有通知,如果應用想保留和該service無關其他通知,可以呼叫mnotificationmanager.cancel(string tag, int id)或cancel(int id)清除指定通知。

當然,還可以有另一種方式:淺殺時後就把service後台執行的任務停止,並清理notification,我們可以根據需求來選擇。

android應用常駐後台,避免被第三方殺掉的方法

應用常駐後台,避免被第三方殺掉的方法 一 service設定成start sticky kill 後會被重啟 等待5秒左右 重傳intent,保持與重啟前一樣 二 通過 startforeground將程序設定為前台程序,做前台服務,優先順序和前台應用乙個級別,除非在系統記憶體非常缺,否則此程序不會...

淺拷貝和深拷貝的應用

說到這個其實要引申出乙個知識點,那便是儲存型別,簡單來說分為值型別 又名 原始型別,六種 string,number,null,undefined,boolean,symbol 不重複得值 和引用型別 又名 物件型別 例如 function,array 其中常見值型別有string number b...

手機三國殺 諾基亞忽悠了誰和被誰忽悠

殊不知諾基亞的elop已經準備在12月的中國移動開發者大會上發布一款新手機了 920t 張曉東 諾基亞ceo吹牛水平和目空一切的精神,還是移居第一的。諾基亞,曾幾何時以快速出具新牌打手機市場這局三國殺,就好像孫權一樣,換來換去,永遠有新的牌,新的設計。但是倒了黴了,htc開始蠶食他的領土了,攜手go...