您的位置:首页 > 移动开发 > Android开发

菜鸟学步之Service通信

2016-07-06 21:56 531 查看

Service通信

Service的使用前面已经讲过了,也讲过了如何绑定Service以及它的生命周期。Service怎么进行数据的传递呢?以及又如何进行通信呢?

1.启动Service并传递数据

启动这个当然不用再细讲了,主要讲怎么进行数据的传递,我们有时候可能会需要把Activity里面的数据传递给Service,那么怎么传递过去呢?其实也是很简单的了,我们前面不是讲过Intent的用法吗?利用Intent可以利用一个Activity启动另一个Activity,也可以从一个Activity传递数据给另一个Activity(还可以回传),还可以在一个Activity中启动一个Service,当然类似的,也可以把数据从一个Activity传到Service中去。

首先,创建MyService服务类

public class MyService extends Service {
String data;
private  boolean running=false;//这里设置一个flag用来判断是否Thread()中的输出继续
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override//这里重写
public int onStartCommand(Intent intent, int flags, int startId) {
data=intent.getStringExtra("data");//
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
super.onCreate();
running=true;//在启动服务的时候开始打印,因此赋值为true
new Thread(){
@Override
public void run() {
super.run();
while (running){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(data);//输出从Activity接收过来的数据信息
}
}
}.start();
}

@Override
public void onDestroy() {
super.onDestroy();
running=false;//结束服务的时候停止打印,因此设置为false
}
}


然后在MainActivity里面写

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit) ;
findViewById(R.id.startService).setOnClickListener(this);
findViewById(R.id.stopService).setOnClickListener(this);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.startService:
Intent intent=new Intent(this,MyService.class);
intent.putExtra("data",edit.getText().toString());
startService(intent);
break;
case R.id.stopService:
stopService(new Intent(this,MyService.class));
break;
}
}
}


这个里面也是很浅显,重点当然就是说怎么把Activity里面的信息传到Service里去了,其实跟前面是大同小异的。

我们改变EditText里面的字符串,点击启动服务,就会发现Service里面输出的内容正是我们敲进去的字符串内容。

2.绑定Service进行通信

上面我们讲的是从Activity里面传数据给Service,那么Service里面的内容怎么传给Activity呢?我们要绑定服务并与Service进行通信

我们要在上面的基础上添加两个按钮并绑定监听事件

case R.id.BindService:
bindService(newIntent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
break;
case R.id.unBindService:
unbindService(this);
break;


@Override//绑定Service时要重写这两个类
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

}

@Override
public void onServiceDisconnected(ComponentName componentName) {

}


之后再添加一个同步按钮,用来同步服务中的数据到Activity中去。如何同步数据呢?我们看到上面的第一个重写的函数的第二个参数是IBinder iBinder,正好这个在Service里面有,在哪里呢?

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}


就是这个,它的返回值就是IBinder,而前面的需要输入一个IBinder这正好把Activity和Service链接起来了!我们改写一下,还是直接看Service中的全部代码吧

public class MyService extends Service {
String data;
private  boolean running=false;
public MyService() {
}

@Override
public IBinder onBind(Intent intent) {
return new Binder();//返回下面的这个类的实例对象
}
//这里重新定义了一个Binder类继承自android.os.Binder,其实就是拿这个作为返回值,只不过呢,如果全部在上面写不太方便,这里直接定义一个类
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data=data;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
data=intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}

@Override
public void onCreate() {
super.onCreate();
running=true;
new Thread(){
@Override
public void run() {
super.run();
while (running){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(data);
}
}
}.start();
}

@Override
public void onDestroy() {
super.onDestroy();
running=false;
}
}


下面是MainActivity里的代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
private EditText edit;
private  EditText edit2;
private MyService.Binder binder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit) ;
findViewById(R.id.startService).setOnClickListener(this);
findViewById(R.id.stopService).setOnClickListener(this);
findViewById(R.id.BindService).setOnClickListener(this);
findViewById(R.id.unBindService).setOnClickListener(this);
findViewById(R.id.syscdata).setOnClickListener(this);
edit2=(EditText)findViewById(R.id.edit2);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.startService:
Intent intent=new Intent(this,MyService.class);
intent.putExtra("data",edit.getText().toString());
startService(intent);
break;
case R.id.stopService:
stopService(new Intent(this,MyService.class));
break;
case R.id.BindService:
bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);
break;
case R.id.unBindService:
unbindService(this);
break;
case R.id.syscdata:
if (binder!=null){
binder.setData(edit2.getText().toString());
}
break;
}
}

@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
binder= (MyService.Binder) iBinder;
}

@Override
public void onServiceDisconnected(ComponentName componentName) {

}
}


这种方法是直接方法调用,比利用Intent的要方便高效的多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  通信 Android