Android Service通信
来源:互联网 发布:gta5n卡掉帧如何优化 编辑:程序博客网 时间:2024/06/15 17:43
转载请注明来自:http://blog.csdn.net/ly20116/article/details/51045180
一、使用Intent进行通信
主要是使用Intent传递简单数据,且是在启动Service时传递,启动后就不通信,可以用来设置一下Service的配置。
Intent intent=new Intent(MainActivity.this,MyService.class);intent.putExtra("data","aaaaa");startService(intent);
在Service中的onStartCommand()的方法中获取Intent,从而获取到数据,实现Activity与Service间通信。
@Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub String data=intent.getStringExtra("data"); Log.i("TAG", data); return super.onStartCommand(intent, flags, startId); }
二、绑定Service通信
主要实现Activity中向Service传递数据,实时改变Service的状态
1、在Service中实现类MyBinder类继承至Binder,实现一个方法setData(),用于修改数据。
public class MyBinder extends Binder{ public void setData(String data){ MyService.this.data=data; } }
2、在onBind()方法中返回MyBinder对象
@Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return new MyBinder(); }
3、在Activity中实现ServiceConnection接口,同时实现onServiceConnected()和onServiceDisconnected()方法,当然你要可以自定义一个ServiceConnection对象并实现它的2个方法。
获取onBind()方法返回的IBind对象。
@Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub myBinder=(MyBinder)service; } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub }
/** 定义服务绑定时的回调方法,用于传给bindService() */ private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { myBinder=(MyBinder)service; } @Override public void onServiceDisconnected(ComponentName arg0) { mBound = false; } };
4、绑定Service,并与之通信
Intent bindIntent=new Intent(this,MyService.class);bindService(bindIntent, this, Context.BIND_AUTO_CREATE);
bindService()函数详解
@Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { return mBase.bindService(service, conn, flags); } 参数分别为: 1、Intent对象 2、ServiceConnectino对象 3、指明绑定选项的标志,通常应该是BIND_AUTO_CREATE,表示如果服务未启动的话则创建服务。其它可能的值包括BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,或者为0表示不指定
5、解除绑定
unbindService(this);
三、绑定Service,监听Service的内部状态
监听Service的状态,Service的数据返回给Activity
1、定义一个接口CallBack
public interface CallBack { void DataChange(String data);}
2、在Service中创建CallBack对象,并实现get和set方法。
private CallBack callback=null;public CallBack getCallback() { return callback; }public void setCallback(CallBack callback) { this.callback = callback; }
3、在MyBinder类中新建一个方法,返回Service对象
public class MyBinder extends Binder{ public void setData(String data){ MyService.this.data=data; } //获取当前Service对象 public MyService getService(){ return MyService.this; } }
4、在线程中调用CallBack的方法
String str=i+":"+data;Log.i("TAG", str);if(callback!=null){ callback.DataChange(str);}
5、在Activity的onServiceConnection方法中,获取Service对象,并设置CallBack:
@Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub myBinder=(MyBinder)service; myBinder.getService().setCallback(new CallBack() { @Override public void DataChange(String data) { // TODO Auto-generated method stub Message msg=new Message(); msg.obj=data; handler.sendMessage(msg); } }); }
由于是在子线程中,要改变UI界面,需要在主线程,所以使用Handler+Message实现
Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { outText.setText(msg.obj.toString()); }; };
Service通信实例下载链接:http://download.csdn.net/detail/ly20116/9489201
- Android service通信
- Android 远程Service通信
- Android Service 通信
- Android Service通信详解
- Android Service通信
- Android Service通信
- android Service通信
- Android Service 通信
- android service 与activity通信--绑定service
- Android中的Service的通信
- android Service 跨进程通信
- android activity与service通信
- Android Activity与Service通信
- android Service 跨进程通信
- Android service与Activity通信
- android activity 与service通信
- Android service 与 activity通信
- Android Service与Activity通信
- MySQL多表查询
- u-boot网络启动分析(二) 驱动注册
- 【day0402】C++标准异常
- 【bzoj3329】【Xorequ】【数位dp+矩阵乘法】
- 10008---Trail ~ Testing the DAO
- Android Service通信
- 安卓开发中利用java代码修改控件位置
- [BZOJ3130][Sdoi2013]费用流 做题笔记
- 【HowTo ML】正则化
- FATAL EXCEPTION: main 2. java.lang.NoSuchFieldError: R$id.r1
- C语言如何实现一个函数返回另一个函数
- 6 Java基础语法(二维数组,参数传递与数据加密问题)&面向对象(面向对象思想,类与对象及使用,对象内存图解)
- Android ExpandableListView 进行二级扩展 (BaseExpandableListAdapter)
- Java开发人员最常犯的10个错误