導航:首頁 > 操作系統 > Android守護線程

Android守護線程

發布時間:2022-12-20 04:45:45

android 怎麼處理線程安全

UI線程及Android的單線程模型原則當應用啟動,系統會創建一個主線程(main thread)。這個主線程負責向UI組件分發事件(包括繪制事件),也是在這個主線程里,應用和Android的UI組件(components from the Android UI toolkit (components from the android.widget and android.view packages))發生交互。 當App做一些比較重(intensive)的工作的時候,除非合理地實現,否則單線程模型的performance會很poor。特別的是,如果所有的工作都在UI線程,做一些比較耗時的工作比如訪問網路或者資料庫查詢,都會阻塞UI線程,導致事件停止分發(包括繪制事件)。對於用戶來說,應用看起來像是卡住了,更壞的情況是,如果UI線程blocked的時間太長(大約超過5秒),用戶就會看到ANR(application not responding)的對話框。 另外,Andoid UI toolkit並不是線程安全的,所以不能從非UI線程來操縱UI組件。必須把所有的UI操作放在UI線程里,所以Android的單線程模型有兩條原則: 1.不要阻塞UI線程。 2.不要在UI線程之外訪問Android UI toolkit(主要是這兩個包中的組件:android.widget and android.view)。

㈡ 盤點im即時通訊開發中Android後台保活方案

對於IM應用和消息推送服務的開發者來說,在Android機型上的後台保活是個相當頭疼的問題。

老闆一句:「為什麼微信、QQ能收到消息,而你寫的APP卻不行?」,直接讓人崩潰,話說老闆你這APP要是整成微信、APP那麼牛,直接進手機廠商白名單,還要程序員在這瞎忙活?

好了,抱怨歸抱怨,活還得干,不然靠誰養活廣大苦逼的程序員?

正因為Android系統版本的差異,也導致了各種保活黑科技的運行效果大相徑庭,所以本文正好藉此機會,盤點一下當前主流(截止2019年前)的保活黑科技在市面上各版本Android手機上的運行效果,希望能給大家提供一些客觀的參考。

其實Android端APP搞保活的目的倒不是為了干什麼見不得人的壞事(但不排除動機不純的開發者),主要是像IM即時通訊應用和資訊類應用等需要搞後台消息推送、運動類應用需要在後台實時監測用戶的運動數據等,因為現在越來越多的手機廠商為了省電策略考慮,基本上如果你的應用沒有被加入白名單,一旦處於後台就會被系統限制甚至幹掉,但使用APP的用戶才不聽你這些解釋——反正「我」就要你的APP能如期正常運行,開發者也是不得已而為之。

以消息推送為例,當APP處於後台或關閉時,消息推送對於某些應用來說非常有用,比如:

    1)IM即時通訊聊天應用:聊天消息通知、音視頻聊天呼叫等,典型代表有:微信、QQ、易信、米聊、釘釘、Whatsup、Line;

    2)新聞資訊應用:最新資訊通知等,典型代表有:網易新聞客戶端、騰訊新聞客戶端;

    3)SNS社交應用:轉發/關注/贊等通知,典型代表有:微博、知乎;

    4)郵箱客戶端:新郵件通知等,典型代表有:QQ郵箱客戶端、Foxmail客戶端、網易郵箱大師;

    5)金融支付應用:收款通知、轉賬通知等,典型代表有:支付寶、各大銀行的手機銀行等;

      .... ....

在上述的各種應用中,尤其對於用戶接觸最多、最平常的IM聊天應用或新聞資訊來說,保活和消息推送簡直事關APP的「生死」,消息推送這種能力已經被越來越多的APP作為基礎能力之一,因為移動互聯網時代下,用戶的「全時在線」能力非常誘人和強大,能隨時隨地即時地將各種重要信息推送給用戶,無疑是非常有意義的。

題外話:實際上,對於後台消息推送能力,Android原版系統早就內置了系統級推送服務(跟iOS上的APNs服務是一個東西),它就是GCM服務(現在升級為FCM了),但眾所周之的原因,谷哥的服務在國內都是用不了的(你懂的)——無奈啊!

