Activity与Service的通信
三种方法
1.简单通信利用Intent进行传值
2.绑定服务利用ServiceConnection类
3.定义一个CallBack接口来监听服务中进程的变化
public class MyService1 extends Service {
public String data = "服务器正在执行";
public MyService1() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
}
public class ServiceActivity1 extends Activity implements View.OnClickListener {
private Intent intent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(ServiceActivity1.this, MyService1.class);
findViewById(R.id.btyStartService).setOnClickListener(this);
findViewById(R.id.btyStopService).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btyStartService://启动服务
intent.putExtra("data", "data");//此处传递值
startService(intent);//通过开启服务传递
break;
case R.id.btyStopService://终止服务
stopService(intent);
break;
}
}
}
第二种方法 绑定服务的方式传递数据
public class MyService2 extends Service {
public String data = "服务器正在执行";
public MyService2() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
public class Binder extends android.os.Binder {
public void setData(String data) {
MyService2.this.data = data;
}
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
public class ServiceActivity2 extends Activity implements View.OnClickListener, ServiceConnection {
private Intent intent;
public MyService2.Binder myBinder = null;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(ServiceActivity2.this, MyService1.class);
findViewById(R.id.btyStartService).setOnClickListener(this);
findViewById(R.id.btyStopService).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btyStartService://启动服务
if (myBinder != null)
myBinder.setData("启动服务了");//③
break;
case R.id.btyStopService://终止服务
stopService(intent);
break;
}
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService2.Binder) service;//②
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
第三种方式接口回调的方式
public class MyService3 extends Service {
private static final String TAG = "ActivityTest";
private Callback callback;
public String data = "服务器正在执行";
public MyService3() {
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "服务器已绑定");
return new Binder();
}
public class Binder extends android.os.Binder {
public void setData(String data) {
MyService3.this.data = data;
}
public MyService3 getMyService() {
return MyService3.this;
}
}
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
public void setCallback(Callback callback) {
this.callback = callback;
}
public Callback getCallback() {
return callback;
}
public interface Callback {
void onDataChange(String data);
}
}
public class ServiceActivity3 extends Activity implements View.OnClickListener, ServiceConnection {
private Intent intent;
public MyService3.Binder myBinder = null;//①
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intent = new Intent(ServiceActivity3.this, MyService1.class);
findViewById(R.id.btyStartService).setOnClickListener(this);
findViewById(R.id.btyStopService).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btyStartService://启动服务
if (myBinder != null)
myBinder.setData("启动服务了");//③
break;
case R.id.btyStopService://终止服务
stopService(intent);
break;
}
}
private Handler hander = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// textView.setText(msg.getData().getString("data"));
}
};
//一旦绑定成功就会执行该函数
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (MyService3.Binder) iBinder;
myBinder.getMyService().setCallback(new MyService3.Callback(){
@Override
public void onDataChange(String data) {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("data",data);
msg.setData(b);
hander.sendMessage(msg);
}
});
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}