1. 程式人生 > >Android 面試題總結之Android 基礎(四)

Android 面試題總結之Android 基礎(四)

Android 面試題總結之Android 基礎Service(四)

在上一章節Android 面試題總結之Android 基礎Broadcast Receiver(三) 我們講了Broadcast Receiver基礎知識。本節主要講解Service相關基礎知識,Service也是我們開發過程中經常使用到。

在閱讀過程中有任何問題,請及時聯絡。如需轉載請註明 fuchenxuan de Blog
本章系《Android 之美 從0到1 – 高手之路》Android基礎Service 總結了Android 開發者面試比較常見的Service相關面試問題。希望對廣大Android 開發者,有所幫助。

Service常見面試題

  1. Service 是否在 main thread 中執行, service 裡面是否 能執行耗時的操作?

    預設情況,如果沒有顯示的指 servic 所執行的程序, Service 和 activity 是運 行在當前 app 所在程序的 main thread(UI 主執行緒)裡面。
    service 裡面不能執行耗時的操作(網路請求,拷貝資料庫,大檔案 )
    特殊情況 ,可以在清單檔案配置 service 執行所在的程序 ,讓 service 在另 外的程序中執行

<service android:name="com.baidu.location.f"
android:enabled="true" android:process=":remote" >
</service>
  1. Activity 怎麼和 Service 繫結,怎麼在 Activity 中啟動自 己對應的 Service?
    Activity 通過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行繫結,當繫結成功的時候 Service 會將代理物件通過回撥 的形式傳給 conn,這樣我們就拿到了 Service 提供的服務代理物件。
    在 Activity 中可以通過 startService 和 bindService 方法啟動 Service。一 般情況下如果想獲取 Service 的服務物件那麼肯定需要通過 bindService()方 法,比如音樂播放器,第三方支付等。如果僅僅只是為了開啟一個後臺任務那麼 可以使用 startService()方法。

  2. Service 的生命週期
    Service 有繫結模式和非繫結模式,以及這兩種模式的混合使用方式。不同 的使用方法生命週期方法也不同。
    非繫結模式:當第一次呼叫 startService 的時候執行的方法依次為 onCreate()、onStartCommand(),當 Service 關閉的時候呼叫 onDestory 方 法。
    繫結模式:第一次 bindService()的時候,執行的方法為 onCreate()、 onBind()解除繫結的時候會執行 onUnbind()、onDestory()。
    上面的兩種生命週期是在相對單純的模式下的情形。我們在開發的過程中還 必須注意 Service 例項只會有一個,也就是說如果當前要啟動的 Service 已經存 在了那麼就不會再次建立該 Service 當然也不會呼叫 onCreate()方法。
    一個 Service 可以被多個客戶進行繫結,只有所有的繫結物件都執行了
    onBind()方法後該 Service 才會銷燬,不過如果有一個客戶執行了 onStart() 方法,那麼這個時候如果所有的 bind 客戶都執行了 unBind()該 Service 也不會 銷燬。

    Service 的生命週期圖如下所示,幫助大家記憶。
    這裡寫圖片描述

  3. 什麼是 IntentService?有何優點?

    我們通常只會使用 Service,可能 IntentService 對大部分同學來說都是第 一次聽說。那麼看了下面的介紹相信你就不再陌生了。如果你還是不瞭解那麼在 面試的時候你就坦誠說沒用過或者不瞭解等。並不是所有的問題都需要回答上來的。
    一、IntentService 簡介
    IntentService 是 Service 的子類,比普通的 Service 增加了額外的功能。
    先看 Service 本身存在兩個問題:
    Service 不會專門啟動一條單獨的程序,Service 與它所在應用位於同一個進
    程中;
    Service 也不是專門一條新執行緒,因此不應該在 Service 中直接處理耗時的
    任務;
    二、IntentService 特徵
    會建立獨立的 worker 執行緒來處理所有的 Intent 請求;
    會建立獨立的 worker 執行緒來處理 onHandleIntent()方法實現的程式碼,無需
    處理多執行緒問題;
    所有請求處理完成後,IntentService 會自動停止,無需呼叫 stopSelf()方法
    停止 Service;
    為 Service 的 onBind()提供預設實現,返回 null;
    為 Service 的 onStartCommand 提供預設實現,將請求 Intent 新增到佇列
    中;
    使用 IntentService
    本人寫了一個 IntentService 的使用例子供參考。該例子中一個
    MainActivity 一個 MyIntentService,這兩個類都是四大元件當然需要在清單 檔案中註冊。這裡只給出核心程式碼:

    MainActivity.java:
    public void click(View view){
    Intent intent = new Intent(this, MyIntentService.class); intent.putExtra("start", "MyIntentService"); startService(intent);
    }
    MyIntentService.java
    public class MyIntentService extends IntentService { private String ex = "";
    private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) { Toast.makeText(MyIntentService.this, "-e " + ex,
    Toast.LENGTH_LONG).show(); }
    };
    public MyIntentService(){ super("MyIntentService");
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) { ex = intent.getStringExtra("start");
    return super.onStartCommand(intent, flags, startId);
    }
    @Override
    protected void onHandleIntent(Intent intent) { /**
    * 模擬執行耗時任務
    * 該方法是在子執行緒中執行的,因此需要用到 handler 跟主執行緒進行通訊 */
    try { Thread.sleep(1000);
    } catch (InterruptedException e) { e.printStackTrace();
    } mHandler.sendEmptyMessage(0); try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
          e.printStackTrace();
      }
    } }
  4. Activity、Intent、Service 是什麼關係

    他們都是 Android 開發中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大元件之一。他倆都是 Context 類的子類 ContextWrapper 的子類, 因此他倆可以算是兄弟關係吧。不過兄弟倆各有各自的本領,Activity 負責使用者 介面的顯示和互動,Service 負責後臺任務的處理。Activity 和 Service 之間可 以通過 Intent 傳遞資料,因此可以把 Intent 看作是通訊使者。

  5. Service 和 Activity 在同一個執行緒嗎?
    對於同一 app 來說預設情況下是在同一個執行緒中的,main Thread (UI Thread)。

  6. Service 裡面可以彈吐司麼
    可以的。彈吐司有個條件就是得有一個 Context 上下文,而 Service 本身就是 Context 的子類,因此在 Service 裡面彈吐司是完全可以的。比如我們在 Service 中完成下載任務後可以彈一個吐司通知使用者。

  7. 什麼是 Service 以及描述下它的生命週期。Service 有哪 些啟動方法,有什麼區別,怎樣停用 Service?
    在 Service 的生命週期中,被回撥的方法比 Activity 少一些,只有 onCreate, onStart, onDestroy,
    onBind 和 onUnbind。
    通常有兩種方式啟動一個 Service,他們對 Service 生命週期的影響是不一樣的。

    1. 通過 startService
      Service 會經歷 onCreate 到 onStart,然後處於執行狀態,stopService
      的時候呼叫 onDestroy 方法。
      如果是呼叫者自己直接退出而沒有呼叫 stopService 的話,Service 會一直
      在後臺執行。
    2. 通過 bindService
      Service 會執行 onCreate,然後是呼叫 onBind,這個時候呼叫者和 Service 繫結在一起。呼叫者退出了,Srevice 就會呼叫 onUnbind->onDestroyed 方 法。
      所謂繫結在一起就共存亡了。呼叫者也可以通過呼叫 unbindService 方法來 停止服務,這時候 Srevice 就會呼叫 onUnbind->onDestroyed 方法。 需要注意的是如果這幾個方法交織在一起的話,會出現什麼情況呢? 一個原則是 Service 的 onCreate 的方法只會被呼叫一次,就是你無論多少次的 startService 又 bindService,Service 只被建立一次。
      如果先是 bind 了,那麼 start 的時候就直接執行 Service 的 onStart 方法,如 果先是 start,那麼 bind 的時候就直接執行 onBind 方法。
      如果 service 執行期間呼叫了 bindService,這時候再呼叫 stopService 的話,service 是不會呼叫 onDestroy 方法的,service 就 stop 不掉了,只能呼叫 UnbindService, service 就會被銷燬
      如果一個 service 通過 startService 被 start 之後,多次呼叫 startService 的 話,service 會多次呼叫 onStart 方法。多次呼叫 stopService 的話,service 只會呼叫一次 onDestroyed 方法。
      如果一個 service 通過 bindService 被 start 之後,多次呼叫 bindService 的話, service 只會呼叫一次 onBind 方法。
      多次呼叫 unbindService 的話會丟擲異常。
  8. 在 service 的生命週期方法 onstartConmand()可不可以執行網路操作?如何在 service 中執行網路操作?
    可以直接在 Service 中執行網路操作,在 onStartCommand()方法中可以執行網路操作

  9. 如何提高service的優先順序?
    Android 系統對於記憶體管理有自己的一套方法,為了保障系統有序穩定的運信,
    系統內部會自動分配,控制程式的記憶體使用。當系統覺得當前的資源非常有限的時候,
    為了保 證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體。
    這樣就能保證真正對使用者有用的程式仍然再執行。如果你的 Service 碰上了這種情況,多半會先被殺掉。
    但如果你增加 Service 的優先順序就能讓他多留一會,
    我們可以用 setForeground(true) 來設定 Service 的優先順序。
    為什麼是 foreground ? 預設啟動的 Service 是被標記為 background,當前執行的 Activity
    一般被標記為 foreground,也就是說你給 Service 設定了 foreground 那麼他就和正在執行的
    Activity 類似優先順序得到了一定的提高。當讓這並不能保證你得 Service
    永遠不被殺掉,只是提高了他的優先順序。

  10. service 如何定時執行?
    當啟動service進行後臺任務的時候,我們一般的 做法是啟動一個執行緒,然後通過sleep方法來控制進行定時的任務,如輪詢操作,訊息推送。這樣容易被系統回收。
    service被回收是我們不能控制的,但是我們可以控制service的重啟活動。在service的onStartCommand
    方法中可以返回一個引數來控制重啟活動
    使用AlarmManager,根據AlarmManager的工作原理,alarmmanager會定時的發出一條廣播,然後在自己的專案裡面註冊這個廣播,重寫onReceive方法,在這個方法裡面啟動一個service,然後在service裡面進行網路的訪問操作,當獲取到新訊息的時候進行推送,同時再設定一個alarmmanager進行下一次的輪詢,當本次輪詢結束的時候可以stopself結束改service。這樣即使這一次的輪詢失敗了,也不會影響到下一次的輪詢。這樣就能保證推送任務不會中斷

  11. Service 的 onStartCommand 方法有幾種返回值?各代表什麼意思?
    有四種返回值,不同值代表的意思如下:
    START_STICKY:如果 service 程序被 kill 掉,保留 service 的狀態為開始狀態,但不保留遞送的 intent 物件。隨 後系統會嘗試重新建立 service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫 onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到 service,那麼引數 Intent 將為 null。
    START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完 onStartCommand 後,服務被異常 kill 掉,系統不會自動重啟該服務。
    START_REDELIVER_INTENT:重傳 Intent。使用這個返回值時,如果在執行完 onStartCommand 後,服務被異 常 kill 掉,系統會自動重啟該服務,並將 Intent 的值傳入。
    **START_STICKY_COMPATIBILITY:**START_STICKY 的相容版本,但不保證服務被 kill 後一定能重啟。

  12. Service 的 onRebind(Intent)方法在什麼情況下會執行?
    如果在 onUnbind()方法返回 true 的情況下會執行,否則不執行。

  13. Activity 呼叫 Service 中的方法都有哪些方式?
    Binder:
    通過 Binder 介面的形式實現,當 Activity 繫結 Service 成功的時候 Activity 會在 ServiceConnection 的類 的 onServiceConnected()回撥方法中獲取到 Service 的 onBind()方法 return 過來的 Binder 的子類,然後通過物件呼叫方法。
    Aidl:
    aidl 比較適合當客戶端和服務端不在同一個應用下的場景。

    Messenger:
    它引用了一個Handler物件,以便others能夠向它傳送訊息(使用mMessenger.send(Message msg)方法)。該類允許跨程序間基於Message的通訊(即兩個程序間可以通過Message進行通訊),在服務端使用Handler建立一個Messenger,客戶端持有這個Messenger就可以與服務端通訊了。一個Messeger不能同時雙向傳送,兩個就就能雙向傳送了

