service與application的生命周期有關(guān)系的。

成都創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供網(wǎng)站設(shè)計制作、成都做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計,成都響應(yīng)式網(wǎng)站建設(shè),網(wǎng)頁設(shè)計師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:18982081108
在Android中進(jìn)程按優(yōu)先級可以分為五類,優(yōu)先級從高到低排列:
前臺進(jìn)程 該進(jìn)程包含正在與用戶進(jìn)行交互的界面組件,比如一個Activity。
可視進(jìn)程 該進(jìn)程中的組件雖然沒有和用戶交互,但是仍然可以被看到。
服務(wù)進(jìn)程 該進(jìn)程包含在執(zhí)行后臺操作的服務(wù)組件,比如播放音樂的Service。
后臺進(jìn)程 該進(jìn)程包含的組件沒有與用戶交互,用戶也看不到 Service。
空進(jìn)程 沒有任何界面組件、服務(wù)組件,或觸發(fā)器組件。
Android系統(tǒng)是進(jìn)程托管的,也就是說進(jìn)程都是由系統(tǒng)來管理,系統(tǒng)會按照特定的算來來回收這些進(jìn)程。在回收中秉承幾個原則:
1. 盡量延長進(jìn)程的生命周期,不到必須的情況下不會回收,因?yàn)橄到y(tǒng)回收進(jìn)程會影響用戶體驗(yàn)
2. 按優(yōu)先級從低到高進(jìn)行回收
3. 同等優(yōu)先級的進(jìn)程越近使用越晚回收。
通過上面這些解釋,進(jìn)程過一段時間后是會被回收的,但要遵循上面的這些原則,service和application的生命周期有關(guān),只要進(jìn)程被回收,那么它所占用的所有資源將被回收。
在處理app啟動速度的時候,可以設(shè)置主線程的優(yōu)先級,保證主線程占用的cpu足夠久。進(jìn)程的oom_adj,決定了當(dāng)內(nèi)存不夠的時候,lmk會根據(jù)oom_adj的大小依次釋放內(nèi)存。
android中對線程等級劃分如下:
設(shè)置線程的優(yōu)先級分為:android 提供的api和java sdk自帶的api
注意: 要使用android提供的api設(shè)置,用java提供的作用不夠顯著
作用: 可以在主線程設(shè)置主線層等級;在Glide加載圖片的時候設(shè)置低優(yōu)先級。當(dāng)圖片量很大的時候可以降低加載圖片線程的等級
android內(nèi)存不夠了,會觸發(fā)oom機(jī)制,lowMemoryKiller會根據(jù)每個進(jìn)程的oom_adj的等級,依次殺死進(jìn)程,釋放內(nèi)存。
lom會根據(jù)free的內(nèi)存的值,來判斷kill掉哪個等級下的進(jìn)程。例如當(dāng)空閑內(nèi)存只有64M了。會kill掉oom_adj 為12-15的進(jìn)程
真實(shí)案例:應(yīng)用A跳到第三方應(yīng)用B,在第三方應(yīng)用B中播放視頻,加載大量圖片,導(dǎo)致返回的時候,應(yīng)用A走了SplashActivity。通過logcat發(fā)現(xiàn)A應(yīng)用被kill掉了
在android應(yīng)用開發(fā)時,我們經(jīng)常會在后臺開一個service,來處理一些業(yè)務(wù)操作。最近公司的一個項(xiàng)目就是,通過service不斷地和硬件設(shè)備交互,獲取數(shù)據(jù),在頁面長時間停留在一個頁面時,手機(jī)的屏幕會出項(xiàng)鎖屏的狀況,這時,我們的應(yīng)用的優(yōu)先級就會下降,很多次,等打開屏幕的瞬間,我發(fā)現(xiàn)原來的原來的進(jìn)程被殺死了,應(yīng)用又回到了首頁,尤其是在Android高版本的系統(tǒng)中尤為突出。所以下面我們通過提成優(yōu)先級的方式,來進(jìn)行進(jìn)程保活
2.在程序開始的地方注冊這個廣播接收者
4.定義這個activity的style屬性 value - style.xml 文件
5.Androidmanifest文件中注冊這個activity
大功告成!
經(jīng)過測試,本人的華為榮耀9i,原來存在的問題被解決了,希望大家能互相交流經(jīng)驗(yàn)。
接上篇cpuset,這篇來看看進(jìn)程優(yōu)先級與調(diào)度策略管理。
Linux中,優(yōu)先級號一共有0-139,其中0-99的是RT(實(shí)時)進(jìn)程,100-139的是非實(shí)時進(jìn)程。
數(shù)字越低優(yōu)先級越高。
SCHED_IDLE idle狀態(tài)低優(yōu)先級進(jìn)程調(diào)度
先看Process中調(diào)度策略的劃分,與上面介紹的一樣。
首先在AMS中封裝了FIFO和NORMAL的兩個策略,NORMAL好說,看看FIFO在哪用到
這里Process.setThreadScheduler并沒有太多的應(yīng)用,我們直接來看優(yōu)先級設(shè)置吧。else中將top app的UI線程與render線程都設(shè)置為TOP_APP_PRIORITY_BOOST優(yōu)先級,nice值為-10,非常高。
這里主要調(diào)用androidSetThreadPriority方法
這里通過set_sched_policy來調(diào)整調(diào)度策略,并通過setpriority設(shè)置進(jìn)程優(yōu)先級。這里不特意區(qū)分進(jìn)程與線程了,反正在linux中都是進(jìn)程。
這里與前面的cpuset非常相似,依然是寫節(jié)點(diǎn),節(jié)點(diǎn)前面也提了就是:
那么這里又引入了一個schedtune子系統(tǒng),簡單介紹下:
schedtune是ARM/Linaro為了EAS新增的一個子系統(tǒng),主要用來控制進(jìn)程調(diào)度選擇CPU以及boost觸發(fā)。通過權(quán)重來分配CPU負(fù)載能力來實(shí)現(xiàn)快速運(yùn)行。高權(quán)重意味著會享受到更好的cpu負(fù)載來處理對應(yīng)的任務(wù),換句話說你能享受相對更好的cpu運(yùn)行性能。
簡單梳理下schedtune和不同類型SchedPolicy之間的對應(yīng)關(guān)系:
看下具體文件夾內(nèi)容:
系統(tǒng)配置:
這里/dev/stune相關(guān)配置只做了這么一個
有幾種方法可供參考:
方法1: 提高進(jìn)程優(yōu)先級 startForeground(1, new Notification()); 降低進(jìn)程優(yōu)先級 stopForeground(true);
onStart() 方法中進(jìn)行提高優(yōu)先級操作,然后在onStop()方法中進(jìn)行降低優(yōu)先級操作
這個方法可以將對應(yīng)AP的ADJ臨時提高到2。
方法2:
找到這個進(jìn)程對應(yīng)的AndroidMannifest.xml文件,在其中添加屬性『android:persistent="true"』, 這樣可以將該進(jìn)程設(shè)置為常駐內(nèi)存進(jìn)程,就可以降低被Kill的概率。以Acore進(jìn)程為例, 在 /package/providers/ContactsProvider/AndroidMannifest.xml 文件中增加一行『android:persistent="true"』
具體修改示例如下:
application android:process="android.process.acore" android:label="@string/app_label"
android:icon="@drawable/app_icon"
android:allowBackup="false"
android:persistent="true"
方法3:
在需要提高優(yōu)先級的地方調(diào)用:
final Intent it = new Intent();
it.setAction("android.intent.action.BOOST_DOWNLOADING");
it.putExtra("package_name", "com.android.contacts");
it.putExtra("enabled", true);
context.sendBroadcast(it);
在需要恢復(fù)到正常優(yōu)先級時調(diào)用:
final Intent it = new Intent();
it.setAction("android.intent.action.BOOST_DOWNLOADING");
it.putExtra("package_name", "com.android.contacts");
it.putExtra("enabled", false);
context.sendBroadcast(it);
onStart() 方法中進(jìn)行提高優(yōu)先級操作,然后在onStop()方法中進(jìn)行降低優(yōu)先級操作
這個方法可以將對應(yīng)AP的ADJ臨時提高到7。
在寫前一篇文章 淺述Android Apk打包流程 的時候發(fā)現(xiàn)解壓后的apk里res的資源文件,有多于我本地項(xiàng)目中的res資源文件夾。
如果我的項(xiàng)目中依賴了Android的一些庫,比如design庫,design里面有自己的res,那么在打包我的項(xiàng)目的時候,這些res會合并一起打包。
我查看了下,我確實(shí)依賴了design等庫。
對比一下前三張圖,我本地項(xiàng)目沒有建anim、anim-v21、animator-v21(不再截圖了)等資源文件夾,但是design庫有,最終一并打包到我的項(xiàng)目中。
res目錄下的文件夾是有命名規(guī)則的,不能隨便起,為的是要適配不同的設(shè)備,而且是要做到最佳的資源匹配。
2.1、資源標(biāo)簽屬性及優(yōu)先級
除了分辨率外,同種資源之間可以有下面許多資源屬性標(biāo)簽,它們在匹配過程中是有優(yōu)先級順序的。大家可以快速瀏覽一下即可。以下資源標(biāo)簽修飾語按照優(yōu)先級從高到低的順序排列。
3、Locale(語言和區(qū)域)
例如en表示英語,fr表示法語,en-rUS表示英語和美國地區(qū)。不區(qū)分大小寫,r用于區(qū)分區(qū)域碼。
4、Layout Direction(布局方向)
ldrtl,布局方向從右到左(阿拉伯語等會這樣布局);ldltr,布局方向從左到右,是默認(rèn)的隱式值。(這就解答了我前面第二個提的問題了)
5、Smallest Screen Width(最小寬度)
swNdp,屏幕的基本尺寸。
sw320dp:適用于320 320 ldpi、320 480 mdpi、480 480 hdpi
sw600dp:適用于600 1024mdpi (7英寸的平板電腦)
sw720dp:適用于720*1280 mdpi (10英寸平板電腦)
當(dāng)你的屏幕的絕對寬度大于600dp時,屏幕就會自動調(diào)用layout-sw600dp文件夾里面的布局。這里的絕對寬度是指手機(jī)的實(shí)際寬度,即與手機(jī)是否橫屏沒關(guān)系,也就是手機(jī)較小的邊的長度。
6、Screen Width(屏幕寬度)
wNdp ,設(shè)備的可用寬度值隨著當(dāng)前是橫屏還是豎屏?xí)a(chǎn)生變化,即它表示的是當(dāng)前真實(shí)的寬度值。即當(dāng)手機(jī)豎屏?xí)r,為較小邊的長度;當(dāng)手機(jī)橫屏?xí)r,為較長邊的長度。
7、Screen Height(屏幕高度)
hNdp,與lScreen Width的使用一樣,只是這里指的是相對的高度。指手機(jī)相對放置的高度;即當(dāng)手機(jī)豎屏?xí)r,為較長邊的長度;當(dāng)手機(jī)橫屏?xí)r,為較小邊的長度。
8、Size(屏幕大小)
samll:低密度,最小布局尺寸為320 426dp
normal:中等密度,標(biāo)準(zhǔn)屏幕最小布局尺寸約為320 470dp
large:中等密度,大屏幕最小布局尺寸為480 640dp
xlarge:大于中等密度,最小布局尺寸為720 960dp。基本用于平板電腦。
該配置并不僅適用于指定設(shè)備,如果沒有匹配的資源,會選擇與之最近的。 如果所有資源均大于當(dāng)前屏幕的尺寸限定符,則系統(tǒng)不會使用這些資源,且應(yīng)用運(yùn)行時會崩潰。
9、Ratio(屏幕縱橫比)
long:寬屏
notlong:非寬屏
10、Orientation(屏幕方向)
port:豎向的
land:橫向的
square:正方形的(我也不知道這個是什么樣子的)
11、UI Mode(UI模式)
無、car、desk、 television、appliance、 watch6種模式。(其實(shí)我沒看明白是干嘛的,哈哈)
12、Night Mode(夜間模式)
night:夜間模式
notnight:非夜間模式
可以通過UiModeManager來開啟和關(guān)閉這一功能。
13、Density(屏幕像素密度)
ldpi:低密度,約120dpi;mdpi:中等密度,160dpi;hdpi:高密度,240dpi;xhdpi:超高密度,320dpi;xxhdpi:超超高密度,480dpi;xxxhdpi:超超超高密度,640dpi;nodpi:不希望以匹配設(shè)備密度的位圖資源;tvdpi:主要用于電視,約213dpi。anydpi:適用于所有密度,優(yōu)先級高于其他限定符。
14、Touch Screen(觸摸屏)
notouch:設(shè)備不帶觸摸屏
stylus:觸摸屏通過手寫筆操作
finger:觸摸屏通過手指操作
15、Keyboard(鍵盤可用性)
keysexposed:設(shè)備有可用鍵盤。如果當(dāng)前的軟鍵盤被啟用,那么即便設(shè)備沒有鍵盤或者鍵盤不可用,這個狀態(tài)仍可能有效。
keyshidden:設(shè)備有鍵盤,但當(dāng)前被隱藏,而且沒有軟鍵盤啟用。
keyssoft:設(shè)備當(dāng)前軟鍵盤啟動,即便它處于可見或不可見狀態(tài)。
16、Text Input(文本輸入法)
nokeys:設(shè)備不帶用用于文本輸入的按鍵
qwerty:設(shè)備具有標(biāo)準(zhǔn)硬鍵盤(無論是否對用戶可見)
12key:設(shè)備具有 12 鍵硬鍵盤(無論是否對用戶可見)
17、Navigation State(定位鍵可用性)
描述定位鍵是否可用,指的是光標(biāo)定位,非GPS導(dǎo)航的定位。
navexposed:定位鍵對用戶可用
navhidden:定位鍵對用戶不可用
18、Navigation Method(主要的非觸摸屏定位方式)
nonav:設(shè)備除了觸摸屏外沒有其他定位方式
dpad:設(shè)備具有用于導(dǎo)航的方向鍵
trackball:設(shè)備具有用于導(dǎo)航的軌跡球
wheel:設(shè)備有方向滾輪用于定位,不常用
19、Dimension(尺寸)
20、Version(平臺版本)
設(shè)備支持的 API 級別。例如v4 對應(yīng)于 API 級別 4,帶有 Android 1.6 或更高版本系統(tǒng)的設(shè)備。
2.2、怎么在AS中創(chuàng)建這些文件夾呢?
新聞名稱:android優(yōu)先級,android前臺服務(wù)
文章網(wǎng)址:http://chinadenli.net/article8/dsioiip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、全網(wǎng)營銷推廣、ChatGPT、網(wǎng)站收錄、用戶體驗(yàn)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)