Service

一、service的應用場景以及和Thread的區別

1、service是什麼?

在這裏插入圖片描述
1)可以在後臺處理一些耗時的邏輯、
2)可以執行長時間運行的任務在後臺開啓、
3)可以在程序退出的時候仍讓service保持一定的狀態即service保活
4)可以被activity和Broadcast呼起,即使該activity和Broadcast被銷燬了,service也可以活着
5)也可以把service綁定到activity可以進行互相通信,進程之間也可以通信
6)service和Broadcast都是運行在主線程,都不能做耗時操作
7)既然service運行在主線程,也不能直接執行耗時操作,爲什麼還需要service,而不是直接在activity中創建子線程執行耗時操作呢?
因爲在activity中Thread,當activity被銷燬後,你沒有辦法再獲得之前的thread;
而service可以運行在後臺,不必銷燬;activity就可以放心的創建銷燬;

2、service和Thread的區別

1)、定義上:android中 service、thread、後臺是不一樣的概念
service是由系統進程託管,service是一種輕量級的IPC通信,

2)、實際開發中:
service運行在主線程,不能執行耗時操作,不然會NAR,要開啓單獨線程

3)、應用場景
service : 播放音樂,開啓天氣預報的統計,數據統計等等

二、開啓service的兩種方式以及區別

1、startService

開啓服務,一旦該服務開啓,就會在後臺無限期的運行,activity被銷燬也不影響,除非你通過stopService關閉service。
在這裏插入圖片描述

public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        Intent intent = new Intent(this, StartService.class);
        startService(intent);
    }

}
public class StartService extends Service {

    /**
     * 綁定服務時纔會調用
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 首次創建服務時。系統調用此方法進行一次性設置程序(在調用onStartCommend() 和onBind() 之前),
     * 如果服務已經運行,則不會調用此方法,此方法只會調用一次
     */
    @Override
    public void onCreate() {
        super.onCreate();
    }

    /**
     * 1、每次通過startservice()方法啓動service時,都被調用
     * 2、當返回值爲START_STICKY,表明service因爲系統內存不足被回收後,
     *    在系統內存再次有空閒的時候,會重新啓動該service,並調用該方法,但是其中的Intent爲null
     *    這種適用於像後臺播放器,天氣預報等
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    /**
     * 服務銷燬時的回調
     * 在這裏實現一些資源的清理:1、子線程  2、監聽器  3、 contentProvide
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

2、 bindService

在這裏插入圖片描述

public class BindActivity extends Activity {

    private Service mService;
    private ServiceConnection serviceConnection = new ServiceConnection(){

        /**
         * 與服務器端交互的接口方法,綁定服務的時候被回調,在這個方法獲取綁定的service傳遞過來的IBinder對象,
         * 通過這個IBinder對象,實現宿主和service的交互
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            //獲取Binder
            BindService.LocalBinder binder = (BindService.LocalBinder)service;
            mService = binder.getService();
        }

        /**
         *當取消綁定的時候被回調,但正常情況下是不被調用的。
         * 它的調用時機是當service被意外銷燬時,activity主動關閉service時不回調用該方法
         * 例如內存資源不足時,該方法才被自動調用
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, BindService.class);
        //開啓綁定
        bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE);

    }
}

public class BindService extends Service {

    private LocalBinder localBinder = new LocalBinder();

    /**
     * 創建Bind對象,返回給客戶端即activity使用,提供數據交換的接口
     */
    public class LocalBinder extends Binder{

        //聲明這個方法,getService(),提供給客戶端調用
        BindService getService(){
            //返回當前服務的對象,這樣我們就可以在客戶端調用service的public方法了
            return BindService.this;
        }
    }
    
    /**
     * 綁定服務時纔會調用
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return localBinder;
    }

    /**
     * 首次創建服務時。系統調用此方法進行一次性設置程序(在調用onStartCommend() 和onBind() 之前),
     * 如果服務已經運行,則不會調用此方法,此方法只會調用一次
     */
    @Override
    public void onCreate() {
        super.onCreate();
    }

    /**
     * 1、每次通過startservice()方法啓動service時,都被調用
     * 2、當返回值爲START_STICKY,表明service因爲系統內存不足被回收後,
     *    在系統內存再次有空閒的時候,會重新啓動該service,並調用該方法,但是其中的Intent爲null
     *    這種適用於像後臺播放器,天氣預報等
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    /**
     * 服務銷燬時的回調
     * 在這裏實現一些資源的清理:1、子線程  2、監聽器  3、 contentProvide
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章