1、前臺進程:當前運行的進程,除非APP的內(nèi)存超過系統(tǒng)給定的最大內(nèi)存,導致OOM才會被殺掉

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供賀蘭網(wǎng)站建設(shè)、賀蘭做網(wǎng)站、賀蘭網(wǎng)站設(shè)計、賀蘭網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、賀蘭企業(yè)網(wǎng)站模板建站服務,十多年賀蘭做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務。
2、可見進程、服務進程:當前可見、運行的音樂這種
3、空進程:給新打開的APP使用,優(yōu)先級最低
Service 的啟動方式有兩種,一種是startService(),一種是bindService().這兩種方式有有什么區(qū)別.
startService(),啟動完之后該service就在后臺運行,其生命周期跟啟動它的Context沒有任何關(guān)系。也不能跟Context通訊。
bindService()啟動之后生命周期跟啟動它的Context有關(guān),比如Activity、fragment、service等。在Context中解綁之后,如果改Service沒有任何綁定后該Service也就結(jié)束。
Service 的生命周期跟啟動方式有關(guān)。
stratService的生命周期: onCreate() - onStartCommand() - onDestroy()
bindService的生命周期: onCreate() - onBind() - onUnbind() - onDestroy()
1.PARTIAL_WAKE_LOCK:保證CPU保持高性能運行,而屏幕和鍵盤背光(也可能是觸摸按鍵的背光)關(guān)閉。一般情況下都會使用這個WakeLock。
2.ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高性能運行外還會導致屏幕亮起,即使屏幕原先處于關(guān)閉的狀態(tài)下。
3.ON_AFTER_RELEASE:如果釋放WakeLock的時候屏幕處于亮著的狀態(tài),則在釋放WakeLock之后讓屏幕再保持亮一小會。如果釋放WakeLock的時候屏幕本身就沒亮,則不會有動作。
1.PARTIAL_WAKE_LOCK:保證CPU保持高性能運行,而屏幕和鍵盤背光(也可能是觸摸按鍵的背光)關(guān)閉。一般情況下都會使用這個WakeLock。
2.ACQUIRE_CAUSES_WAKEUP:這個WakeLock除了會使CPU高性能運行外還會導致屏幕亮起,即使屏幕原先處于關(guān)閉的狀態(tài)下。
3.ON_AFTER_RELEASE:如果釋放WakeLock的時候屏幕處于亮著的狀態(tài),則在釋放WakeLock之后讓屏幕再保持亮一小會。如果釋放WakeLock的時候屏幕本身就沒亮,則不會有動作。
對于 API level 18 :調(diào)用startForeground(ID, new Notification()),發(fā)送空的Notification ,圖標則不會顯示。
對于 API level = 18:在需要提優(yōu)先級的service A啟動一個InnerService,兩個服務同時startForeground,且綁定同樣的 ID。Stop 掉InnerService ,這樣通知欄圖標即被移除。
該方案過于流氓,而且效果不好,所以不寫。
JobSchedule 允許在特定狀態(tài)與特定時間間隔周期執(zhí)行任務。我們可以利用它的這個特點來完成保活功能,效果就像開啟一個定時器,與普通定時器不同的是其調(diào)度由系統(tǒng)來完成。
在發(fā)送特定系統(tǒng)事件時,系統(tǒng)會發(fā)出廣播,通過在AndroidManifest中靜態(tài)注冊對應的廣播監(jiān)聽,即可在發(fā)送響應事件時拉活。
但是Android7.0開始,對廣播進行了限制,而且在8.0更加嚴格。
Android8.0開始對廣播有了限制:很多隱式廣播接收器不能在清單中靜態(tài)注冊。但清單注冊廣播接收器仍是可以的(豁免廣播或自定義廣播-注意,自定義廣播要顯式發(fā)送)。實現(xiàn)隱式廣播(系統(tǒng)廣播)的接收也是可以的,但只能通過動態(tài)注冊來實現(xiàn)了。
有多個app在用戶設(shè)備上安裝,只要開啟其中一個, 就可以將其他的app也拉活。
具體實現(xiàn):
一、系統(tǒng)同步機制拉活
1、最原始的dp+自適應布局+weight,多套dimens.xml
缺點:只能滿足90%以上的手機,同一像素的手機,dpi不一樣
2、smallestWidth適配,res 文件夾下創(chuàng)建各種屏幕分辨率對應的 values-sw{xxx}dp 文件夾
缺點: 1、包會增加500kb左右
2、只支持3.2及以上的系統(tǒng)
3、AutoSize今日頭條屏幕適配方案
當前設(shè)備屏幕總寬度(單位為像素)/ 設(shè)計圖總寬度(單位為 dp) = density
原理:調(diào)用Android API,根據(jù)設(shè)備某一維度(寬或高)的真實長度(單位是px)與這一維度在UI設(shè)計圖上的dp值之間的關(guān)系,重新計算density來實現(xiàn)
缺點: 第三方庫適配
系統(tǒng)出于性能和體驗上的考慮,APP退到后臺后并不會真正的kill、掉進程,而是將其緩存起來。
打開的應用越多,緩存的應用也就越多,在系統(tǒng)進程不足的情況下,系統(tǒng)根據(jù)自己的一套進程回收機制,來判斷kill掉哪些進程,以騰出進程給需要的app,這套進程回收機制叫做low memory killer。
內(nèi)存閥值,每個手機都不一樣,當可用內(nèi)存小于該值得時候,Android就會殺死對應優(yōu)先級得進程。
進程的優(yōu)先級通過oom_adj來判斷,oom_adj取值如下:
0-3是比較安全的oom_adj一般不會被系統(tǒng)殺死的,所以我們只要保證自己的app oom_adj在0-3之間就可以了。
可以通過adb命令:cat /proc /4181/oom_adj來查看自己app的oom_adj的值
4181是進程號
原理:手機關(guān)閉屏幕的時候,偷偷創(chuàng)建一個activity,讓應用成為前臺進程,打開屏幕時關(guān)閉activity,這樣用戶就不會發(fā)現(xiàn)什么異常,我們知道前臺應用的oom_adj為0是不會被殺死的,這樣就達到看保活的目的。
缺點:activity不夠干凈,只有在息屏的時候才生效,存在局限性比較大,而且谷歌原生的系統(tǒng)息屏的時候不會清理進程,但是現(xiàn)在很多廠商會在息屏的時候清理內(nèi)存,所以本方案的可行性不高,可以作為了解。
保活原理:啟動一個前臺服務,從而拉高整個應用的優(yōu)先級。
因為一旦通知被用戶干掉那么該保活方案就不好用了,所以通知圖標存在與否是該方案是否可行的關(guān)鍵。
但是該方案是谷歌官方承認的保活方案,所以可行性還是很高的。
需要適配
API18通知圖標不會顯示
API=18API26可以啟動雙服務,綁定同樣的D,然后stop
這個方法的原理是8.0系統(tǒng)之前會根據(jù)服務的id來判斷通知,那么第二個id設(shè)置跟第一個相同,然后自殺,系統(tǒng)就會誤認為此通知已死就不會通知了,那么通知欄上面就不會顯示
API=26后暫時沒有方式能夠隱藏
8.0之后不可以創(chuàng)建同樣的id的通知,所以此隱藏通知的方法就不好用了,當然了,通知顯示與否不是該方案成功的評判標準,所以說還是可以用的。
在發(fā)生特定系統(tǒng)事件時,系統(tǒng)會發(fā)出廣播,通過在 Androidmanifest中靜
態(tài)注冊對應的廣播監(jiān)聽器,即可在發(fā)生響應事件時拉活
但是從 android7.0開始,對廣播進行了限制,而且在8.0更加嚴格該方法就不適用了。
有多個app在用戶設(shè)備上安裝,只要開啟其中一個就可以將其他的app也拉
活。比如手機里裝了手Q、QQ空間、興趣部落等等,那么打開任意一個app后,其
他的app也都會被喚醒
系統(tǒng)每隔一段時間會進行賬戶同步,當系統(tǒng)去賬戶同步的時候(不一定多長時間,跟系統(tǒng)有關(guān)),我們就去拉活app,這個方案是非常穩(wěn)定的,當然了國內(nèi)的系統(tǒng)都是定制的,所以還是需要一定的適配的。
優(yōu)點:系統(tǒng)喚醒,比較穩(wěn)定
缺點:時間不能把控
JobScheduler允許在特定狀態(tài)與特定時間間隔周期執(zhí)行任務。可以利
用它的這個特點完成保活的功能,效果即開啟一個定時器,與普通定時器不
同的是其調(diào)度由系統(tǒng)完成。
同樣在某些ROM可能并不能達到需要的效果
概述:記錄一下常見布局的編寫方式。
答:使用recyclerView的網(wǎng)格布局即可。
答:使用別人的開源組件。
應用場景,b站視頻的標簽,商品標簽等等。
答:使用LinearLayout布局,設(shè)置weightSum屬性,子view設(shè)置layout_weight屬性。記住需要把設(shè)定的寬度或者高度設(shè)置0dp。
答:使用RelativeLayout布局,最后一個子View會顯示在屏幕的最上方,不會被遮擋,常用來做activity標題頭(titlebar)。
答:使用如下屬性即可。
答:推薦使用NestedScrllView。
答:參考:
答:如下
在布局中添加如下屬性
待補充。。。
思想: 使用 Linux 中的 fork 機制創(chuàng)建 Native 進程,在 Native 進程中監(jiān)控主進程的存活,當主進程掛掉后,在 Native 進程中立即對主進程進行拉活。
原理: 在 Android 中所有進程和系統(tǒng)組件的生命周期受 ActivityManagerService 的統(tǒng)一管理。Android5.0以下通過 Linux 的 fork 機制創(chuàng)建的進程為純 Linux 進程,其生命周期不受 Android 的管理。
該方案主要適用于 Android5.0 以下版本手機。
該方案不受 forceclose 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以下版本拉活效果非常好。
詳情
對于 Android5.0 以上手機,系統(tǒng)雖然會將native進程內(nèi)的所有進程都殺死,這里其實就是系統(tǒng)“依次”殺死進程時間與拉活邏輯執(zhí)行時間賽跑的問題,如果可以跑的比系統(tǒng)邏輯快,依然可以有效拉起。在 某些 Android 5.0 以上機型有效。
詳情
作者5.0以下系統(tǒng)用一個java進程和一個fork出來的純native進程雙管道互鎖監(jiān)聽對方的狀態(tài),無論哪個被殺后都拉起第三個進程,第三個進程來拉活常駐進程,實現(xiàn)拉活。
5.0以上同一進程組的進程會被同時殺死,所以5.0以上使用雙java進程在native層互鎖文件實現(xiàn)監(jiān)聽,但任務管理器會在短時間內(nèi)殺死所有進程,只能用反射提前初始化pacel,在進程被殺的時候和系統(tǒng)搶那幾十毫秒的時間發(fā)送一個拉活的廣播。用4個文件來讓兩個進程實現(xiàn)互鎖來做監(jiān)聽,但實際效果很一般,測試了幾個5.0以上的國產(chǎn)機型都不行,效果是根本監(jiān)聽不到進程被殺,目測原因是當任務管理器查殺進程的時候?qū)⑺械倪M程都掛起了,隨后全部殺掉,并在一段時間內(nèi)禁止進程啟動。
PersistedJobService.java
BootReceiver.java靜態(tài)注冊BroadcastReceiver
注冊,開機,網(wǎng)絡(luò)切換、拍照、拍視頻時候,利用系統(tǒng)產(chǎn)生的廣播也能喚醒app,不過Android N已經(jīng)將這三種廣播取消了
常用的拉活權(quán)限
BackgroundService.java
WakeLock
作為前臺應用運行,提高應用存活幾率
service被關(guān)掉后自動啟動
START_STICKY
如果系統(tǒng)在onStartCommand返回后被銷毀,系統(tǒng)將會重新創(chuàng)建服務并依次調(diào)用onCreate和onStartCommand(注意:根據(jù)測試Android2.3.3以下版本只會調(diào)用onCreate根本不會調(diào)用onStartCommand,Android4.0可以辦到),這種相當于服務又重新啟動恢復到之前的狀態(tài)了)。
START_NOT_STICKY
如果系統(tǒng)在onStartCommand返回后被銷毀,如果返回該值,則在執(zhí)行完onStartCommand方法后如果Service被殺掉系統(tǒng)將不會重啟該服務。
START_REDELIVER_INTENT
START_STICKY的兼容版本,不同的是其不保證服務被殺后一定能重啟。
service注冊,權(quán)限設(shè)置為高優(yōu)先級
KeepAliveService.java
注冊,在新的獨立進程內(nèi)啟動,適用5.0以下的原生系統(tǒng),5.0以上同樣會被殺死
他的局限性在于:
第一,用戶會在系統(tǒng)設(shè)置的賬戶列表里面看到一個不認識的賬戶;
第二,同步的事件間隔是有限制的,最短1分鐘,見源碼,如果小雨60秒,置為60秒。而且各種國產(chǎn)機怎么改的源碼我們未可知,是不是都能用仍然未可知;
第三,很致命,某些手機比如note3需要手動設(shè)置賬戶,你如何騙你的用戶給你手動設(shè)置賬戶完了之后不卸載你;
第四,也很致命,必須聯(lián)網(wǎng)!google提供這個組件是讓你同步賬戶信息,不聯(lián)網(wǎng)你同步個鬼,我們要保活,可以不聯(lián)網(wǎng)不做事,但是不能不聯(lián)網(wǎng)就死
集成三方推送平臺sdk,友盟極光等
當前標題:android方案,安卓方案定制開發(fā)
路徑分享:http://chinadenli.net/article26/dsgepcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、標簽優(yōu)化、定制網(wǎng)站、微信小程序、外貿(mào)建站、網(wǎng)站導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)