Android中Service通信(二)——绑定Service进行通信
一、把输入文本的数据同步到服务的实例(如何执行服务的内部代码)
绑定服务比启动服务更加方便高效,绑定服务中的直接方法调用比Intent作为载体传输更为快捷得多。
1、activity_main.xml
<Button
android:text="绑定服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnBindService" />
<Button
android:text="解除绑定服务"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnUnbindService" />
<Button
android:text="同步数据"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btnSyncData" />
2、MainActivity.java
private MyService.Binder binder = null;
findViewById(R.id.btnBindService).setOnClickListener(this);
findViewById(R.id.btnUnbindService).setOnClickListener(this);
findViewById(R.id.btnSyncData).setOnClickListener(this);
case R.id.btnBindService:
bindService(new Intent(this,MyService.class),this,Context.BIND_AUTO_CREATE);
break;
case R.id.btnUnbindService:
unbindService(this);
break;
case R.id.btnSyncData:
if (binder != null) {
binder.setData(editText.getText().toString());
}
break;
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.Binder)service;
}
@Override
public void onServiceDisconnected(ComponentName name) { }
3、MyService.java
public IBinder onBind(Intent intent) {
return new Binder();
}
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data = data;
}
}
二、内部信息呈现到外界的实例(如何侦听服务的内部状态)
1、activity_main.xml
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tvOut"/>
2、MainActivity.java
private TextView textView;
textView = (TextView) findViewById(R.id.tvOut);
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.Binder)service;
binder.getService().setCallback(new MyService.Callback(){
@Override
public void onDataChange(String data) {
//textView.setText(data); //错误用法。程序由新创建的线程调用,不允许其他辅线程来直接获取UI线程(主线程)的资源。
Message msg = new Message();
Bundle b = new Bundle();
b.putString("data",data);
msg.setData(b);
handler.sendMessage(msg);
}
});
}
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText(msg.getData().getString("data"));
}
};
3、MyService.java
public class Binder extends android.os.Binder{
public void setData(String data){
MyService.this.data = data;
}
public MyService getService(){
return MyService.this;
}
}
public void onCreate() {
super.onCreate();
running = true;
new Thread(){
@Override
public void run() {
super.run();
int i = 0 ;
while(running){
i++;
String str = i+":"+data;
System.out.println(str);
if(callback != null){
callback.onDataChange(str);
}
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
private Callback callback = null;
public void setCallback(Callback callback) {
this.callback = callback;
}
public Callback getCallback() {
return callback;
}
//内部通知外界:回调机制
public static interface Callback{
void onDataChange(String data);
}
Android中Service通信(二)——绑定Service进行通信的更多相关文章
- Android中startService的使用及Service生命周期
Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法.本文仅仅探讨纯startService的使用.不 ...
- Android WiFiDirect 学习(二)——Service Discovery
Service Discovery 简介 在Android WifiDirect学习(一 )中,简单介绍了如何使用WifiDirect进行搜索——连接——传输. 这样会有一个问题,那就是你会搜索到到附 ...
- Android中使用"running services"查看service进程内存
从Android 2.0开始,在Settings中加入了一个新的activity("Running Services" activity),它用于显示当前运行的每个Services ...
- (原)android中的动画(二)
帧动画的使用需要在xml文件中指定每一帧所对应的图片 animation-list写法如下: <?xml version="1.0" encoding="utf-8 ...
- Android学习笔记(八)深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- Tabhost中Activity绑定Service
在android中,一个Activity绑定一个Service组件我们一般用Context().bindService方法就能够.可是假设这个 Activity属于一个Tabhost的话就不行了,在网 ...
- Android中Service概述
Service是Android中一种非常重要的组件,一般来说有两种用途:用Service执行长期执行的操作,而且与用户没有UI界面的交互:某个应用程序的Service能够被其它应用程序的组件调用以便提 ...
- 深入分析Service启动、绑定过程
Service是Android中一个重要的组件,它没有用户界面,可以运行在后太做一些耗时操作.Service可以被其他组件启动,甚至当用户切换到其他应用时,它仍然可以在后台保存运行.Service 是 ...
- Android中如何查看内存
文章参照自:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-a ...
随机推荐
- 【推荐】CentOS安装PHP-5.6.4+扩展安装+安全配置+性能配置
注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 前段时间PHP官方发布了一个重要的安全升级公告,修复了两个unserialize函数的严重漏洞,目前受影响的版本有: ...
- linux命令-文件命令
1.解压.tar文件 tar -vxf *.tar 2.把一个文件夹下的内容复制到另一个文件夹 将aaa内所有内容复制到bbb cp -a aaa/* /bbb/ * 3.复制文件时不改变文件的时间 ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- OnDraw函数
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6219428.html 方法一.对字符串直接赋值 在View类中定义了OnDraw函数 ...
- JS中typeof与instanceof的区别
JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的.但它们之间还是有区别的: Typeof typeof 是一个一元运算,放在一个运算数之前 ...
- 如何把select默认的小三角替换成自己的图片
不同的浏览器默认的select的选项图标是不同的,例如: 在chrome中,是这样的: 未点击时 点击时 在Firefox中是这样的: 未点击时 点击时 在IE9中是这样的: 未点击时 ...
- iOS CoreAnimation详解(一) 有关Layer的动画
以前由于项目需要 也写了一些动画 ,但是知识不系统,很散.这段时间趁着项目完成的空袭,来跟着大神的脚步系统的总结一下iOS中Core Animation的知识点. 原博客地址:http://blog. ...
- [LeetCode] Valid Sudoku 验证数独
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 5G承载为什么需要三层到边缘
- git 分支管理
本地主分支提交到远程分支 git push origin master:branch-test 本地分支提交到远程主分支 git push origin branch-test:master 切换分支 ...