當前位置:首頁 » 安卓系統 » android進程優先順序

android進程優先順序

發布時間: 2022-06-09 15:39:11

Ⅰ android 開4個線程 速度會提升4倍嗎

對於Android平台上的線程優先順序設置來說可以處理很多並發線程的阻塞問題,比如很多無關緊要的線程會佔用大量的CPU時間,雖然通過了MultiThread來解決慢速I/O但是合理分配優先順序對於並發編程來說十分重要。Android在線程方面主要使用的是java本身的Thread類,我們可以在Thread或Runnable介面中的run方法首句加入 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); //設置線程優先順序為後台,這樣當多個線程並發後很多無關緊要的線程分配的CPU時間將會減少,有利於主線程的處理,相關的Thread優先順序定義羅列有以下幾種: int THREAD_PRIORITY_AUDIO //標准音樂播放使用的線程優先順序 int THREAD_PRIORITY_BACKGROUND //標准後台程序 int THREAD_PRIORITY_DEFAULT // 默認應用的優先順序 int THREAD_PRIORITY_DISPLAY //標准顯示系統優先順序,主要是改善UI的刷新 int THREAD_PRIORITY_FOREGROUND //標准前台線程優先順序 int THREAD_PRIORITY_LESS_FAVORABLE //低於favorable int THREAD_PRIORITY_LOWEST //有效的線程最低的優先順序 int THREAD_PRIORITY_MORE_FAVORABLE //高於favorable int THREAD_PRIORITY_URGENT_AUDIO //標准較重要音頻播放優先順序 int THREAD_PRIORITY_URGENT_DISPLAY //標准較重要顯示優先順序,對於輸入事件同樣適用。

Ⅱ android timertask 在內存不足的情況下會被殺死嗎

通常在一部Android手機里同時運行著多個應用(app),每個app對應一個系統進程,當系統需要更多的資源(如內存)而空閑資源不足時,Android系統就會選擇殺掉一些「低優先順序」的進程以便釋放所需資源。Android系統是如何確定進程優先順序的高低的呢?如果一個app正在與用戶交互,那麼它所在的進程具有最高優先順序;其次,如果一個app是可見的,例如被一個對話框部分遮擋,它所在進程具有第二高的優先順序;再次,如果app當前是不可見的,也就是被切換到了後台,則它所在進程具有第三高的優先順序;這里要補充一點,如果這個後台app啟動了一個service,則它比一般的後台app優先順序高一些。最後,如果一個進程里沒有包含任何app,這個進程的優先順序是最低的。

Ⅲ Android中的進程有哪些,說出他們的優先順序

你這問的賊有深度,鏈接給你網頁鏈接我蹭個積分先

  • 前台進程

  • 可見進程

  • 服務進程

  • 後台進程

  • 空進程

Ⅳ android 中 自己寫的activity 的優先順序怎麼才能大於系統的 譬如來電 自己已經獲取號碼並寫了一個activity

Android中,Activity的級別永完都沒有來電這么高級別,因為手機最主要的功能,還是用來通話。

關於Android中的進程級別:
1、foreground process
正處於activity resume狀態
正處於bound服務交互的狀態
正處於服務在前台運行的狀態(StartForeGround()被調用)
Service生命周期正在被執行(onCreate(),onStart(),onDestroy())
BroadcastReceiver正在執行onReceive()方法
殺死foreground需要用戶響應,因為這個安全優先順序是最高的
是用戶操作所必須的,任一時間下,僅有少數進程會處於前台,僅當內存實在無法供給它們維持同時運行時才會被殺死。一般來說,在這種情況下,設備依然處於使用虛擬內存的狀態,必須要殺死一些前台進程以用戶界面保持響應。
•Android會依據進程中當前活躍組件的重要程度來盡可能高的估量一個進程的級別。比如說,如果一個進程中同時有一個服務和一個可視的activity,則進程會被判定為可視進程,而不是服務進程。

2、visible process
activity不在前端顯示,但也沒有完全隱藏,能夠看得見,比如彈出一個對話框
一個bound到visible或者foreground的activity的service
沒有前台組件,但仍可被用戶在屏幕上所見。當滿足如下任一條件時,進程被認為是可視的:
• 它包含著一個不在前台,但仍然為用戶可見的activity(它的onPause()方法被調用)。這種情況可能出現在以下情況:比如說,前台activity是一個對話框,而之前的 activity位於其下並可以看到。
• 它包含了一個綁定至一個可視的activity的服務。
可視進程依然被視為是很重要的,非到不殺死它們便無法維持前台進程運行時,才會被殺死。

