當前位置:首頁 » 安卓系統 » androidservice線程的區別

androidservice線程的區別

發布時間: 2022-04-29 10:40:58

㈠ Android中線程與線程,進程與進程之間如何通信

使用handler發送message,消息隊列排隊

進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。

㈡ android activity 中的 service 方法是否非同步執行拜託各位大神

非同步執行
android中,activity、service都是在主線程,service與activity的主要區別就是service沒有前台界面,不能直接與用戶交互,另外可以相對保證不會被系統隨便的kill掉。所以service適用於一些無需交互的後台操作,但如果你直接在service中進行耗時操作的話,因為在主線程所以依然會出現和activity主線程一樣的超時的問題,所以好的方式是在service中啟動其他的線程去執行耗時操作。

㈢ Android中的Service到底起什麼作用

Service 是android的一種機制,當它運行的時候如果是Local Service,那麼對應的 Service 是運行在主進程的 main 線程上的。如:onCreate,onStart 這些函數在被系統調用的時候都是在主進程的 main 線程上運行的。如果是Remote Service,那麼對應的 Service 則是運行在獨立進程的 main 線程上。因此請不要把 Service 理解成線程,它跟線程半毛錢的關系都沒有!

既然這樣,那麼我們為什麼要用 Service 呢?其實這跟 android 的系統機制有關,我們先拿 Thread 來說。Thread 的運行是獨立於 Activity 的,也就是說當一個 Activity 被 finish 之後,如果你沒有主動停止 Thread 或者 Thread 里的 run 方法沒有執行完畢的話,Thread 也會一直執行。因此這里會出現一個問題:當 Activity 被 finish 之後,你不再持有該 Thread 的引用。另一方面,你沒有辦法在不同的 Activity 中對同一 Thread 進行控制。

舉個例子:如果你的 Thread 需要不停地隔一段時間就要連接伺服器做某種同步的話,該 Thread 需要在 Activity 沒有start的時候也在運行。這個時候當你 start 一個 Activity 就沒有辦法在該 Activity 裡面控制之前創建的 Thread。因此你便需要創建並啟動一個 Service ,在 Service 裡面創建、運行並控制該 Thread,這樣便解決了該問題(因為任何 Activity 都可以控制同一 Service,而系統也只會創建一個對應 Service 的實例)。

因此你可以把 Service 想像成一種消息服務,而你可以在任何有 Context 的地方調用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,來控制它,你也可以在 Service 里注冊 BroadcastReceiver,在其他地方通過發送 broadcast 來控制它,當然這些都是 Thread 做不到的。

㈣ Android中service和子線程的用處比較

比如:程序的進程關了 service還在運行 但線程沒有 。當你要做個在APP沒運行的情況下 還能給你各種提示(消息推送什麼的)就可以開個服務
網路下載圖片什麼的 就開個線程 因為耗時的程序段是不能阻塞到ui線程(主線程)的

㈤ Android進程和線程的區別

Android進程和線程的區別