主要黑科技方案有:

    1)監聽廣播:監聽全局的靜態廣播,比如時間更新的廣播、開機廣播、解鎖屏、網路狀態、解鎖加鎖亮屏暗屏(3.1版本),高版本需要應用開機後運行一次才能監聽這些系統廣播,目前此方案失效。可以更換思路,做APP啟動後的保活(監聽廣播啟動保活的前台服務);

    2)定時器、JobScheler:假如應用被系統殺死,那麼定時器則失效,此方案失效。JobService在5.0,5.1,6.0作用很大,7.0時候有一定影響(可以在電源管理中給APP授權);

    3)雙進程(NDK方式Fork子進程)、雙Service守護:高版本已失效,5.0起系統回收策略改成進程組。雙Service方案也改成了應用被殺,任何後台Service無法正常狀態運行;

    4)提高Service優先順序:只能一定程度上緩解Service被立馬回收。 即時通訊聊天軟體app開發可以咨詢蔚可雲。

針對上述方案,具體的實現思路,通常是這樣的:

    1)進程拉活:AIDL方式單進程、雙進程方式保活Service(最極端的例子就是推送廠商的互相喚醒復活:極光、友盟、以及各大廠商的推送,同派系APP廣播互相喚醒:比如今日頭條系、阿里系);

    2)降低oom_adj的值:常駐通知欄(可通過啟動另外一個服務關閉Notification,不對oom_adj值有影響)、使用」1像素「的Activity覆蓋在getWindow()的view上(據傳某不可言說的IM大廠用過這個方案,雖然他們從未正面承認過)、循環播放無聲音頻(黑科技,7.0下殺不掉);

    3)監聽鎖屏廣播:使Activity始終保持前台;

    4)使用自定義鎖屏界面:覆蓋了系統鎖屏界面;

    5)創建子進程:通過android:process屬性來為Service創建一個進程;

    6)白名單:跳轉到系統白名單界面讓用戶自己添加app進入白名單。

使用AIDL綁定方式新建2個Service優先順序(防止服務同時被系統殺死)不一樣的守護進程互相拉起對方,並在每一個守護進程的ServiceConnection的綁定回調里判斷保活Service是否需要重新拉起和對守護線程進行重新綁定。

後台播放音樂這種保活方法,親身經歷過:

記得當時用的是某運動記步APP,它為了保活就是這么乾的。之所以被我發現,是因為在我的Android手機上,每次打開這個APP居然總能莫名其妙聽到若有若無的環境噪音樣的聲音,尤其安靜的場所下更明顯。我個人估計這個APP里用的保活音頻文件,很可能就是程序員在簡陋的條件下隨手自已錄制的,雖然也是不得以為之,但做法確實是有點粗糙。

總結一下,以上方案在當前主流手機上的運行效果

【1】雙進程守護方案(基於onStartCommand() return START_STICKY):

    1)原生5.0、5.1:原生任務欄滑動清理app,Service會被殺掉,然後被拉起,接著一直存活;

    2)金立F100(5.1):一鍵清理直接殺掉整個app,包括雙守護進程。不手動清理情況下,經測試能鎖屏存活至少40分鍾;

    3)華為暢享5x(6.0):一鍵清理直接殺掉整個app,包括雙守護進程。不手動清理下,鎖屏只存活10s。結論:雙進程守護方案失效;

    4)美圖m8s(7.1.1):一鍵清理直接殺掉整個app,包括雙守護進程。不清理情況下,鎖屏會有被殺過程(9分鍾左右被殺),之後重新復活,之後不斷被幹掉然後又重新復活。結論:雙守護進程可在後台不斷拉起Service;

    5)原生7.0:任務欄清除APP後,Service存活。使用此方案後Service照樣存活;

    6)LG V30+(7.1.2):不加雙進程守護的時候,一鍵清理無法殺掉服務。加了此方案之後也不能殺掉服務,鎖屏存活(測試觀察大於50分鍾);

    7)小米8(8.1):一鍵清理直接幹掉app並且包括雙守護進程。不清理情況下,不加守護進程方案與加守護進程方案Service會一直存活,12分鍾左右closed。結論:此方案沒有起作用。

