2012年11月27日 星期二

Android:Service啟動方式,BindService


  1. 建立class並extends android.app.Service, override其需要的method
  2. public IBinder onBind(Intent intent) 需要回傳一個IBinder物件, 在實作上我們回傳一個extends Binder類別的物件, EX: LocalBinder
  3. 在這個LocalBinder類別中, 我們定義一個method, 讓它可以取得一個Service物件, 這也是使用Binder Service最主要的目的
  4. 我們可以將想再背景執行Service的程式碼寫在一個自訂的方法中, 以供之後從Activity呼叫
  5. 在main activity中, 使用ServiceConnection物件類別來進行與Service連線, 並實作需要的method, 在public void onServiceConnected(ComponentName name, IBinder service)中, 使用參數傳進來的service轉型成自定義的LocalBinder後, 呼叫自行定義的方法, 取得Service
  6. 接著在使用Intent物件,設定好main activity以及Service,再來就可以啟動服務啦 bindService(intent, mServConn, BIND_AUTO_CREATE);
  7. 記得不需要服務後,要將Service 連線給Unbind   unbindService(mServConn);
先註冊Service至manifest.xml中


package com.servicedemo;

import ...

public class MyService extends Service {
private LocalBinder myBinder=new LocalBinder();
private MyService myService;
@Override
public IBinder onBind(Intent intent) {
Log.d("MyService", "onBind");
return myBinder;
}

@Override
public void onCreate() {
Log.d("MyService", "onCreate");
super.onCreate();
}

@Override
public void onDestroy() {
Log.d("MyService", "onDestroy");
super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}

@Override
public boolean onUnbind(Intent intent) {
Log.d("MyService", "onUnBind");
return super.onUnbind(intent);
}
//Service自行提供可供操作的方法
public void doSomeThing(TextView textView){
textView.setText("Service提供的方法...");
}
/*
* inner class extends Binder
*/
public class LocalBinder extends Binder{
MyService getService(){
return MyService.this;
}
}

}



package com.servicedemo;

import...
import com.servicedemo.MyService.LocalBinder;

public class Main extends Activity {
private TextView textView;
private MyService mService = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView1);
}
public void bindService_onClick(View v) {
mService = null;
Intent intent = new Intent(Main.this, MyService.class);
this.bindService(intent, mServConn, BIND_AUTO_CREATE);
}

public void unBindService_onClick(View v) {
mService = null;
this.unbindService(mServConn);
}

public void callServiceMethod_onClick(View v) {
if (mService != null)
mService.doSomeThing(textView);
}
/*
* 目的:為了取得Service物件,進而操作其public的方法
* 作法:在這function會接收到由service內的onBinde()所丟出來的Ibinder物件
* 利用這IBinder物件取得Service物件,就可以直接操作Service內各個public 的method
*/
private ServiceConnection mServConn = new ServiceConnection() {
// bind Service過程中,系統會呼叫執行以下程式碼
@Override
public void onServiceConnected(ComponentName name, IBinder service) {

mService = ((LocalBinder) service).getService();
}

// Service發生意外才會執行
@Override
public void onServiceDisconnected(ComponentName name) {

}

};

}




沒有留言:

張貼留言