Service總結

Service概要

Service是Android用於在後臺運行程序的解決方法,適用於那些不需要與用戶交互但卻需要持續運行的任務。

Service中的運行不依賴於應用,即使我們程序被切換到後臺,或者打開了另一個應用,我們的服務仍然在運行。但當應用被殺死後,所依賴於該應用的服務也會相應銷燬。

Service默認運行在主線程,所以不要在Service中執行耗時的操作,除非手動開啓子線程。

Service的生命週期

不同的啓動Service有兩種不同的生命週期。
在這裏插入圖片描述
未綁定的Service:當使用Context.startService方法開啓服務時會調用onStartCommand方法,如果Service沒有創建,則會先調用onCreate方法,再調用onStartCommand方法。此時Service一直處於開啓狀態,只有當調用stopService方法或stopself方法,服務纔會停止並調用onDestory方法。值得注意的是,我們可以多次startService,但是Service只會創建一個實例

綁定的Service:當Activity使用bindService方法時會將Service與Activity綁定。之後會調用Service的onBind方法,返回一個Binder用於給Activity調用Service中的方法。如果Service沒有被創建,則會先調用onCreate方法先創建,之後在調用onBind方法。此時Service和Acitivity處於綁定狀態,只有當Activity調用unbindService方法之後,纔會繼續調用Service的unbind方法,最後調用onDestory方法終止服務。

注意,這兩種啓動方法並不衝突,當使用startService()啓動Service之後,還可再使用bindService()綁定,只不過需要同時調用 stopService()和 unbindService()方法才能讓服務銷燬掉。

Service的使用

普通Service

第一步新建Service類,必須重寫onBind方法,可以選擇性的重寫onCreateonStartCommandonDestory方法。

第二步在AndroidManifest中註冊Service
在這裏插入圖片描述
第三步在Activity中創建Intent,傳入當前Activity與Service類,調用startService方法並傳入intent,開啓服務。在需要停止服務時,也需要創建Intent,傳入當前Activity與Service類,並調用stopServicestopself方法傳入intent,停止服務。
在這裏插入圖片描述

前臺Service

前臺服務與普通服務的差別在於,前者會一直有一個正在運行的圖標在系統的狀態欄顯示,下拉狀態欄後可以看到更加詳細的信息,非常類似於通知的效果。使用前臺服務或者爲了防止服務被回收掉,比如說我的天氣項目中,就有一個天氣的通知,就是一個前臺服務。可以顯示天氣信息。

使用前臺服務較爲簡單,在Service類的onStartCommand中創建一個Notification,並正常添加圖標,文字等等,不需要使用NotificationManager,而是使用startForeground()方法,將該服務變成前臺服務。
在這裏插入圖片描述

系統Service

系統Service比較多,比如的NotificationManager。通過getSyetemService()方法並傳入一個Name就可以得到相應的服務對象了
在這裏插入圖片描述

IntentService

爲了可以簡單地創建一個異步的、會自動停止的服務,Android 專門提供了一個IntentService類,可以簡單認爲做了如下圖的工作。在onStartCommand中新建一個線程,並在run函數中處理具體的邏輯並調用stopSelf方法,以結束服務。
在這裏插入圖片描述
其使用步驟與普通Service相似。

第一步:新建IntentService類,其區別主要爲以下兩點。

1.必須構造一個無參構造函數,然後在該函數中調用父類有參數構造函數,並傳入當前類的名稱;
2.必須重寫onHandleIntent方法,在其中可以執行耗時操作,因爲在這裏已經開了新線程。
在這裏插入圖片描述
第二步:在配置文件中進行註冊。

第三步:在活動中利用Intent實現IntentService的啓動,和Service用的方法是完全一樣的。

Service與Activity的通信

Service可以通過onBind方法與Activity通信。具體流程如下:

1.新創建一個DownloadBinder類繼承於Binder,同時在onBind中返回DownloadBinder的實例。

ublic class MyService extends Service {
    private DownloadBinder mBinder=new DownloadBinder();
    class DownloadBinder extends Binder {
        public void startDownload(){
            Log.d("MyService","startDownload executed");
        }
        public int getProgress(){
            Log.d("MyService","getProgress executed");
            return 0;
        }
    }
    public MyService() {
    }
    @Override
    public IBinder onBind(Intent intent) {
       return mBinder;
    }
}

2.在Activity中,我們要創建一個ServiceConnection對象,創建該對象需要重寫onServiceConnected方法和onServiceDisconnected,分別是Service與Activity綁定成功與綁定失敗後會回調的方法。onServiceConnected方法中會返回一個Binder對象。我們將其轉爲DownloadBinder類型的Binder,並調用其方法。

 private MyService.DownloadBinder downloadBinder;
 private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