▲ 結論:除了華為此方案無效以及未更改底層的廠商不起作用外(START_STICKY欄位就可以保持Service不被殺)。此方案可以與其他方案混合使用。

【2】監聽鎖屏廣播打開1像素Activity(基於onStartCommand() return START_STICKY):

    1)原生5.0、5.1:鎖屏後3s服務被幹掉然後重啟(START_STICKY欄位起作用);

    2)華為暢享5x(6.0):鎖屏只存活4s。結論:方案失效;

    3)美圖m8s(7.1.1):同原生5.0;

    4)原生7.0:同美圖m8s;

    5)LG V30+(7.1.2):鎖屏後情況跟不加情況一致,服務一致保持運行,結論:此方案不起作用;

    6)小米8(8.1):關屏過2s之後app全部被幹掉。結論:此方案沒有起作用。

▲ 結論:此方案無效果。

【3】故意在後台播放無聲的音樂(基於onStartCommand() return START_STICKY):

    1)原生5.0、5.1:鎖屏後3s服務被幹掉然後重啟(START_STICKY欄位起作用);

    2)華為暢享5x(6.0):一鍵清理後服務依然存活,需要單獨清理才可殺掉服務,鎖屏8分鍾後依然存活。結論:此方案適用;

    3)美圖m8s(7.1.1):同5.0;

    4)原生7.0:任務管理器中關閉APP後服務被幹掉,大概過3s會重新復活(同僅START_STICKY欄位模式)。結論:看不出此方案有沒有其作用;

    5)LG V30+(7.1.2):使用此方案前後效果一致。結論:此方案不起作用;

    6)小米8(8.1):一鍵清理可以殺掉服務。鎖屏後保活超過20分鍾。

▲ 結論:成功對華為手機保活。小米8下也成功突破20分鍾。

【4】使用JobScheler喚醒Service(基於onStartCommand() return START_STICKY):

    1)原生5.0、5.1:任務管理器中幹掉APP,服務會在周期時間後重新啟動。結論:此方案起作用;

    2)華為暢享5x(6.0):一鍵清理直接殺掉APP,過12s左右會自動重啟服務,JobScheler起作用;

    3)美圖m8s(7.1.1):一鍵清理直接殺掉APP,無法自動重啟;

    4)原生7.0:同美圖m8s(7.1.1);

    5)小米8(8.1):同美圖m8s(7.1.1)。

▲ 結論:只對5.0,5.1、6.0起作用。

【5】混合使用的效果,並且在通知欄彈出通知:

    1)原生5.0、5.1:任務管理器中幹掉APP,服務會在周期時間後重新啟動。鎖屏超過11分鍾存活;

    2)華為暢享5x(6.0):一鍵清理後服務依然存活,需要單獨清理才可殺掉服務。結論:方案適用;

    3)美圖m8s(7.1.1):一鍵清理APP會被殺掉。正常情況下鎖屏後服務依然存活;

    4)原生7.0:任務管理器中關閉APP後服務被幹掉,過2s會重新復活;

    5)小米8(8.1):一鍵清理可以殺掉服務,鎖屏下後台保活時間超過38分鍾;

    6)榮耀10(8.0):一鍵清理殺掉服務,鎖屏下後台保活時間超過23分鍾。

㈢ Android 守護進程的實現方式

在我們進行應用開發時,會遇到上級的各種需求,其中有一條 剛需: 後台保活 ,更有甚者:

我要我們的應用永遠活在用戶的手機後台不被殺死 —— 這都 TM 的扯淡

除了系統級別的應用能持續運行,所有三方程序都有被殺死的那一天!當然 QQ/微信/陌陌 等會好一些,因為他們已經深入設備的 心 ;
我們能做的只是通過各種手段盡量讓我們的程序在後台運行的時間長一些,或者在被幹掉的時候,能夠重新站起來,而且這個也不是每次都有效的,也是不能在所有的設備的上都有效的;要做到後台進程保活,我們需要做到兩方便:

要實現實現上邊所說,通過下邊幾點來實現,首先我們需要了解下進程的優先順序劃分:

Process Importance 記錄在 ActivityManager.java 類中:

