版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、項目要實現(xiàn)這樣一個效果:運行后,要有一個service始終保持在后臺運行,不管用戶作出什么操作,都要保證service不被kill,這可真是一個難題。參考了現(xiàn)今各種定制版的系統(tǒng)和安全廠商牛虻軟件,如何能保證自己的Service不被殺死呢? 其實除了常規(guī)的手段,我們可以參考一下微信和360,設(shè)置-程序-正在運行,可以看到微信是同時開啟了兩個進程和服務(wù): 我猜想它應(yīng)該是相互監(jiān)聽,如果有一方被kill掉,另一個捕獲到立即啟動,以達到service永遠都在運行的狀態(tài),貌似360也是這個原理,具體是不是這個樣子,還有待參考,目前我還沒有參透它們是如何實現(xiàn)的,先簡單說一下我自己的防控措施吧。 一、Serv
2、ice簡介 Service是在一段不定的時間運行在后臺,不和用戶交互應(yīng)用組件。每個Service必須在manifest中 通過來聲明??梢酝ㄟ^contect.startservice和contect.bindserverice來啟動。和其他的應(yīng)用組件一樣,運行在進程的主線程中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現(xiàn)(或者用系統(tǒng)提供的IntentService,它繼承了Service,它處理數(shù)據(jù)是用自身新開的線程)。 本地服務(wù) Local Service 用于應(yīng)用程序內(nèi)部。 它可以啟動并運行,直至有人停止了它或它自己停止。在這種方式下,它以調(diào)用Context.
3、startService()啟動,而以調(diào)用Context.stopService()結(jié)束。它可以調(diào)用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論調(diào)用了多少次startService()方法,你只需要調(diào)用一次stopService()來停止服務(wù)。 用于實現(xiàn)應(yīng)用程序自己的一些耗時任務(wù),比如查詢升級信息,并不占用應(yīng)用程序比如Activity所屬線程,而是單開線程后臺執(zhí)行,這樣用戶體驗比較好。 遠程服務(wù) Remote Service 用于android系統(tǒng)內(nèi)部的應(yīng)用程序之間。 它可以通過自己定義并暴露出來的接口進行程序操作??蛻舳私⒁粋€到
4、服務(wù)對象的連接,并通過那個連接來調(diào)用服務(wù)。連接以調(diào)用Context.bindService()方法建立,以調(diào)用 Context.unbindService()關(guān)閉。多個客戶端可以綁定至同一個服務(wù)。如果服務(wù)此時還沒有加載,bindService()會先加載它。 可被其他應(yīng)用程序復(fù)用,比如天氣預(yù)報服務(wù),其他應(yīng)用程序不需要再寫這樣的服務(wù),調(diào)用已有的即可。 1,Service的生命周期 2,Service運行方式 以startService()啟動service,系統(tǒng)將通過傳入的Intent在底層搜索相關(guān)符合Intent里面信息的service。如果服務(wù)沒有啟動則先運行onCreate,然后運行onS
5、tartCommand (可在里面處理啟動時傳過來的Intent和其他參數(shù)),直到明顯調(diào)用stopService或者stopSelf才將停止Service。無論運行startService多少次,只要調(diào)用一次stopService或者stopSelf,Service都會停止。使用stopSelf(int)方法可以保證在處理好intent后再停止。onStartCommand ,在2.0后被引入用于service的啟動函數(shù),2.0之前為public void onStart(Intent intent, int startId) 。 使用bindService()方法啟用服務(wù),調(diào)用者與服務(wù)綁定在
6、了一起,調(diào)用者一旦退出,服務(wù)也就終止。 onBind()只有采用Context.bindService()方法啟動服務(wù)時才會回調(diào)該方法。該方法在調(diào)用者與服務(wù)綁定時被調(diào)用,當調(diào)用者與服務(wù)已經(jīng)綁定,多次調(diào)用Context.bindService()方法并不會導(dǎo)致該方法被多次調(diào)用。 采用Context.bindService()方法啟動服務(wù)時只能調(diào)用onUnbind()方法解除調(diào)用者與服務(wù)解除,服務(wù)結(jié)束時會調(diào)用onDestroy()方法。 3,擁有service的進程具有較高的優(yōu)先級 官方文檔告訴我們,Android系統(tǒng)會盡量保持擁有service的進程運行,只要在該service已經(jīng)被啟動(sta
7、rt)或者客戶端連接(bindService)到它。當內(nèi)存不足時,需要保持,擁有service的進程具有較高的優(yōu)先級。 1 如果service正在調(diào)用onCreate,onStartCommand或者onDestory方法,那么用于當前service的進程則變?yōu)榍芭_進程以避免被killed。2 如果當前service已經(jīng)被啟動(start),擁有它的進程則比那些用戶可見的進程優(yōu)先級低一些,但是比那些不可見的進程更重要,這就意味著service一般不會被killed.3 如果客戶端已經(jīng)連接到service (bindService),那么擁有Service的進程則擁有最高的優(yōu)先級,可以認為ser
8、vice是可見的。4 如果service可以使用startForeground(int, Notification)方法來將service設(shè)置為前臺狀態(tài),那么系統(tǒng)就認為是對用戶可見的,并不會在內(nèi)存不足時killed。如果有其他的應(yīng)用組件作為Service,Activity等運行在相同的進程中,那么將會增加該進程的重要性。 二、保證service不死 onStartCommand方法,返回START_STICKY。 1、START_STICKY 在運行onStartCommand后service進程被kill后,那將保留在開始狀態(tài),但是不保留那些傳入的intent。不久后service就會再次嘗
9、試重新創(chuàng)建,因為保留在開始狀態(tài),在創(chuàng)建 service后將保證調(diào)用onstartCommand。如果沒有傳遞任何開始命令給service,那將獲取到null的intent。2、START_NOT_STICKY 在運行onStartCommand后service進程被kill后,并且沒有新的intent傳遞給它。Service將移出開始狀態(tài),并且直到新的明顯的方法(startService)調(diào)用才重新創(chuàng)建。因為如果沒有傳遞任何未決定的intent那么service是不會啟動,也就是期間onstartCommand不會接收到任何null的intent。3、START_REDELIVER_INTEN
10、T 在運行onStartCommand后service進程被kill后,系統(tǒng)將會再次啟動service,并傳入最后一個intent給onstartCommand。直到調(diào)用stopSelf(int)才停止傳遞intent。如果在被kill后還有未處理好的intent,那被kill后服務(wù)還是會自動啟動。因此onstartCommand不會接收到任何null的intent。 Override public int onStartCommand(Intent intent, int flags, int startId) flags = START_STICKY; return super.onSta
11、rtCommand(intent, flags, startId); 【結(jié)論】 手動返回START_STICKY,親測當service因內(nèi)存不足被kill,當內(nèi)存又有的時候,service又被重新創(chuàng)建,比較不錯。 提升service進程優(yōu)先級 在AndroidManifest.xml文件中對于intent-filter可以通過android:priority = 1000這個屬性設(shè)置最高優(yōu)先級,1000是最高值,如果數(shù)字越小則優(yōu)先級越低,同時實用于廣播 提升service優(yōu)先級 Android中的進程是托管的,當系統(tǒng)進程空間緊張的時候,會依照優(yōu)先級自動進行進程的回收。Android將進程分為6
12、個等級,它們按優(yōu)先級順序由高到低依次是: 1.前臺進程( FOREGROUND_APP) 2.可視進程(VISIBLE_APP ) 3. 次要服務(wù)進程(SECONDARY_SERVER ) 4.后臺進程 (HIDDEN_APP) 5.內(nèi)容供應(yīng)節(jié)點(CONTENT_PROVIDER) 6.空進程(EMPTY_APP) 當service運行在低內(nèi)存的環(huán)境時,將會kill掉一些存在的進程。因此進程的優(yōu)先級將會很重要,可以使用startForeground API將service放到前臺狀態(tài)。這樣在低內(nèi)存時被kill的幾率更低,但是如果在極度極度低內(nèi)存的壓力下,該service還是會被kill掉。 在
13、onStartCommand方法內(nèi) Notification notification = new Notification(R.drawable.ic_launcher, getString(R.string.app_name), System.currentTimeMillis(); PendingIntent pendingintent = PendingIntent.getActivity(this, 0, new Intent(this, AppMain.class), 0); notification.setLatestEventInfo(this, uploadservice,
14、請保持程序在后臺運行, pendingintent); startForeground(0x111, notification); 注意在onDestroy里還需要stopForeground(true); 在onDestroy方法里重啟service service +broadcast 方式,就是當service走ondestory的時候,發(fā)送一個自定義的廣播,當收到廣播的時候,重新啟動service; /這個就是自定義的action 在onDestroy時: Override public void onDestroy() stopForeground(true); Intent int
15、ent = new Intent(com.dbjtech.waiqin.destroy); sendBroadcast(intent); super.onDestroy(); 在BootReceiver里 public class BootReceiver extends BroadcastReceiver Override public void onReceive(Context context, Intent intent) if (intent.getAction().equals(com.dbjtech.waiqin.destroy) /TODO /在這里寫重新啟動service的相
16、關(guān)操作 startUploadService(context); 【結(jié)論】當然,你也可以在onDestroy里直接startService(),我通過使用broadcast,可以做更多的處理判斷操作。 一個不被殺死的進程 看Android的文檔知道,當進程長期不活動,或系統(tǒng)需要資源時,會自動清理門戶,殺死一些Service,和不可見的Activity等所在的進程。但是如果某個進程不想被殺死(如數(shù)據(jù)緩存進程,或狀態(tài)監(jiān)控進程,或遠程服務(wù)進程),可以這么做: application android:name=com.test.Application android:allowBackup=true
17、android:icon=drawable/ic_launcher android:label=string/app_name android:persistent=true android:theme=style/AppTheme 【結(jié)論】據(jù)說這個屬性不能亂設(shè)置,不過設(shè)置后,的確發(fā)現(xiàn)優(yōu)先級提高不少,或許是相當于系統(tǒng)級的進程。 系統(tǒng)各種廣播監(jiān)聽 通過系統(tǒng)的廣播,監(jiān)聽并捕獲到,然后判斷是否需要重新啟動service。 Override public void onReceive(Context context, Intent intent) if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAct
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 不打死結(jié)的紅領(lǐng)巾系法
- 【語文課件】再見了親人 浙江教育出版社課件
- 單位人力資源管理制度收錄匯編十篇
- 單位人力資源管理制度集合合集十篇
- 單位管理制度展示合集職工管理篇
- 傳媒行業(yè)“AI、出海、IP”為舵乘風(fēng)破浪
- 2025年互聯(lián)網(wǎng)券商行業(yè)市場趨勢分析報告
- 單位管理制度展示大合集人員管理篇
- 2022-2027年中國超聲波霧化器行業(yè)市場全景評估及發(fā)展戰(zhàn)略研究報告
- 生物燃料油生產(chǎn)建設(shè)啊項目節(jié)能評估報告(節(jié)能專)
- 財務(wù)負責人統(tǒng)一委派制度
- 瀝青路面施工監(jiān)理工作細則
- 物業(yè)設(shè)備設(shè)施系統(tǒng)介紹(詳細).ppt
- 公司走賬合同范本
- 獲獎一等獎QC課題PPT課件
- 市場調(diào)查的產(chǎn)生與發(fā)展
- 人教版小學(xué)三年級數(shù)學(xué)上冊判斷題(共3頁)
- 國際項目管理手冊The Project Manager’s Manual
- 小學(xué)五年級思政課教案三篇
- 華為內(nèi)部虛擬股管理暫行條例
- 大劇院建設(shè)項目設(shè)計投資造價估算
評論
0/150
提交評論