1. 程式人生 > >Android面試集錦之Service(知識整理)

Android面試集錦之Service(知識整理)

本文主要講解兩個部分:
一、service的應用場景,以及和Thread的區別
二、開啟service的兩種方式以及區別

第一部分又可以分為:
Service基礎:
1.Service是什麼?
Service是一種可以在後臺執行長時間執行操作而沒有使用者介面的應用元件。

可以進行一些長時間的邏輯操作,使用者並不會看到相關介面,必須的時候可以在app退出後,仍保持一段時間。(所以現在Service保活是必須要掌握的了)
需要注意的是:
Service和廣播都有一個共同點,都是執行在主執行緒中的,都不能進行耗時操作

2.Service和Thread的區別
1.Thread執行是相對獨立的,而本地Service是依附於主執行緒的
2.其實Thread和Service是沒有任何關係的!就像老婆餅跟老婆有關係嗎?我昨天剛吃了一個老婆餅,那咋不給我個老婆呢?
這裡寫圖片描述


之所以把兩者聯絡在一起,理解問題,總覺得Service是服務是用來進行耗時操作的!不要把後臺和子執行緒聯絡在一起!android的後臺是指即使頁面退出了,app退出了,也照樣進行服務的。
若是Service要進行耗時操作,那麼也要開啟子執行緒。

第二部分:
開啟service有兩種方式:
一.startService:
通過在activity呼叫此方法建立的service,一旦服務開始,就會在後期無限執行,即使activity銷燬了,照樣執行,除非手動銷燬。
首先說一下service的生命週期:
① onbind():
這個是第二種方式bindService中才用到的,startService中可以直接返回null
②oncreate():
在onbind和onstartcommand之前呼叫,首次建立服務時呼叫,如果服務已在執行,就不會走這個方法,該方法只調用一次
③onstartcommand():
每次通過startServic()方法啟動Service是都會被回撥
④ondestroy():
服務銷燬時呼叫

使用步驟:
1.定義一個類繼承Service
2.在Manifest.xml檔案中配置該Service
3.使用Context的startService(intent)
4. 不再使用時,呼叫stopService(intent)
二、bindService
服務和Activity處於繫結狀態,允許service和activity進行資料互動,service處於不同程序中時,可以通訊。這種service只有繫結activity之後才可以執行,並且多個activity可以繫結同一個service,如果繫結全部取消,就會自動銷燬

使用步驟:
1.建立BindService服務端,繼承自Service並在類中,建立一個實現IBinder介面的例項物件並提供公共方法給客戶端呼叫
2.從onBind()回撥方法返回此Binder例項
3.在客戶端中,從onServiceConnected()回撥方法接收Binder,並使用提供的方法呼叫繫結服務
Tips:Activity和Service是通過ServiceConnection進行連線的!ServicConnction是與服務端互動的介面方法,繫結服務的時候呼叫其內部有兩個方法:onServiceConnected、onServiceDisconnected,前者是繫結成功時呼叫,後者是當Service意外銷燬時呼叫

!正常解綁是不會呼叫的!該類使用方法如下:

private ServiceTest.MyBinder myBinder;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//例項化service
myBinder = (ServiceTest.MyBinder) iBinder;
//開始呼叫Service中的方法
myBinder.startDownload();
Log.i(TAG, “onServiceConnected: ———–bindService———”);
}

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.i(TAG, "onServiceDisconnected: --------unbindService--------");
    }
};

Intent intent3 = new Intent(this, ServiceTest.class);
bindService(intent3, connection, BIND_AUTO_CREATE);
“`