了解進程優先順序之後,我們還需要知道一個進程回收機制的東西;這里參考 AngelDevil 在博客園上的一篇文章:

Android 的 Low Memory Killer 基於 linux 的 OOM 機制,在 Linux 中,內存是以頁面為單位分配的,當申請頁面分配時如果內存不足會通過以下流程選擇bad進程來殺掉從而釋放內存:

在 Low Memory Killer 中通過進程的 oom_adj 與佔用內存的大小決定要殺死的進程, oom_adj 越小越不容易被殺死;
Low Memory Killer Driver 在用戶空間指定了一組內存臨界值及與之一一對應的一組 oom_adj 值,當系統剩餘內存位於內存臨界值中的一個范圍內時,如果一個進程的 oom_adj 值大於或等於這個臨界值對應的 oom_adj 值就會被殺掉。

下邊是表示 Process State (即老版本里的 OOM_ADJ )數值對照表,數值越大,重要性越低,在新版SDK中已經在 android 層去除了小於0的進程狀態

Process State (即老版本的 OOM_ADJ )與 Process Importance 對應關系,這個方法也是在 ActivityManager.java 類中,有了這個關系,就知道可以知道我們的應用處於哪個級別,對於我們後邊優化有個很好地參考

一般情況下,設備端進程被幹掉有一下幾種情況

由以上分析,我們可以可以總結出,如果想提高我們應用後台運行時間,就需要提高當前應用進程優先順序,來減少被殺死的概率

分析了那麼多,現在對Android自身後台進程管理,以及進程的回收也有了一個大致的了解,後邊我們要做的就是想盡一切辦法去提高應用進程優先順序,降低進程被殺的概率;或者是在被殺死後能夠重新啟動後台守護進程

第一種方式就是利用系統漏洞,使用 startForeground() 將當前進程偽裝成前台進程,將進程優先順序提高到最高(這里所說的最高是服務所能達到的最高,即1);

這種方式在 7.x 之前都是很好用的,QQ、微信、IReader、Keep 等好多應用都是用的這種方式實現;因為在7.x 以後的設備上,這種偽裝前台進程的方式也會顯示出來通知欄提醒,這個是取消不掉的,雖然 Google 現在還沒有對這種方式加以限制,不過這個已經能夠被用戶感知到了,這種方式估計也用不了多久了

下邊看下實現方式,這邊這個 VMDaemonService 就是一個守護進程服務,其中在服務的 onStartCommand() 方法中調用 startForeground() 將服務進程設置為前台進程,當運行在 API18 以下的設備是可以直接設置,API18 以上需要實現一個內部的 Service ,這個內部類實現和外部類同樣的操作,然後結束自己;當這個服務啟動後就會創建一個定時器去發送廣播,當我們的核心服務被幹掉後,就由另外的廣播接收器去接收我們守護進程發出的廣播,然後喚醒我們的核心服務;

當我們啟動這個守護進程的時候,就可以使用以下 adb 命令查看當前程序的進程情況(需要 adb shell 進去設備),
為了等下區分進程優先順序,我啟動了一個普通的後台進程,兩外兩個一個是我們啟動的守護進程,一個是當前程序的核心進程,可以看到除了後台進程外,另外兩個進程都帶有 isForeground=true 的屬性:

然後我們可以用下邊的命令查看 ProcessID

有了 ProcessID 之後,我們可以根據這個 ProcessID 獲取到當前進程的優先順序狀態 Process State ,對應 Linux 層的 oom_adj
可以看到當前核心進程的級別為 0 ,因為這個表示當前程序運行在前台 UI 界面,守護進程級別為 1 ,因為我們利用漏洞設置成了前台進程,雖然不可見,但是他的級別也是比較高的,僅次於前台 UI 進程,然後普通後台進程級別為 4 ;當我們退到後台時,可以看到核心進程的級別變為 1 了,這就是因為我們利用 startForeground() 將進程設置成前台進程的原因,這樣就降低了進程被系統回收的概率了;