這裡畫了一個粗淺的圖幫助大家理解。這裡寫圖片描述

**BroadCastReceiver**
  1. Service 如何給 Activity 傳送 Message?
    Service 和 Activity 如果想互發 Message 就必須使用使用 Messenger 機制。

    IntentService 適用場景

    • IntentService 內建的是 HandlerThread 作為非同步執行緒,每一個交給 IntentService 的任務都將以佇列的方式逐個被執行到,一旦佇列中有某個任務執行時間過長,那麼就會導致後續的任務都會被延遲處理
    • 正在執行的 IntentService 的程式相比起純粹的後臺程式更不容易被系統殺死,該程式的優先順序是介於前臺程式與純後臺程式之間的

關於Service相關基礎知識點,本章節就先總結到這來。希望對大家有所幫助。

相關推薦

Android 試題總結Android 基礎

Android 面試題總結之Android 基礎Activity(一) 轉眼間畢業好久了,寫程式也很久了,從高中就一直寫到現在好多年了啊,學習了很多東西,把之前整理的資料和知識點慢慢分享出來。這裡主要總結Android可能出的面試的題目比較全面\詳細,持

Android 試題總結Android 基礎

Android 面試題總結之Android 基礎Broadcast Receiver(三) 在上一章節Android 面試題總結之Android 基礎ContentProvider(二) 我們講的ContentProvider和Intent基礎知識。本節

