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