android中经常使用service为我们的app提供服务。在app中启动一个service通常有2种方式1、startService()2、bindService();
如果使用startService只能单纯的启动一个服务,而不能让activity和service交互。如果要想使activity和service交互的话只能使用bindService()启动服务了。
下边关于bindService的使用我做了一个简单的Demo
先贴上service相关的代码
package com.wind.bindservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
public class SearchService extends Service {
private Binder mBinder = new SearchBinder();
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
//返回一个binder,这个binder在ServiceConnection中会用到
return mBinder;
}
public class SearchBinder extends Binder{
//在binder子类中写一个函数,用以获得当前service的一个实例对象
public SearchService getService(){
return SearchService.this;
}
}
//这个例子用以说明service和activity之间的交互
public int find(int i) {
int arr[] = {1,3,4,7,11,18,29};
if (i < arr.length) {
return arr[i];
} else {
return -1;
}
}
}
下边贴上activity中的代码
package com.wind.bindservice;
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.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private ServiceConnection mServiceConnection;
private SearchService mService;
private TextView tv_searchResult;
private EditText et_number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv_searchResult = (TextView)this.findViewById(R.id.searchResult);
et_number = (EditText)this.findViewById(R.id.number);
mServiceConnection = new SearchServiceConnection();
//这个就是绑定service的地方
bindService(new Intent(MainActivity.this, SearchService.class),
mServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//自定义一个类用以实现ServiceConnection接口
private class SearchServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//通过绑定service,在这个地方通过getService获得service的实例对象,其他地方就可以通过这个实例对象调用service中的方法了
mService = ((SearchService.SearchBinder)service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
public void find(View v) {
int number = Integer.valueOf(et_number.getText().toString());
//通过service的实例对象调用其中的方法,实现activity和service的交互
int result = mService.find(number);
tv_searchResult.setText("查询结果为:" + result);
}
}