菜鸟学步之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的要方便高效的多。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories