天天看點

Android四大元件總結——ServiceAndroid四大元件總結——Service

Android四大元件總結——Service

Service是Android四大元件之一,主要用于在背景處理一些耗時的邏輯,或去執行一些需要長期運作的任務。有時候我們甚至可以在程式退出的情況下,讓Service繼續保持運作的狀态。

建立Service

要建立Service,我們可以在Android Studio中右鍵項目欄,選擇new->Service來建立,也可以自己建立一個Java類,繼承自Service來建立。不過要注意的是,項目中的每一個Service都必須在AndroidManifest.xml中注冊才行 。如果是由Android Studio替我們建立,會自動為我們注冊。如果是手動建立,需要用如下的方式手動注冊:

<service
    android:enabled="true"
    android:exported="true"
    android:name=".MyService">
</service>
           

啟動與停止Service

啟動和停止Service的方法和啟動Activity很類似,都需要借助Intent來實作 。

啟動Service

Intent startIntent = new Intent(ThisActivity.this, MyService.class);
startService(startIntent);
                

停止Service

Intent stopIntent = new Intent(ThisActivity.this, MyService.class);
stopService(stopIntent);
                

停止Service除了這種方式,還可以由Service自己停止自己,隻需要在其任意位置調用stopSelf()方法,就能讓它停下來了。

使用Service

當我們調用startCommand方法後,Service會在内部調用onCreate方法以及onStartCommand方法。是以,我們可以将建立Service後的一些邏輯寫在onCreate方法中,将一些Service需要執行的邏輯放在onStartCommand中。

使用Service主要是用于處理一些背景的耗時邏輯或需要長期運作的任務。是以服務應該運作于獨立于主線程的另一線程。但是需要注意的是,實際上服務并不會自動開啟新線程,所有代碼是預設都在主線程中運作的。是以,我們需要在其内部手動建立子線程,否則可能出現主線程被阻塞的情況。

Activity與Service通信

可以發現,雖然Service是在Activity中啟動,但啟動後,它們看上去之間就沒有什麼關系了。Service會一直處于運作狀态跟,但具體的運作邏輯Activity就無法控制了。是以我們可以通過onBind方法來實作。

Service部分

我們可以在Service内部建立一個繼承自Binder的類,在它内部提供實作具體邏輯的方法。然後在Service類中建立一個該Binder的執行個體,并在onBind方法中傳回。

public class downloadService extends Service{
    private DownloadBinder mBinder = new DownloadBinder();
    
    class DownloadBinder extends Binder{
        public void startDownload(){
            //start download
        }
        
        public void stopDownload(){
            //stop download
        }
    }
    
    @Override
    public IBinder onBind(Intent intent){
        return mBinder;
    }
}
                

Activity部分

首先,我們可以在Activity中聲明一個Binder對象,并建立一個ServiceConnection對象,實作它的onServiceConnected以及onServiceDisconnected兩個方法。我們可以在onServiceConnected方法中将參數中的IBinder對象強轉為我們的Binder,并指派給我們的Binder對象。

然後我們可以像前文一樣建立一個Intent,然後用bindService方法,傳入intent,之前建立的connection,以及一個标志位。這樣就成功綁定了Activity與Service。(傳入BIND_AUTO_CREATE會在Activity和Service綁定後自動建立服務,這使得onCreate方法執行,而onStartCommand方法不執行)

而要解綁Activity與Service的話,就隻需要調用unbindService并傳入相應connection即可。

Service的生命周期

在Service的生命周期中,常用的有如下:

4個手動調用的方法

  • startService:用于啟動服務,手動調用startService()後,自動調用内部方法:onCreate()、onStartCommand()
  • stopService:用于關閉服務,手動調用stopService()後,自動調用内部方法:onDestory()
  • bindService:用于綁定服務,手動調用bindService()後,自動調用内部方法:onCreate()、onBind()
  • unbindService:用于解綁服務,手動調用unbindService()後,自動調用内部方法:onCreate()、onBind()、onDestory()

5個内部調用的方法

  • onCreate:建立服務
  • onStartCommand:開始服務
  • onDestroy:銷毀服務
  • onBind:綁定服務
  • onUnbind:解綁服務

前台Service

有時候因為一些特殊需求或為了防止因系統記憶體不足而将Service回收,我們可以使用前台Service。

要建立前台Service,我們隻用在服務的onCreate方法中建立一個Notficiation,再調用其startForeground方法即可。例如:

@Override
public void onCreate(){
    super.onCreate();
    Notification notification = new NotificationCompat.Builder(this)
    	.setContentTitle("Title")
    	.setContentText("This is a content text")
    	.setWhen(System.currentTimeMillis())
    	.setSmallIcon(R.mipmap.ic_launcher)
    	.build();
    startForeground(1,notification);
}
                

startForeground方法的兩個參數中,第一個參數是通知的id,第二個參數則是Notfication對象。調用了startForeground方法後,就會讓這個Service變成一個前台的Service,并在系統狀态欄顯示出來。

廣告時間

我是N0tExpectErr0r,一名廣東工業大學的大二學生

歡迎來到我的個人部落格,所有文章均在個人部落格中同步更新哦

http://blog.N0tExpectErr0r.cn