下面我先介紹下Android進程和線程各是什麼,然後再一一比較區別下

  1. Android進程基本知識:

    當一個程序第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。默認的情況下,所有該程序的組件都將在該進程和線程中運行。 同時,Android會為每個應用程序分配一個單獨的LINUX用戶。Android會盡量保留一個正在運行進程,只在內存資源出現不足時,Android會嘗試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。

    我們可以將一些組件運行在其他進程中,並且可以為任意的進程添加線程。組件運行在哪個進程中是在manifest文件里設置的,其中<Activity>,<Service>,<receiver>和<provider>都有一個process屬性來指定該組件運行在哪個進程之中。我們可以設置這個屬性,使得每個組件運行在它們自己的進程中,或是幾個組件共同享用一個進程,或是不共同享用。<application>元素也有一個process屬性,用來指定所有的組件的默認屬性。


    Android中的所有組件都在指定的進程中的主線程中實例化的,對組件的系統調用也是由主線程發出的。每個實例不會建立新的線程。對系統調用進行響應的方法——例如負責執行用戶動作的View.onKeyDown()和組件的生命周期函數——都是運行在這個主線程中的。這意味著當系統調用這個組件時,這個組件不能長時間的阻塞主線程。例如進行網路操作時或是更新UI時,如果運行時間較長,就不能直接在主線程中運行,因為這樣會阻塞這個進程中其他的組件,我們可以將這樣的組件分配到新建的線程中或是其他的線程中運行。

    Android會根據進程中運行的組件類別以及組件的狀態來判斷該進程的重要性,Android會首先停止那些不重要的進程。按照重要性從高到低一共有五個級別:


    1.1前台進程

    前台進程是用戶當前正在使用的進程。只有一些前台進程可以在任何時候都存在。他們是最後一個被結束的,當內存低到根本連他們都不能運行的時候。一般來說, 在這種情況下,設備會進行內存調度,中止一些前台進程來保持對用戶交互的響應。

    1.2可見進程

    可見進程不包含前台的組件但是會在屏幕上顯示一個可見的進程是的重要程度很高,除非前台進程需要獲取它的資源,不然不會被中止。

    1.3服務進程

    運行著一個通過startService() 方法啟動的service,這個service不屬於上面提到的2種更高重要性的。service所在的進程雖然對用戶不是直接可見的,但是他們執行了用戶非常關注的任務(比如播放mp3,從網路下載數據)。只要前台進程和可見進程有足夠的內存,系統不會回收他們。


    1.4後台進程

    運行著一個對用戶不可見的activity(調用過 onStop() 方法).這些進程對用戶體驗沒有直接的影響,可以在服務進程、可見進程、前台進 程需要內存的時候回收。通常,系統中會有很多不可見進程在運行,他們被保存在LRU (least recently used) 列表中,以便內存不足的時候被第一時間回收。如果一個activity正 確的執行了它的生命周期,關閉這個進程對於用戶體驗沒有太大的影響。


    1.5空進程

    未運行任何程序組件。運行這些進程的唯一原因是作為一個緩存,縮短下次程序需要重新使用的啟動時間。系統經常中止這些進程,這樣可以調節程序緩存和系統緩存的平衡。


  2. 單線程模型

    線程在代碼是使用標準的java Thread對象來建立,那麼在Android系統中提供了一系列方便的類來管理線程——Looper用來在一個線程中執行消息循環,Handler用來處理消息,HandlerThread創建帶有消息循環的線程。具體可以看下面的詳細介紹。

    當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。

    在開發Android應用時必須遵守單線程模型的原則: Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。


2.1 子線程更新UI Android的UI是單線程(Single-threaded)的。

為了避免拖住GUI,一些較費時的對象應該交給獨立的線程去執行。如果幕後的線程來執行UI對象,Android就會發出錯誤訊息 。以後遇到這樣的異常拋出時就要知道怎麼回事了!

2.2 Message Queue

在單線程模型下,為了解決類似的問題,Android設計了一個Message Queue(消息隊列), 線程間可以通過該Message Queue並結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:


2..3 Message 消息

理解為線程間交流的信息,處理數據後台線程需要更新UI,則發送Message內含一些數據給UI線程。

2.4. Handler 處理者

是Message的主要處理者,負責Message的發送,Message內容的執行處理。後台線程就是通過傳進來的Handler對象引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message) 方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。


2.5. Message Queue 消息隊列

用來存放通過Handler發布的消息,按照先進先出執行。 每個message queue都會有一個對應的Handler。Handler會向message queue通過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但通過這兩種方法發送的消息執行的方式略有不同:通過sendMessage發送的是一個message對象,會被Handler的handleMessage()函數處理;而通過post方法發送的是一個runnable對象,則會自己執行。

2.6 Looper Looper是每條線程里的Message Queue的管家。

Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)建立Message Queue,但在子線程里並沒有建立Message Queue。所以調用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調用Looper.myLooper()得到當前線程的Looper就有可能為NULL。


