當連線成功後,會自動呼叫執行這個connection內的onServiceConnected(ComponentName className, IBinder service) function,在這function會接收到由service內的onBinde()所丟出來的Ibinder物件,利用這IBinder物件取得Service物件,就可以直接操作Service內各個public 的method
[Activity]
1). 宣告MyService的變數,用此讀取MyService的資料
2). 宣告ServiceConnection的變數,並撰寫onServiceConnected及onServiceDisconnected的method
3). 使用bindService方法連結Activity及Service
[Service]
1). 宣告MyBinder的變數
2). 定義MyBinder的類別來取得MyService的物件實例
3). 使用onBind的方法綁定Service,返回一個ibinder的對象進行操作
4). 撰寫剩下的onRebind、onUnbind
//=============================================================
[Main.xml]
package com.servicetest2;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class Main extends Activity implements OnClickListener {
private Intent intent;
private MyService myService;
private boolean flag;
private ServiceConnection serviceconnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Toast.makeText(Main.this, "Bind Service", Toast.LENGTH_SHORT).show();
myService = ((MyService.MyBinder) service).getService();
flag = true;
Log.d("Main","Bind");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(Main.this, "Bind Service Failed", Toast.LENGTH_SHORT).show();
myService = null;
}
};
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnStartService:
startService(intent);
break;
case R.id.btnStopService:
stopService(intent);
break;
case R.id.btnBindService:
bindService(intent, serviceconnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
// 當有bind,才會unbind
if (flag == true) {
unbindService(serviceconnection);
flag = false;
Log.d("switch","if");
}
Log.d("switch","break");
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
flag = false;
// 取得資源
Button btnStartService = (Button) findViewById(R.id.btnStartService);
Button btnBindService = (Button) findViewById(R.id.btnBindService);
Button btnUnbindService = (Button) findViewById(R.id.btnUnbindService);
Button btnStopService = (Button) findViewById(R.id.btnStopService);
// 設置按下按鈕的物件實例
btnStartService.setOnClickListener(this);
btnBindService.setOnClickListener(this);
btnUnbindService.setOnClickListener(this);
btnStopService.setOnClickListener(this);
intent = new Intent(this, MyService.class);
}
}
//-------------------------------------------------------------------------------------------------------------
[MyService.xml]
package com.servicetest2;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service{
public MyBinder myBinder=new MyBinder();
@Override
public IBinder onBind(Intent intent) {
Log.d("MyService","onBind");
return myBinder;
}
@Override
public void onRebind(Intent intent){
Log.d("MyService","onRebind");
super.onRebind(intent);
}
@Override
public boolean onUnbind(Intent intent){
Log.d("MyService","onUnbind");
return super.onUnbind(intent);
}
@Override
public void onCreate(){
Log.d("MyService","onCreate");
super.onCreate();
}
@Override
public void onDestroy(){
Log.d("MyService","onDestory");
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId){
Log.d("MyService","onStart");
super.onStart(intent, startId);
}
public class MyBinder extends Binder{
MyService getService(){
return MyService.this;
}
}
}
沒有留言:
張貼留言