Android 面試題--Service

来源:http://www.cnblogs.com/wuyudong/archive/2016/10/14/5960325.html
-Advertisement-
Play Games

1、Service 是否在 main thread 中執行, service 裡面是否能執行耗時的操作?預設情況,如果沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)裡面。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>

2、Activity 怎麼和 Service 綁定,怎麼在 Activity 中啟動自己對應的Service?
Activity 通過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行綁定,當綁定成功的時候 Service 會將代理對象通過回調的形式傳給 conn,這樣我們就拿到了Service 提供的服務代理對象。
在 Activity 中可以通過 startService 和 bindService 方法啟動 Service。一般情況下如果想獲取Service 的服務對象那麼肯定需要通過 bindService()方法,比如音樂播放器,第三方支付等。如果僅僅只是為了開啟一個後臺任務那麼可以使用 startService()方法。

3、請描述一下 Service 的生命周期
Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不同的使用方法生命周期方法也不同。
非綁定模式:當第一次調用 startService 的時候執行的方法依次為 onCreate() 、onStartCommand(),當 Service 關閉的時候調用 onDestory 方法。
綁定模式:第一次 bindService()的時候,執行的方法為 onCreate()、onBind()解除綁定的時候會執行 onUnbind()、onDestory()。

service的生命周期,從它被創建開始,到它被銷毀為止,可以有兩條不同的路徑:

A started service:被開啟的service通過其他組件調用 startService()被創建。這種service可以無限地運行下去,必須調用stopSelf()方法或者其他組件調用stopService()方法來停止它。當service被停止時,系統會銷毀它。

A bound service:被綁定的service是當其他組件(一個客戶)調用bindService()來創建的。客戶可以通過一個IBinder介面和service進行通信。

客戶可以通過 unbindService()方法來關閉這種連接。一個service可以同時和多個客戶綁定,當多個客戶都解除綁定之後,系統會銷毀service。

這兩條路徑並不是完全分開的。即是說,你可以和一個已經調用了 startService()而被開啟的service進行綁定。

比如,一個後臺音樂service可能因調用 startService()方法而被開啟了,稍後,可能用戶想要控制播放器或者得到一些當前歌曲的信息,可以通過bindService()將一個activity和service綁定。這種情況下,stopService()或 stopSelf()實際上並不能停止這個service,除非所有的客戶都解除綁定。

Service 的生命周期圖如下所示,幫助記憶

4、什麼是 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 添加到隊列中;
5、說說 Activity、Intent、Service 是什麼關係

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

6、Service 和 Activity 在同一個線程嗎

對於同一 app 來說預設情況下是在同一個線程中的,main Thread (UI Thread)。

7、Service 裡面可以彈吐司麽

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

8、什麼是 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 的話會拋出異常。

9、在 service 的生命周期方法 onstartConmand()可不可以執行網路操作?如何在 service 中執行網路操作?

可以直接在 Service 中執行網路操作,在 onStartCommand()方法中可以執行網路操作


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 讓前端程式更具可維護性,是一個老生常談的問題,大多數時候我們都關註於應用層面的代碼可維護性,如:OO、模塊化、MVC,編碼規範、可擴展和復用性,但這都是屬於設計層面需要考慮的事情,可維護性還應包含另一個方面,也是很多coder容易忽略的地方,就是將自己寫的程式以文檔的形式沉澱起來,對自己工作有一個結 ...
  • Android系統下的基本數據存儲形式,文件存儲、sp存儲、資料庫存儲、網路存儲、Content Provider記憶體提供者 ...
  • 一.使用HttpURLConnection提交數據 "get"請求 代碼: String path = "http://地址?數據1名字=" + URLEncoder.encode(數據1,"utf-8") + "&數據2名字=" +URLEncoder.encode(數據2,"utf-8"); U ...
  • 記憶體錯誤crash現場: Thread堆棧: 有可能是訪問被釋放對象造成,根據現場並不能找到具體哪個對象出現記憶體錯誤。 1.開啟僵屍對象調試 Edit Scheme->Debug->Diagnostics->Enable Zombie Objects 2.閃退後查看控制台,看輸出應該是某個Butto ...
  • 1、Handler 機制 Android 中主線程也叫 UI 線程,那麼從名字上我們也知道主線程主要是用來創建、更新 UI 的,而其他耗時操作,比如網路訪問,或者文件處理,多媒體處理等都需要在子線程中操作,之所以在子線程中操作是為了保證 UI 的流暢程度,手機顯示的刷新頻率是 60Hz,也就是一秒鐘 ...
  • 試試這個,能解決國內訪問Google伺服器的困難啟動 Android SDK Manager ,打開主界面,依次選擇「Tools」、「Options...」,彈出『Android SDK Manager - Settings』視窗;在『Android SDK Manager - Settings』窗 ...
  • 在項目中日期的顯示經常會當天的顯示時分,當月的顯示日時和分,以此類推,難免會涉及到日期的比較,下麵介紹一下日期比較的兩種方法 比較日期有兩種方法 一種是通過系統的NSCalendar類實現 NSString * date = @"2016-10-12 13:12:12"; //創建日期格式 NSDa ...
  • // 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。 package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...