從以上幾點,不難看出Android進程和線程的二者的區別所在。

㈥ android-Service和Thread的區別

  1. Service 是 Android 中四大組件之一,在 Android 開發中起到非常重要的作用。
    Service(服務)是一個沒有用戶界面的在後台運行執行「耗時操作」的應用組件。其
    他應用組件能夠啟勱 Service,並且當用戶切換到另外的應用場景,Service 將持續在
    後台運行。另外,一個組件能夠綁定到一個 service 與之交互(IPC 機制),例如,一
    個 service 可能會處理網路操作,播放音樂,操作文件 I/O 戒者不內容提供者
    (content provider)交互,所有這些活動都是在後台進行。

  2. 關鍵它是有生命周期。

  3. service用法:

    (1)創建一個類繼承service

    (2)在清單文件中去注冊

    (3)開始使用


Thread簡介:



1.由於線程是依賴進程而存在的,所以我們應該先創建一個進程出來。但是進程是由系統創建的,所以我們需要調用系統功能創建一個進程。但是Java不具備直接調用系統功能的能力,所以,我們沒辦法直接實現多線程程序。

然而,Java可以直接去調用C/C++寫好的程序來實現多線程程序。再由C/C++去調用系統功能創建進程,然後由Java去調用這樣的東西。所以,Java提供能實現多線程的底層類庫。例如:Thread類。

2.生命周期:任何線程(包括主線程:main線程)在其生命周期中,都有5中狀態:創建、就緒、運行、阻塞、終止。

3.多線程實現:

(1)實現線程的方式一:

1.自定義一個類 ,繼承Thread類

2.自定義類中重寫Thread的run方法

3.創建自定義類對象

4.啟動線程

(2)實現線程的方式二:

實現Runnable介面:

1.自定義類實現Runnable介面

2.在自定義類中實現run方法

3.創建自定義類對象

4.創建Thread類對象,並且將自定義類中的對象當做構造參數傳遞

5.啟動線程

㈦ 既然android service是運行在主線程中的,那service還有什麼用

你沒有將android 組件和android C/S架構的概念理解清楚,不僅沒有理解清楚,還把組件的概念,跟線程、進程混淆在一起了。 我將android比喻成一棟辦公大樓,android 中進程就是一個辦公室,線程就是辦公室裡面的員工,辦公室是不能幹活的,而真正幹活的是這個辦公室裡面的員工。一個員工只能在一個辦公室裡面幹活,而一個辦公室可以有很多員工。 Android的老闆希望它的公司能辦理的井井有條,於是針對每一種職能專門設立管理部門,例如WMS,負責窗口管理的,例如MPS,負責多媒體播放的。 一個部門可以有一個或多個辦公室,一個辦公室也可以有多個部門。 而android的管理部門往往是不幹什麼實事的,就像我們的天朝的猿類,你推它一下,它才動一下。所以android需要一些干實事的部門,做對外客戶的,這些部門我們統稱為apk。Android中有好多這種部門,於是為了防止這些部門瞎干,又把部門分成Activity、Service、BrocastReceiver、ContentProvider四種子部門,這些子部門就是用來跟其它部門做溝通的,而所有的子部門運作時都會由大管家AMS來記錄在案。 Activity,做門面的。 Service,做對外支持的。 BrocastReceiver,做門衛收信的。 ContentProvider,做倉庫管理的。 做門面的,可以做對外支持的活,也可以做倉庫管理的活。但是外面可不這么認為,它想找你要數據,只會找ContentProvier,找對外支持只會找Service。 另外AMS大管家有個不好的習慣,它為了節省公司的資源,AMS那裡沒有你這個apk任何部門運行記錄的時候,它有可能把你的電關了(殺進程)。 而LZ你描述的問題呢,就是你的部門想下載東西,是由Activity子部門去干呢,還是Service去干。

㈧ android 主線程和子線程有什麼區別

