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