可以看到這種方式確實能夠提高進程優先順序,但是在一些國產的設備上還是會被殺死的,比我我測試的時候小米點擊清空最近運行的應用進程就別幹掉了;當把應用加入到設備白名單里就不會被殺死了,微信就是這樣,人家直接裝上之後就已經在白名單里了,我們要做的就是在用戶使用中引導他們將我們的程序設置進白名單,將守護進程和白名單結合起來,這樣才能保證我們的應用持續或者

Android系統在5.x以上版本提供了一個 JobSchele 介面,系統會根據自己實現定時去調用改介面傳遞的進程去實現一些操作,而且這個介面在被強制停止後依然能夠正常的啟動;不過在一些國產設備上可能無效,比如小米;
下邊是 JobServcie 的實現:

我們要做的就是在需要的時候調用 JobSchele 的 schele 來啟動任務;剩下的就不需要關心了, JobSchele 會幫我們做好,下邊就是我這邊實現的啟動任務的方法:

在實現 Service 類時,將 onStartCommand() 返回值設置為 START_STICKY ,利用系統機制在 Service 掛掉後自動拉活;不過這種方式只適合比較原生一些的系統,像小米,華為等這些定製化比較高的第三方廠商,他們都已經把這些給限制掉了;

這種方式在以下兩種情況無效:

事事沒有絕對,萬物總有一些漏洞,就算上邊的那些方式不可用了,後邊肯定還會出現其他的方式;我們不能保證我們的應用不死,但我們可以提高存活率;

其實最好的方式還是把程序做好,讓程序本身深入人心,別人喜歡你了,就算你被幹掉了,他們也會主動的把你拉起來,然後把你加入他們的白名單,然後我們的目的就實現了不是 😁 ~

㈣ Android開發之路-多線程

多線程作為Android開發中相對而言較為高階的知識,其中用到相關的知識點是非常的多,所以在我們需要進行設計或者寫多線程的代碼就必須要進行相對謹慎的處理,這樣就由必要對其要有著比較系統化的認知

我們一般將Android應用分成為兩種:主線程和工作線程;主線程主要是用來進行初始化UI,而工作線程主要是進行耗時操作,例如讀取資料庫,網路連接等

Android系統是以進程為單位來對應用程序資源進行限制,這個問題的可以解釋為:一個進程最多能夠開幾個線程?最好能開幾個?但實則這個是沒有上限這一說,主要是因為資源的限制

Android中關於主線程的理解:Android的主線程是UI線程,在Android中,四大組件運行在主線程中,在主線程中做耗時操作會導致程序出現卡頓甚至出現ANR異常,一個.

在一個程序中,這些獨立運行的程序片斷叫作「線程」(Thread),利用它編程的概念就叫作「多線程處理」。多線程處理一個常見的例子就是用戶界面。

線程總的來就是進程的一個實體,是CPU進行分派和調度的基本單位,擁有著比進程更小且能夠獨立運行的基本單位,線程本身基本上是不擁有系統資源,僅擁有一點在運行過程中必須擁有的資源,但它可與同屬一個進程中的其他進程進行共享其所擁有的所有資源

線程狀態有些地方將之分為5中狀態,而且在Java Jdk中線程被其定義為6中狀態,我們可以對其進行類比

普遍定義的5中狀態:新建,就緒,運行,阻塞, 死亡

Java Jdk 定義狀態

線程阻塞是指在某一時刻的某一個線程在進行運行一段代碼的情況下,突然另一個線程也要進行運行,但在運行過程中,那個線程執行完全運行之前,另一個線程是不可能獲取到CPU的執行權,就會導致線路阻塞的出現

死鎖也稱之為抱死,意思就是說一個進程鎖定了另外一個進程所需要的頁或表是,但第二個進程同時又鎖定了第一個進程所需的一頁,這樣就會出現死鎖現象

簡要介紹實現線程的三種方式:繼承Thread,實現runnable,實現callable。這里有一點需要注意的是,實現callable是與線程池相關聯的而callable很重要的一個特性是其帶有返回值。當我們只需實現單線程時實現runnable更加利於線程程序的拓展

在線程開啟之前進行調用 thread.setDaemon(true); 將thread設定成當前線程中的守護線程 使用案例