3、Service process
正在運行的,不在上述兩種狀態的service
是由 startService() 方法啟動的服務,它不會變成上述兩類。盡管服務進程不會直接為用戶所見,但它們一般都在做著用戶所關心的事情(比如在後台播放mp3或者從網上下載東 西)。所以系統會盡量維持它們的運行,除非系統內存不足以維持前台進程和可視進程的運行需要。

4、background process
不可見狀態的activity進程,onstop被調用
包含目前不為用戶所見的activity(Activity對象的 onStop() 方法已被調用)。這些進程與用戶體驗沒有直接的聯系,可以在任意時間被殺死以回收內存供前台進程、可視進程以及服務進程使用。一般來說,會有很多背景進程 運行,所以它們一般存放於一個LRU(最後使用)列表中以確保最後被用戶使用的activity最後被殺死。如果一個activity正確的實現了生命周 期方法,並捕獲了正確的狀態,則殺死它的進程對用戶體驗不會有任何不良影響。

5、empty process
沒有運行任何component的進程,保留這個進程主要是為了緩存的需要
不包含任何活動應用程序組件。這種進程存在的唯一原因是做為緩存以改善組件再次於其中運行時的啟動時間。系統經常會殺死這種進程以保持進程緩存和系統內核緩存之間的平衡。
此外,一個進程的級別可能會由於其它進程依賴於它而升高。一個為其它進程提供 服務的進程級別永遠高於使用它服務的進程。比如說,如果A進程中的內容提供者為進程B中的客戶端提供服務,或進程A中的服務為進程B中的組件所綁定,則A 進程最低也會被視為與進程B擁有同樣的重要性。

Ⅳ android開發怎麼讓第三方服務不被殺死

方法:
對於一個service,可以首先把它設為在前台運行:
public void MyService.onCreate() {
super.onCreate();
Notification notification = new Notification(android.R.drawable.my_service_icon,
"my_service_name",
System.currentTimeMillis());
PendingIntent p_intent = PendingIntent.getActivity(this, 0,
new Intent(this, MyMainActivity.class), 0);
notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent);
Log.d(TAG, String.format("notification = %s", notification));
startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will.
}

重要設置-------------------------------
相較於/data/app下的應用,放在/system/app下的應用享受更多的特權,比如若在其Manifest.xml文件中設置persistent屬性為true,則可使其免受out-of-memory killer的影響。如應用程序'Phone'的AndroidManifest.xml文件:
<application android:name="PhoneApp"
android:persistent="true"
android:label="@string/dialerIconLabel"
android:icon="@drawable/ic_launcher_phone">
...
</application>
設置後app提升為系統核心級別,任何情況下不會被kill掉, settings->applications裡面也會屏蔽掉stop操作。

這樣設置前的log: Proc #19: adj=svc /B 4067b028 255:com.xxx.xxx/10001 (started-services)
# cat /proc/255/oom_adj

設置後的log: PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
# cat /proc/155/oom_adj
-12 # 這是CORE_SERVER_ADJ
註:init進程的oom_adj為-16(即SYSTEM_ADJ): cat /proc/1/oom_adj

Android相關部分分析:
在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼:
final ProcessRecord addAppLocked(ApplicationInfo info) {
ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);

if (app == null) {
app = newProcessRecordLocked(null, info, null);
mProcessNames.put(info.processName, info.uid, app);
updateLruProcessLocked(app, true, true);
}

if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ; // 這個常數值為-12。
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
startProcessLocked(app, "added application", app.processName);
}

return app;
}

可見要想成為core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標志,FLAG_SYSTEM指的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。

而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用
ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。

原理:
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先順序自動進行進程的回收。由此帶來三個問題:
1) 回收規則: 什麼時候回收與回收哪一個?
2) 避免誤殺: 如何阻止被回收?
3) 數據恢復與保存: 被回收了怎麼辦?

Android將進程分為6個等級,它們按優先順序順序由高到低依次是:
1.前台進程( FOREGROUND_APP)
2.可視進程(VISIBLE_APP )
3. 次要服務進程(SECONDARY_SERVER )
4.後台進程 (HIDDEN_APP)
5.內容供應節點(CONTENT_PROVIDER)
6.空進程(EMPTY_APP)

特徵:
1.如果一個進程裡面同時包含service和可視的activity,那麼這個進程應該歸於可視進程,而不是service進程。
2.另外,如果其他進程依賴於它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。
3.系統中的phone服務被劃分到前台進程而不是次要服務進程.