Android 試題總結Android 基礎

Android 面試題總結之Android 基礎(ListView)(五) 前幾篇面試總結中,主要講了Android 的四大元件的相關知識點,希望在大家日常工作中有所幫助,那麼在本節中主要是Android 必不可少的ListView 的相關知識點。Lis

Android 試題總結Android 基礎

Android 面試題總結之Android 基礎Service(四) 在上一章節Android 面試題總結之Android 基礎Broadcast Receiver(三) 我們講了Broadcast Receiver基礎知識。本節主要講解Service相

Android 試題總結Android 基礎

Android 面試題總結之Android 基礎ContentProvider(二) 在上一章節Android 面試題總結之Android 基礎Activity(一) 我們講的Activity基礎知識。有許多朋友反映看著比較亂,我又回去看了看 ,確實很亂

Android 試題總結Android 進階

Android 之美 從0到1 之Android 進階(二) 在上一章節中《Android 之美 從0到1 之Android 進階(一)》中我們已經理解了一些View的基本知識並且知道如何自定義View。那麼本章節將繼續深入理解View,關於View的繪

2018年Android試題含答案--適合中高階

1、Activity生命週期? onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy() 2、Service生命週期? service 啟動方式有兩種,一種是通過

2018年Android試題含答案--適合中高階