線程讓步【yield方法】讓當前線程釋放CPU資源,讓其他線程搶占

這種具體某個對象鎖 wait & notify 方法與Condition 的 await以及signal方法類似; 全面這種方法的阻塞等待都可以是釋放鎖,而且在喚醒後,這種線程都是能夠獲取鎖資源的,而這個門栓就跟閥門類似

㈤ Android保活系列之——雙進程守護

近期跳槽到玩加電競,加之英雄聯盟雲頂之弈排位模式的推出,導致個人精力有限沒有時間和心情去寫相關的博客。

在Context中提供了bindService的方法

綁定服務是客戶端--伺服器介面中的伺服器。組件和服務進行綁定後,可以發送請求、接收響應、執行進程間通信(IPC)。這里的伺服器模型不同於網路C-S模型而是針對於Android應用不同的功能進行進程劃分,例如提供視頻播放的進程我們可以把它當做視頻播放伺服器,我們UI層屬於客戶端,客戶端想要調用視頻播放,需要用IPC方式通過bind服務的方式調用視頻播放服務。(PS:如果大家對IPC不太熟悉可以參考我的其他文章 Android跨進程通信技術的使用及原理 )客戶端可以通過調用bindService()綁定到服務。調用時,必須提供ServiceConnection的實現,後者會監控與服務的連接及銷毀。
藉助bindService的機制,我們可以在主進程創建時創建一個守護進程,並監聽守護進程的連接及銷毀,再守護進程bindService中綁定主進程,這樣即使進程因為鎖屏、內存等問題殺掉後,也會被守護進程拉起,這就是Android中雙進程守護的概念。當然早在PC時期,網吧的計時系統就使用了雙進程守護機制,防止被惡意殺掉。
實現方式就不寫了,網路上一搜一堆,這里給出一篇文章
Android 雙進程守護
寫的中規中矩,如果不清楚如何實現可以看一下。

谷歌官方8.0變更

當版本>8.0時,如果需要在後台啟動服務需要調用startForegroundService。並且在serivce中onCreate方法必須在5秒內調用startForeground ,向通知欄發一個通知告知用戶你的App正在後台運行,否則就會拋出異常

8.0通知適配

保活分兩種:拉活、保活
拉活和保活是相輔相成的。在6.0版本以後的機型上,系統殺應用是按照進程組殺的,會直接導致雙進程守護失效。那麼因此就不使用雙進程了么?
1.低版本雙進程守護是依然親測好使。
2.雙進程守護可以和後面講到的 賬號同步、外部PUSH、JobScheler
相結合,可以規避開系統殺進程組的問題。使雙進程守護功能可以兼容高版本。

講的有些籠統,我尋思的發Dome、寫例子,但這樣解決不了根本問題,只有懂得了思路,了解了什麼是雙進程守護,才能在開發中隨機應變。只能說Android水太深,大家需要細心細心再細心。

㈥ 每個Android 都應必須了解的多線程知識點~

進程是系統調度和資源分配的一個獨立單位。

在Android中,一個應用程序就是一個獨立的集成,應用運行在一個獨立的環境中,可以避免其他應用程序/進程的干擾。當我們啟動一個應用程序時,系統就會創建一個進程(該進程是從Zygote中fork出來的,有獨立的ID),接著為這個進程創建一個主線程,然後就可以運行MainActivity了,應用程序的組件默認都是運行在其進程中。開發者可以通過設置應用的組件的運行進程,在清單文件中給組件設置:android:process = "進程名";可以達到讓組件運行在不同進程中的目的。讓組件運行在不同的進程中,既有好處,也有壞處。我們依次的說明下。

好處:每一個應用程序(也就是每一個進程)都會有一個內存預算,所有運行在這個進程中的程序使用的總內存不能超過這個值,讓組件運行不同的進程中,可以讓主進程可以擁有更多的空間資源。當我們的應用程序比較大,需要的內存資源比較多時(也就是用戶會抱怨應用經常出現OutOfMemory時),可以考慮使用多進程。

壞處:每個進程都會有自己的虛擬機實例,因此讓在進程間共享一些數據變得相對困難,需要採用進程間的通信來實現數據的共享。

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。

