MainActivity中启动,停止,绑定,取消绑定,同步相关代码
public class MainActivity extends Activity implements OnClickListener, ServiceConnection {
//ServiceConnection用于绑定服务,重写两个onServiceConnected,onServiceDisconnected方法
private TextView tvout;
private EditText et;
private MyService.Binder binder;
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.btnstart:
Intent intent=new Intent(MainActivity.this,MyService.class);
intent.putExtra("data",((EditText)findViewById(R.id.input)).getText().toString());
startService(intent);//在启动时将文本框中的信息传递给Service
break;
case R.id.btnstop:
Intent intent1=new Intent(MainActivity.this,MyService.class);
stopService(intent1);
break;//停止Service
case R.id.btnbund:
bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);//绑定Service
break;
case R.id.btnunbund:
unbindService(this);//取消绑定Service
break;
case R.id.btnsync:
if(binder!=null){
binder.setData(et.getText().toString());//同步
}
break;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
et=(EditText)findViewById(R.id.input);
tvout=(TextView)findViewById(R.id.tvout);
findViewById(R.id.btnstart).setOnClickListener(this);
findViewById(R.id.btnstop).setOnClickListener(this);
findViewById(R.id.btnbund).setOnClickListener(this);
findViewById(R.id.btnunbund).setOnClickListener(this);
findViewById(R.id.btnsync).setOnClickListener(this);
}
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//iBiinder时MyService中OnBind方法的返回值
binder=(MyService.Binder)iBinder;
binder.getService().setCallBack(new MyService.CallBack(){
@Override
public void onDataChange(String data) {
Message msg=new Message();
Bundle b=new Bundle();
b.putString("data",data);
msg.setData(b);
handler.sendMessage(msg);
}
});
}
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
tvout.setText(msg.getData().getString("data"));
}
};
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
MyService
public class MyService extends Service {
boolean running=false;
String data="default";
private CallBack callBack=null;
public MyService(){
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data=intent.getStringExtra("data");
return super.onStartCommand(intent,flags,startId);
}
@Override
public void onDestroy() {
super.onDestroy();
running=false;
}
@Override
public void onCreate() {
super.onCreate();
running=true;
new Thread(){
@Override
public void run() {
int i=0;
while (running){
i++;
String str=i+" "+data;
if(callBack!=null){
callBack.onDataChange(str);
}
try {
sleep(100);
}catch (Exception e){
e.printStackTrace();
}
Log.d("data",i+data);
}
}
}.start();
}
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data=data;
}
public MyService getService(){
return MyService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
public CallBack getCallBack(){
return callBack;
}
public void setCallBack(CallBack callBack){
this.callBack=callBack;
}
public static interface CallBack{
void onDataChange(String data);
}
}
核心内容:
同步:
在绑定服务后实现的方法onServiceConnected可以获得在Service中onBind方法返回的iBinder对象,通过该binder中的方法获取或者改变service中的数据
在MainActivity中实例化一个Binder,将其初值定义为null,当绑定时将该实例赋为onBind返回的Binder,此后操作Binder即可操作Service中的数据
监控Service信息的改变:
执行Service中的方法来传出数据,需要使用回调CallBack接口
当Service启动/绑定时实例化回调接口,用该接口中的方法获取Service信息
在Binder类中提供获得Service的方法,再通过Service的get/set方法操作/改变Service中的值
UI线程中的数据不能被其他线程修改,可以通过handler机制改变UI数据