3.我們需要構造Intent對象,並傳入當前Acitivity與我們的Service類。調用bindService方法,傳入Intent對象,傳入ServiceConnection對象,並傳入一個標誌位。這樣就將Service與Activity進行了綁定。當我們想取消綁定時,調用unbindService方法。

 case R.id.bind :
	Intent bindInent = new Intent(this,MyService.class);
	bindService(bindInent,serviceConnection,BIND_AUTO_CREATE);
	break;
case R.id.unbind:
	unbindService(serviceConnection);
    break;

總結(複習必看)

1.Service概述

1.Service是Android用來在後臺運行程序的解決方法,適用於那些不需要與用戶交互但是需要長期運行的程序。Service只要開啓後,不論將應用放到後臺還是打開了其他應用,Service都會一直運行。當應用被殺死後,隨之關聯的Service纔會銷燬。

2.Service的生命週期

(1)onCreate方法:服務第一次被創建時調用;
(2)onStartCommand方法:服務啓動時會調用(調用startService方法會回調的方法);
(3)onBind方法:當服務與Service綁定時,會回調的方法;
(4)unBind方法:當服務與Service解綁時,會回調的方法;
(5)onDestory方法:當Service銷燬(停止)時回調的方法。

3.Service兩種啓動方式

(1)未綁定的方式
當其他組件調用Context的startService方法後,會調用Service的onStartCommand方法如果Service沒有創建,則會先調用onCreate方法,之後再調用onStartCommand方法。此時服務處於開啓狀態,直到調用了stopService方法或stopSelf方法後,會調用onDestory方法來銷燬服務。我們可以多次使用startService方法,但Service的實例只會有一個。

(2)綁定的方式
當其他組件調用Context的bindService方法後,會回調Service的onBind方法,如果Service沒有被創建會先調用onCreate方法,此時服務與組件處於綁定狀態,組件可以通過onBind方法返回的Binder對象與Service通信。當組件調用了unbindService方法後,會回調Service的unbind方法,解除綁定,之後會調用onDestory方法停止服務

以上兩種方式並不衝突,當我們使用startService後再調用bindService方法也是可以的,但如果我們想要停止Service的話,需要調用stopService與unbindService。

4.Service與Activity的通信

Service可以通過onBind方法與Acitivity通信
首先需要在自定義的Service類中創建一個自定義的Binder類,類中可以有一些供Activity使用的方法,在onBind方法中返回自定義Binder的實例

在Activity中創建一個ServiceConnection的實例並重寫其中的onServiceconnected與onServiceDisconnected方法,在onServiceconnected方法中獲取Service傳來的Binder對象,並進行操作。

最後創建Intent對象並傳入Activity與Service類,之後調用bindService方法傳入intent對象,Serviceconnection對象,以及一個標誌符,以完成綁定。當我們想斷開綁定時,調用unbindService方法,並傳入ServiceConnection對象

5.普通Service與前臺Service的使用

普通Service的使用步驟如下:

1.創建Service類,重寫onBind方法,選擇性重寫onCreate、onDestory、onCommand方法

2.在AndroidManifest中註冊Service(如果是new 的是已經註冊好的)

3.在Acitvity中創建Intent對象,並傳入Acitivity與Service類,並通過使用startService並傳入Intent對象,以開啓服務。如果想要停止服務,也需要創建Intent對象,傳入Activity與Service類,並通過使用stopService方法以停止服務。

前臺Service的區別於使用步驟如下:

前臺Service與普通服務的區別在於,他是一直顯示在前臺的狀態欄處,下拉會顯示詳細的信息。可以用來天氣APP顯示天氣。

使用方法是在Service的onStartCommand方法中,創建一個Notification,不需要NotifiactionManager而是直接通過startForeground方法開啓一個前臺服務。

6.是否可以在Service使用耗時操作,如果需要的話怎麼辦?

Service默認是在主線程的,所以不建議使用耗時操作。如果想要使用耗時操作可以使用IntentService。IntentService做的工作類似於在onStartCommand中開啓了新線程,然後在線程中進行耗時操作,執行結束在調用stopself方法。

IntentService的使用方法與Service相似,區別在於創建IntentService時,(1)一定要有一個無參構造函數,並在其中回調父類的有參構造函數並傳入當前類的名字。(2)必須重寫onHandleIntent方法,在其中可以執行耗時操作,因爲在這裏已經開了新線程

7.如何保證Service不被殺死?

(1)可以在Service的onDestory中發送廣播,廣播接收器接收到廣播後在onRecive中繼續啓動Service。
(2)可以在Service的onStartCommand中設置flages值爲START_STICKY,讓Service調用onDestory之後接着啓動
(3)將Service的優先級提高,比如變成前臺Service。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章