安卓入門--四大元件--Service基本用法
阿新 • • 發佈:2019-01-29
Service是什麼
Service(服務)是一個沒有使用者介面的在後臺執行執行耗時操作的應用元件。其他應用元件能夠啟動Service,並且當用戶切換到另外的應用場景,Service將持續在後臺執行。另外,一個元件能夠繫結到一個service與之互動(IPC機制),例如,一個service可能會處理網路操作,播放音樂,操作檔案I/O或者與內容提供者(content
provider)互動,所有這些活動都是在後臺進行。Service有兩種狀態,“啟動的”和“繫結”
Service預設跑在主執行緒,所以是在Service裡建立子執行緒而不是建立子執行緒跑Service。
Service的基本使用
定義一個服務:新建類繼承Service類
onBind方法是必須覆蓋的,而其他三個分別是建立時呼叫,銷燬時呼叫,啟動時呼叫
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
註冊Service,同樣是在配置檔案中:
<service android:name=".MyService" />
啟動服務和停止服務:
switch (v.getId()) {
case R.id.button1:
Intent startIntent =new Intent(this,MyService.class);
startService(startIntent);
break;
case R.id.button2:
Intent stopIntent =new Intent(this,MyService.class);
stopService(stopIntent);
break;
}
Service自己結束自己:stopSelf();
如果要服務完成什麼功能,寫在onStartCommand方法裡面即可。
Service與Activity通訊:
使用Binder物件可以進行兩者通訊,方法如下:
1. 在service裡面新建Binder類繼承Binder:
class MyBinder extends Binder{
public void MyStart(){
Log.d("Service", "MyStart: MyStart");
}
}
- onBind方法中返回這個類的例項
private MyBinder mybinder;
@Override
public IBinder onBind(Intent intent) {
return mybinder;
}
- 接下來在活動中呼叫Service的方法,先繫結服務。
繫結用的引數connection;
private MyService.MyBinder myBinder;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//繫結呼叫
}
@Override
public void onServiceDisconnected(ComponentName name) {
//j解綁呼叫
}
};
繫結服務
case R.id.button3:
Intent bindIntent=new Intent(this,MyService.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE);
break;
case R.id.button4:
unbindService(connection);
break;
呼叫服務的方法:
寫在onServiceConnected裡面:
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder=(MyService.MyBinder) service;
myBinder.MyStart();
}
服務的生命週期
通過這個圖可以看到,兩種啟動service的方式以及他們的生命週期,bind service的不同之處在於當繫結的元件銷燬後,對應的service也就被kill了。service的宣告週期相比與activity的簡單了許多,只要好好理解兩種啟動service方式的異同就行。