在Android中,線程會有那麼幾種狀態:創建、就緒、運行、阻塞、結束。當應用程序有組件在運行時,UI線程是處於運行狀態的。默認情況下,應用的所有組件的操作都是在UI線程里完成的,包括響應用戶的操作(觸摸,點擊等),組件生命周期方法的調用,UI的更新等。因此如果UI線程處理阻塞狀態時(在線程里做一些耗時的操作,如網路連接等),就會不能響應各種操作,如果阻塞時間達到5秒,就會讓程序處於ANR(application not response)狀態。

1.線程作用

減少程序在並發執行時所付出的時空開銷,提高操作系統的並發性能。

2.線程分類

守護線程、非守護線程(用戶線程)

2.1 守護線程

定義:守護用戶線程的線程,即在程序運行時為其他線程提供一種通用服務
常見:如垃圾回收線程
設置方式:thread.setDaemon(true);//設置該線程為守護線程

2.2 非守護線程(用戶線程)

主線程 & 子線程。

2.2.1 主線程(UI線程)

定義:Android系統在程序啟動時會自動啟動一條主線程
作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關)
因為用戶隨時會與界面發生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現ANR。

2.2.2 子線程(工作線程)

定義:手動創建的線程
作用:耗時的操作(網路請求、I/O操作等)

2.3 守護線程與非守護線程的區別和聯系

區別:虛擬機是否已退出,即
a. 當所有用戶線程結束時,因為沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出
b. 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出

3.線程優先順序

3.1 表示

線程優先順序分為10個級別,分別用Thread類常量表示。

3.2 設置

通過方法setPriority(int grade)進行優先順序設置,默認線程優先順序是5,即 Thread.NORM_PRIORITY。

4.線程狀態

創建狀態:當用 new 操作符創建一個線程的時候

就緒狀態:調用 start 方法,處於就緒狀態的線程並不一定馬上就會執行 run 方法,還需要等待CPU的調度

運行狀態:CPU 開始調度線程,並開始執行 run 方法

阻塞(掛起)狀態:線程的執行過程中由於一些原因進入阻塞狀態,比如:調用 sleep/wait 方法、嘗試去得到一個鎖等

結束(消亡)狀態:run 方法執行完 或者 執行過程中遇到了一個異常

(1)start()和run()的區別

通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。調用Thread類調用run()方法來完成其運行操作的,方法run()稱為線程體,它包含了要執行的這個線程的內容,run()運行結束,此線程終止,然後CPU再調度其它線程。

(2)sleep()、wait()、yield()的區別

sleep()方法屬於Thread類,wait()方法屬於Object類。
調用sleep()方法,線程不會釋放對象鎖,只是暫停執行指定的時間,會自動恢復運行狀態;調用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池,不調用notify()方法,線程永遠處於就緒(掛起)狀態。

yield()直接由運行狀態跳回就緒狀態,表示退讓線程,讓出CPU,讓CPU調度器重新調度。禮讓可能成功,也可能不成功,也就是說,回到調度器和其他線程進行公平競爭。

1.Android線程的原則

(1)為什麼不能再主線程中做耗時操作
防止ANR, 不能在UI主線程中做耗時的操作,因此我們可以把耗時的操作放在另一個工作線程中去做。操作完成後,再通知UI主線程做出相應的響應。這就需要掌握線程間通信的方式了。 在Android中提供了兩種線程間的通信方式:一種是AsyncTask機制,另一種是Handler機制。

(2)為什麼不能在非UI線程中更新UI 因為Android的UI線程是非線程安全的,應用更新UI,是調用invalidate()方法來實現界面的重繪,而invalidate()方法是非線程安全的,也就是說當我們在非UI線程來更新UI時,可能會有其他的線程或UI線程也在更新UI,這就會導致界面更新的不同步。因此我們不能在非UI主線程中做更新UI的操作。

2.Android實現多線程的幾種方式

3.為何需要多線程

多線程的本質就是非同步處理,直觀一點說就是不要讓用戶感覺到「很卡」。

4.多線程機制的核心是啥

多線程核心機制是Handler