2018年Android面試題含答案–適合中高階(上) 轉載 【原連結】新增連結描述 這些面試題是我在今年年初換工作的時候整理,沒有重點。包括java基礎,資料結構,網路,Android相關等等。適合中高階工程師。由於內容過多,將會分為上下兩部分。下部分跳轉連結: https://blog.

Java試題總結Java基礎(三)

  1、JAVA 語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try 塊中可以丟擲異常嗎? 答:Java 通過面向物件的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的介面。在Java 中,每個異常都是一個物件,它是Th

Java基礎總結設計模式

介面卡模式: 我們在開發程式的是時候,我們會寫介面,會寫介面的實現類,但是當介面中的方法很多時,我們則會因為為了使用裡面的一個功能而"被迫"實現介面中的所有方法。這樣的效率是很低的。就算是介面中其他的方法全部空實現,那對於程式碼的冗餘等爺都是很大的。所以介面卡模式是思想是將一個介面轉換成客戶希望

試題總結——JAVA高階工程師

三、面試題基礎總結 1、 JVM結構原理、GC工作機制詳解 答:具體參照:JVM結構、GC工作機制詳解     ,說到GC,記住兩點:1、GC是負責回收所有無任何引用物件的記憶體空間。 注意:垃圾回收回收的是無任何引用的物件佔據的記憶體空間而不是物件本身,2、GC回收

pythonLinux基礎

Linux 終端命令格式⽬標瞭解終端命令格式 知道如何查閱終端命令幫助資訊 終端命令格式[mw_shl_code=applescript,true]command [-options] [parameter][/mw_shl_code]說明:command :命令名,相應功能的英⽂單詞或單詞的縮寫 [

大資料JAVA基礎:集合ArrayList

1.集合的建立1).ArrayList集合看作一個長度可變的陣列2).ArrayList<要儲存元素的資料型別> 變數名 = new ArrayList<要儲存元素的資料型別>();3).集合中儲存的元素,只能為<>括號中指定的資料型別元素

2018年最新JAVA試題總結基礎1

轉自於:https://zhuanlan.zhihu.com/p/39322967   1、JAVA中能建立volatile陣列嗎?volatile能使得一個非原子操作變成原子操作嗎? 回答: 能,Java 中可以建立 volatile 型別陣列,不過只是一個指向陣列的引用,而不是整個陣列。J

android試題總結加強再加強版

在加強版的基礎上又再加強的android應用面試題集 有些補充略顯臃腫,只為學習 1.activity的生命週期。 方法 描述 可被殺死 下一個 在activity第一次被建立的時候呼叫。這裡是你做所有初始化設定的地方──建立檢視、設定佈局、繫結資

Android試題總結執行緒,多執行緒,執行緒池

1.開啟執行緒的三中方式?https://blog.csdn.net/longshengguoji/article/details/41126119(轉)https://blog.csdn.net/u012973218/article/details/51280044(轉)2

Android試題總結加強版

自己總結的最強android應用面試題集 26.如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態? 當你的程式中某一個Activity A 在執行時中,主動或被動地執行另一個新的Activity B  這個時候A會執行 Java程式碼 pu

Java試題總結資料結構、演算法和計算機基礎劉小牛和絲音的愛情故事1

        Java面試題總結之資料結構、演算法和計算機基礎(劉小牛和絲音的愛情故事1)​mp.weixin.qq.com 全文字數: 1703 閱讀時間: 大約6 分鐘 劉小牛是一名Java程式設計師,

Android試題3描寫敘述下Android的系統架構

都是 csdn 進行 功能 驅動程序 libraries sso 封裝 rar 描寫敘述下Android的系統架構: Android系統從下往上分為Linux內核層(linux kerner),執行庫(runtime library),應用程序框架層,

Android 試題總結

src 根據 四大組件 使用 順序 onf 結構 每次 面試 1.Android四大組件以及作用??? Activity:Activity是Android程序與用戶實現交互的窗口,是Android中最重要的一中,它需要保存各界面的狀態,做很多持久化的