在android中,進程的oom_adj值也就代表了它的優先順序。oom_adj值越高代表該進程優先順序越低。文件/init.rc中有以下屬性設置:
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
/init.rc中,將PID為1的進程(init進程)的oom_adj設置為SYSTEM_ADJ(-16):
# Set init its forked children's oom_adj.
write /proc/1/oom_adj -16

查看本機設置:
cat /sys/mole/lowmemorykiller/parameters/adj
0,1,2,7,14,15

回收時機:
文件/init.rc中:
setprop ro.FOREGROUND_APP_MEM 1536 // 6M
setprop ro.VISIBLE_APP_MEM 2048 // 8M
setprop ro.SECONDARY_SERVER_MEM 4096 // 16M
setprop ro.HIDDEN_APP_MEM 5120 // 20M
setprop ro.CONTENT_PROVIDER_MEM 5632 // 22.4M
setprop ro.EMPTY_APP_MEM 6144 // 24M
這些數字也就是對應的內存閾值,一旦低於該值,Android便開始按順序關閉相應等級的進程。
注意這些數字的單位是page: 1 page = 4 kB。所以上面的六個數字對應的就是(MB): 6,8,16,20,22,24。

查看現在的內存閾值設置:
cat /sys/mole/lowmemorykiller/parameters/minfree

要想重新設置該值(對應不同的需求):
echo "1536,2048,4096,5120,15360,23040">/sys/mole/lowmemorykiller/parameters/minfree
這樣當可用內存低於90MB的時候便開始殺死"空進程",而當可用內存低於60MB的時候才開始殺死"內容供應節點"類進程。

具體的回收實現在ActivityManagerService.java中的函數trimApplications():
1.首先移除package已被卸載的無用進程;
2.基於進程當前狀態,更新oom_adj值,然後進行以下操作:
1) 移除沒有activity在運行的進程;
2) 如果AP已經保存了所有的activity狀態,結束這個AP。
3. 最後,如果目前還是有很多activities 在運行,那麼移除那些activity狀態已經保存好的activity。

更新oom_adj的值:
在ActivityManagerService.java文件的ComputeOomAdjLocked() 中計算出進程的oom_adj,例如:
if (app == TOP_APP) {
// The last app on the list is the foreground app.
adj = FOREGROUND_APP_ADJ;
app.adjType = "top-activity";
}

Android kernel中的low memory killer
Android的Low Memory Killer根據需要(當系統內存短缺時)殺死進程釋放其內存,源代碼在kernel/drivers/misc/lowmemorykiller.c中。簡單說,就是尋找一個最合適的進程殺死,從而釋放它佔用的內存。
最合適的進程是:
• oom_adj越大
• 佔用物理內存越多

一旦一個進程被選中,內核會發送SIGKILL信號將之殺死:
for_each_process(p) {
……
if(selected == NULL || p->oomkilladj > selected->oomkilladj ||
(p->oomkilladj == selected->oomkilladj && tasksize > selected_tasksize))
{
selected = p;
}
}
if(selected != NULL) {
force_sig(SIGKILL, selected);
}

查看LRU列表:adb shell mpsys activity
當activitydemo在前台時:
包含Service的進程的優先順序比較高,在computeOomAdjLocked中將其分為了兩小類:
static final int MAX_SERVICE_INACTIVITY = 30*60*1000;
if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
if (adj > SECONDARY_SERVER_ADJ) {
adj = SECONDARY_SERVER_ADJ;
app.adjType = "started-services";
app.hidden = false;
}
}
if (adj > SECONDARY_SERVER_ADJ) {
app.adjType = "started-bg-services";
}
完全讓進程不被kill是不可能的,我們可以通過一些操作,使進程被kill的幾率變小:
1) 提高進程的優先順序:
* 後台操作採用運行於前台的Service形式,因為一個運行著service的進程比一個運行著後台activity的等級高;
* 按back鍵使得進程中的activity在後台運行而不是destory,需重載back按鍵(沒有任何activity在運行的進程優先被殺).
* 依賴於其他優先順序高的進程;

2) 強制修改進程屬性:
* 在進程中設置:setPersistent(true);
* 在Manifest文件中設置(如上)。

Ⅵ android app程序與服務優先順序哪個高

service與application的生命周期有關系的。
在Android中進程按優先順序可以分為五類,優先順序從高到低排列:
前台進程 該進程包含正在與用戶進行交互的界面組件,比如一個Activity。
可視進程 該進程中的組件雖然沒有和用戶交互,但是仍然可以被看到。
服務進程 該進程包含在執行後台操作的服務組件,比如播放音樂的Service。
後台進程 該進程包含的組件沒有與用戶交互,用戶也看不到 Service。
空進程 沒有任何界面組件、服務組件,或觸發器組件。