本文較為深入的分析了android中UI主線程與子線程。分享給大家供大家參考。具體如下:
在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。
一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。
那麼,UI Thread如何和其他Thread一起工作呢?常用方法是:誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發主線程的handlerMessage()函數,讓主線程知道子線程的狀態,並在主線程更新UI。
例如,在子線程的狀態發生變化時,我們需要更新UI。如果在子線程中直接更新UI,通常會拋出下面的異常:
11-07 13:33:04.393: ERROR/JavaBinder(1029):android.view.ViewRoot$:Only the original thread that created a view hierarchy can touch its views.
意思是,無法在子線程中更新UI。為此,我們需要通過Handler物件,通知主線程Ui Thread來更新界面。
如下,首先創建一個Handler,來監聽Message的事件:

private final int UPDATE_UI = 1;
private Handler mHandler = new MainHandler();

private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}

或者:

private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_UI: {
Log.i("TTSDeamon", "UPDATE_UI");
showTextView.setText(editText.getText().toString());
ShowAnimation();
break;
}
default:
break;
}
}
}

當子線程的狀態發生變化,則在子線程中發出Message,通知更新UI。

mHandler.sendEmptyMessageDelayed(UPDATE_UI, 0);

在我們的程序中,很多Callback方法有時候並不是運行在主線程當中的,所以如果在Callback方法中更新UI失敗,也可以採用上面的方法。

㈨ android 非同步方法和子線程方法有什麼區別

子線程沒有控制並發數量,當並發過多的時候非同步方法的作用就體現出來了。

非同步是相對於同步而言的,顧名思義,同步就是各個通訊節點之間有統一的時鍾,按照相同的時鍾工作,非同步相反,各節點之間沒有統一的時鍾,每個節點按照自己內部的時鍾工作。
android在所有Thread當中,有一個Thread,我們稱之為UI Thread。UI
Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main
Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI
Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。

㈩ android的service是和activity同線程嗎

  1. 首先activity是android的四大組件之一,我們看到的APP界面其實就是activity,所以activity是運行在主線程中的

  2. 其次service跟activity一樣,也是android的四大組件之一,主要實現不需要界面,在後台執行的耗時操作,但是他和activity一樣,運行在同一個進程,如果結束當前activity所在進程,service也同樣會結束,因此他們兩個是運行在同一個進程中的,但不是同一個線程,service是用來處理耗時操作的,而且不需要界面支持,既然是耗時操作,就需要放在子線程中了,所以說service和activity需要在不同的線程中

  3. 解決方法,如果想讓service運行在不同線程中可以使用Thread,也可以使用handle,使service運行在中的耗時操作運行在子線程中

  4. 或者在Manifest文件中為service設置android:process,如下圖,此時service是運行在「包名+:remote」進程裡面,注意:此時service和activity是在不同的進程裡面,當然,此時的activity結束後,也不會影響到service

  5. 我們還可以使用intentservice這個抽象類,我們可以繼承實現它裡面的方法,intentservice是直接運行在子線程裡面的,可以直接在這里實現耗時操作

熱點內容
按鍵精靈滑鼠腳本 發布:2024-03-29 06:47:41 瀏覽:19
pythonhome 發布:2024-03-29 06:47:36 瀏覽:169
dns配置錯誤怎麼修理 發布:2024-03-29 06:36:15 瀏覽:980
電信客戶6位密碼是什麼 發布:2024-03-29 06:35:42 瀏覽:565
b星演算法找門 發布:2024-03-29 06:27:13 瀏覽:774
小數化分數c語言 發布:2024-03-29 06:20:16 瀏覽:561
如何搭建ai伺服器 發布:2024-03-29 06:20:10 瀏覽:493
用低配置手機玩游戲掉幀怎麼辦 發布:2024-03-29 06:20:06 瀏覽:588
安卓系統的微信如何安裝 發布:2024-03-29 05:48:45 瀏覽:993
銀行密碼泄露應該辦理什麼手續 發布:2024-03-29 05:01:40 瀏覽:522