Android基本知识(二)
2015-11-21 01:40
489 查看
Android Service
同App内的Service操作和发送数据
启动和关闭Servicecase R.id.btnStartService: startService(new Intent(MainActivity.this,DemoService.class)); break; case R.id.btnStopService: stopService(new Intent(MainActivity.this,DemoService.class)); break;
绑定和解绑Service
⚠注意:没有绑定前进行解绑会有异常发生。
case R.id.btnBindService: if (binder == null) { bindService(new Intent(MainActivity.this, DemoService.class), this, Context.BIND_AUTO_CREATE); }else { System.out.println("已经绑定,不用再绑"); } break; case R.id.btnUnbindService: // 必须判断是否绑定,没有绑定的话,就去解绑会挂掉。 if(binder != null) { unbindService(this); binder = null; } else { System.out.println("还未绑定所以不能解绑,否则会挂掉,这是一个bug"); }
Service中必须返回一个IBinder
@Override public IBinder onBind(Intent intent) { System.out.println("绑定"); // TODO: Return the communication channel to the service. return new Binder(); // throw new UnsupportedOperationException("Not yet implemented"); } public class Binder extends android.os.Binder { public void setData(String data) { System.out.println("Binder 设置数据"); DemoService.this.data = data; } }
bindService连接成功会回调以下函数:
@Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("服务连接"+ name.getClassName().toString()); binder = (DemoService.Binder) service; }
⚠注意:调用unbindService,并不会回调
@Override public void onServiceDisconnected(ComponentName name) { System.out.println("服务异常断开连接"); }
以上回调只会在Service发生错误的时候被调用。
Activity给Service发送数据
在onServiceConnected中,可以拿到binder对象,然后通过这个对象向service发送数据。
Service给Activity数据
定义一个回调的类,用于发送数据:
private CallBack callBack = null; public CallBack getCallBack() { return callBack; } public void setCallBack(CallBack callBack) { this.callBack = callBack; } public interface CallBack { public void sendData(String data); }
定义接口用于Activity回调设置给Service
public class Binder extends android.os.Binder { public void setData(String data) { System.out.println("Binder 设置数据"); DemoService.this.data = data; } // 用于设置画面的回调 public void setCallBack(CallBack callBack) { DemoService.this.callBack = callBack; } }
在Service的线程中发送数据:
// 发送数据 if (DemoService.this.callBack != null) { DemoService.this.callBack.sendData("time"+i); }
Activity中设置回调和接收数据
@Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("服务连接"+ name.getClassName().toString()); binder = (DemoService.Binder) service; // 设置回调 binder.setCallBack(new DemoService.CallBack() { @Override public void sendData(String data) { System.out.println("getdata:" + data); } }); }
但是因为发送数据不在ui线程中,所以无法将接收到的数据直接设置到ui元素上。
所以通过Handler来处理
发送数据
@Override public void sendData(String data) { System.out.println("getdata:" + data); Message msg = new Message(); Bundle bundle = new Bundle(); bundle.putString("data",data); msg.setData(bundle); handler.sendMessage(msg); }
在ui线程刷新view
private android.os.Handler handler = new android.os.Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); tvReply.setText(msg.getData().getString("data")); } };
代码:
git@git.oschina.net:xuqi1987/Android.git
相关文章推荐
- 使用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