Android系統是進程託管的,也就是說進程都是由系統來管理,系統會按照特定的算來來回收這些進程。在回收中秉承幾個原則:
1. 盡量延長進程的生命周期,不到必須的情況下不會回收,因為系統回收進程會影響用戶體驗
2. 按優先順序從低到高進行回收
3. 同等優先順序的進程越近使用越晚回收。
通過上面這些解釋,進程過一段時間後是會被回收的,但要遵循上面的這些原則,service和application的生命周期有關,只要進程被回收,那麼它所佔用的所有資源將被回收。

Ⅶ android中的進程優先順序,說法錯誤的是

在Android中進程按優先順序可以分為五類,優先順序從高到低排列:
1.前台進程 該進程包含正在與用戶進行交互的界面組件,比如一個Activity。
2.可視進程 該進程中的組件雖然沒有和用戶交互,但是仍然可以被看到。
3.服務進程 該進程包含在執行後台操作的服務組件,比如播放音樂的Service。
4.後台進程 該進程包含的組件沒有與用戶交互,用戶也看不到 Service。
5.空進程 沒有任何界面組件、服務組件,或觸發器組件。

Ⅷ android進程分為哪5種優先順序順序是怎樣的

Andrid 5個進程及重要優先順序前台進程>可見進程>服務進程>後台進程>空進程,
它們的回收優先順序則反之

Ⅸ android自啟動怎麼優先順序高

進程的優先順序 12); //實例化按鈕對象 Button btnDownload=(Button)findViewById(RMessage); Button btnDownload=(Button)findViewById(R.id.btnDownload); Button btnUpdate=(Button)findViewById(R.id.btnUpdate); //注冊按鈕的單擊事件 btnDownload.setOnClickListener(this); btnUpdate.setOnClickListener(this); } //實現按鈕的單擊時間事件 @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnDownload: //創建對象 MyAsyncTask myAsyncTask=new MyAsyncTask(); myAsyncTask.execute(null);//執行任務 break; case R.id.btnUpdate: break; } } private class MyAsyncTask extends AsyncTask<URL, Integer, String>{ //在UI中執行,更新UI @Override protected void onProgressUpdate(Integer... values) { mProgressBar.setProgress(values[0]); if(values[0]<100){ mTextView.setText("progress="+values[0]+"%"); } } //現在work thread中執行耗時操作 @Override protected String doInBackground(URL... params) { for (int i = 0; i < 100; i++) { publishProgress(i+1);//向onProgressUpdate發送消息 try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } return "download finished"; } //doInBackground結束後,執行本方法,result是doInBackground方法返回的數據 @Override protected void onPostExecute(String result) { mTextView.setText(result); } } } 12.9. 軟體開發術語 12.9.1性能 臨時對象越多,垃圾回收(GC)的頻率越高 GC佔用CPU,CPU被佔用時,無法響應用戶的操作 用戶感覺到卡,影響用戶體驗。 12.9.2資源池 存放一定數量的同樣類型的對象,當程序需要使用時,可以從資源池中獲取,使用完成,收回資源池。 等待下一次被使用。 示例:從資源池中獲取Message對象。 Message msg=Message.obtainMessage(); 提示:若之前沒有創建過Message,則創建給對象。Android系統會在適當時候回收該對象,方便下次取用。 提示:解決性能問題的前提是不能影響功能。

Ⅹ android 設置進程調度優先順序默認值是多少

一個Pad上有很多媒體文件,然後每次開機後的一段時間內,Home Screen的反應都特別慢,有時候還會報出ANR的錯誤。從ANR文件/data/anr/traces.txt分析,發現系統列印的cpu佔有率中,android.process.media佔用非常高。所以懷疑是MediaProvider做文件掃描佔用CPU太多資源導致。
但是我們實際測試的時候,通過top –m 5查看cpu佔有率的時候,發現只要一操作Home,android.process.media進程cpu佔有率就會下降很多。
當時看到這個現象,直觀感覺就是MediaProvider搶佔CPU能力不夠。直接把該現象告訴領導,這個事情也就結了。但是一直沒在代碼中找到依據:總有地方設置進程的優先順序吧??
後來,時間充裕了,想起這個問題。果不其然,在MediaScannerService中,找到答案:
<span style="font-size:24px;">public void run()
{
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND +
Process.THREAD_PRIORITY_L

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:741
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372