推薦Handler講解視頻: 面試總被問到Handler?帶你從源碼的角度解讀Handler核心機制

根據上方提到的 多進程、多線程、Handler 問題,我整理了一套 Binder與Handler 機制解析的學習文檔,提供給大家進行學習參考,有需要的可以 點擊這里直接獲取!!! 裡面記錄許多Android 相關學習知識點。

㈦ android kill哪些進程可以重啟

2個service , A = service 被幹掉的時候,開啟另外一個 b = service, B 被幹掉,開始 A =service; service生命周期裡面有destroy()把,在裡面開啟另外一個守護線程 查看原帖>>

㈧ android守護進程

Android中應該使用Service而不應該使用線程,Android中有提供後台運行的組件,叫Service。

servie是系統的組件,它由系統進程託管(servicemanager);它們之間的通信類似於client和server,是一種輕量級的ipc通信,這種通信的載體是binder,它是在linux層交換信息的一種ipc。而thread是由本應用程序託管。

  1. Thread:Thread是程序執行的最小單元,它是分配CPU的基本單位。可以用Thread來執行一些非同步的操作。

  2. Service:Service是android的一種機制,當它運行的時候如果是Local Service,那麼對應的Service是運行在主進程的main線程上的。如:onCreate,onStart這些函數在被系統調用的時候都是在主進程的main線程上運行的。如果是RemoteService,那麼對應的Service則是運行在獨立進程的main線程上。


關於用戶線程和守護線程:

在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程)

Daemon的作用是為其他線程的運行提供便利服務,比如垃圾回收線程就是一個很稱職的守護者。User和Daemon兩者幾乎沒有區別,唯一的不同之處就在於虛擬機的離開:如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,虛擬機也就退出了。 因為沒有了被守護者,Daemon也就沒有工作可做了,也就沒有繼續運行程序的必要了。

㈨ 如何debug自定義AbstractProcessor

在開發時,你可能對如何調試自己的AbstractProcessor有些一籌莫展。本文將介紹如何使用Android Studio和gradle來調試你自己的AbstractProcessor。

第一步,在你代碼中對init()方法或process()方法設置代碼斷點!

設置斷點

第二步,設置gradle daemon埠和JVM參數。把下面兩行加入到你的gradle.properties文件。我的gradle.properties文件在哪裡?
org.gradle.daemon=true
org.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
在命令行中運行gradle daemon來啟動守護線程。
gradle --daemon
第三步,在Android Studio建立Remote Debugger並運行它。

Remote Debugger 配置

我們在這里使用默認設置,IP:localhost,埠:5005。一旦你完成並運行它,那它就會連接到daemon線程中了。
最後我們用gradle命令來運行構建。
gradle clean assembleDebug
既然我們已經啟動了守護線程,Remote Debugger將觸發斷點並掛起構建運行。完成!

㈩ Android 初學者 關於app關閉service一直運行 求各位指點迷津

  1. Android5.0之前可以用雙守護進程 fork一個子進程來守護主進程

  2. 白名單,微信QQ等等之所以能夠存活,是因為系統商給了騰訊白名單,你調用清理內存時,並沒有真正的清理

閱讀全文

與Android守護線程相關的資料

熱點內容
公式保護後加密不了 瀏覽:82
java跳轉到jsp 瀏覽:819
327平方根演算法 瀏覽:216
win7美化命令行終端 瀏覽:797
免加密狗圖片 瀏覽:485
一隻透明的鳥是什麼app 瀏覽:817
空氣壓縮機油批發商 瀏覽:69
linuxifexist 瀏覽:4
加密tf卡拷入文件 瀏覽:399
山西php工資 瀏覽:673
福州看病預約用什麼小程序app 瀏覽:238
php保留兩位小數不四捨五入 瀏覽:292
黑馬程序員路徑大全 瀏覽:1000
saas平台PHP 瀏覽:333
雲伺服器科學計算配置怎麼選 瀏覽:649
jar解壓命令 瀏覽:609
php正則問號 瀏覽:299
無線已加密不可上網是怎麼了 瀏覽:465
什麼app可以免費做手機 瀏覽:376
異性下載什麼app 瀏覽:682