笔记摘要:

本地服务:访问者跟服务在同一个进程内。远程服务:访问者跟服务不在同一个进程内,因为通过startService()和stopService()启动关闭服务,

适用于服务和访问者没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要使用bindService()和unbindService()方法启动关闭服务。

这里就通过一个简单的查询示例来演示相互通信的本地服务

执行过程

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。

如果访问者要与服务进行通行,那么,onBind()方法必须返回Ibinder对象。如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。

如果调用bindSercice()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被重

复调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()---->onDestory()方法

使用IBundle实现客户端与服务端之间的服务:

当客户端调用bindService()方法启动服务,操作系统就会调用服务中的onBind方法,返回一个Ibinder对象,然后传给客户端,客户端就可以通过IBinder对象调用service中的方法

效果图:


代码体现:

<EditText android:layout_width="fill_parent"android:layout_height="wrap_content"android:id="@+id/studentno"/><Button android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/studentno"android:id="@+id/button"android:text="@string/button"/><TextView android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/button"android:id="@+id/resultView"/>

AndroidMainfest.xml中添加服务

 <service android:name=".StudentService"></service>

说明:bindService()方法需要的参数(服务,服务连接对象,操作标识),服务连接对象是一个接口,需要实现

package cn.xushuai.studentquery;import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class StudentQuery extends Activity {private EditText studentno;private TextView resultView;private StudentServiceConnection conn = new StudentServiceConnection();private IStudent iStudent;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_student_query);studentno = (EditText)this.findViewById(R.id.studentno);Button button = (Button) this.findViewById(R.id.button);resultView = (TextView) this.findViewById(R.id.resultView);button.setOnClickListener(new ButtonClickListener());Intent service = new Intent(this,StudentService.class);bindService(service, conn, BIND_AUTO_CREATE);//绑定后自动创建服务}//实现一个服务连接对象private class StudentServiceConnection implements ServiceConnection{public void onServiceConnected(ComponentName name, IBinder service) {iStudent= (IStudent) service;}public void onServiceDisconnected(ComponentName name) {iStudent = null;}}//当Activity摧毁的时候,解除与服务的绑定@Overrideprotected void onDestroy() {unbindService(conn);super.onDestroy();}private final class ButtonClickListener implements View.OnClickListener{public void onClick(View v) {String no = studentno.getText().toString();String name = iStudent.queryStudent(Integer.valueOf(no));resultView.setText(name);}}
}

说明:

在业务类StudentService中定义提供服务的方法,由于是使用Binder实现访问者与服务者间的通信,所以在系统调用的onBind方法里返回一个Ibinder对象,

使用该对象实现方法的调用,由于Ibinder是一个接口,这里自定义一个类StudentBinder,去继承已经实现Ibinder的类binder,然后返回该类的一个对象,我

们在该类中定义方法,用于客户端调用,,这里将StudentBinder定义为private,所以通过一个接口IStudent来实现访问

package cn.xushuai.studentquery;import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;public class StudentService extends Service {private String[] names = {"张三","李四","王五"};private IBinder binder = new StudentBinder();public String query(int no){if(no>0 && no<4){return names[no-1];}return null;}@Overridepublic IBinder onBind(Intent intent) {System.out.println("onBind...............");return binder;  //向客户端返回IBinder接口的一个实现类}//通过Binder对象调用服务的方法//IBinder为接口,这里继承一个已经实现IBinder的类,在这个类中定义一些方法,用于客户端调用private class StudentBinder extends Binder implements IStudent{public String queryStudent(int no) {return query(no);    //直接调用query方法}}}

用于访问StudentBinder的接口

package cn.xushuai.studentquery;public interface IStudent {public String queryStudent(int no);
}

转载于:https://www.cnblogs.com/xushuai123/archive/2013/01/31/3634416.html

Android--建立能与访问者进行相互通信的本地服务相关推荐

  1. android学习笔记---40_建立能与访问者进行相互通信的本地服务,后台运行的service

    40_建立能与访问者进行相互通信的本地服务 ------------------------------------------- 1.本地服务:如果服务和访问者在一个进程中那么就叫做本地服务.   ...

  2. LoadRunner+Android模所器实现抓包并调试本地服务端

    为了测试Android软件的服务端的功能,需要重现某些客户端操作,便于发现功能问题,性能问题.也方便客户端与本机服务端特别是服务端代码进行断点调试.这个时候需要对网络操作进行重现. loadRunne ...

  3. windows备份与还原和两个主机的相互通信

    DAY02Windows 实验一: 实验名称:windows系统的备份与还原 实验描述:为了保证系统的安全对系统做备份与还原操作系统 实验拓扑: 实验步骤: 步骤一:将急救大师软件安装在虚拟机的系统上 ...

  4. Android客户端与PC服务器实现Socket通信

    Android终端持续扫描AP信息并发送给服务器端的实现.首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路.使用ServerSocket创建TCP服务器端,然后在Android客户 ...

  5. unity android服务器端,【深圳Unity3D培训】 Android客户端与PC服务器实现Socket通信

    [深圳Unity3D培训] Android客户端与PC服务器实现Socket通信 Android终端连续扫描AP信息并发送给服务器端的完成.起首基于TCP协定在Android终端和PC两头之间构成收集 ...

  6. ESP8266深度学习之五通过两个ESP8266芯片实现相互通信功能(AT模式)

    一.设计基本思路 要实现两个ESP8266相互通信,常规方案是需要一个ESP8266做服务器,另外一个做客户端,这样就建立起了CS架构.当然,作为客户端的ESP8266与之前相比没有什么本质差别,重点 ...

  7. Android网络开发(一、Socket通信HTTP通信)

    一.Socket通信   Socket:即套接字,其本身并不是一种通信协议,它是封装了TCP/IP.UDP 协议的API实现.在创建Socket对象后,底层会完成TCP/IP的三次握手等(UDP协议对 ...

  8. Android客户端与服务器用Socket进行通信

    Android客户端与服务器用Socket进行通信(简单,基础) #####哈哈哈,很久没有好好学习了,今天写一个关于通信的,我也是刚刚学到,代码还不完善,,,,有问题请大家指出 #Android客户 ...

  9. 4、路由器和主机如何配置IP地址等信息才能使计算机相互通信

    文章目录 一.路由器和主机配置 1.路由器配置 ①路由器以太网口配置 ②路由器串口配置 ③路由器静态路由配置 方法一:网络路由 方法二:汇总路由1 方法三:汇总路由2 方法四:默认路由 2.主机配置 ...

  10. Linux虚拟机安装及与宿主机相互通信

    1.首先,我们先装Linux系统在VMWare上.新建虚拟机,点击自定义,选择下一步. 2.选择兼容性最好的硬件VMWare12.0选择下一步. 3.选择稍后安装操作程序,为程序方便运行,点击下一步. ...

最新文章

  1. Nat. Mach. Intell. | FFPred-GAN:“以假乱真“—基于GAN创建合成特征样本改进蛋白质功能预测...
  2. python最大公约数
  3. grep查找时,去掉grep本身那一条
  4. C++模板:类模板和类模板的友元【C++模板】(57)
  5. 修改参数failed_login_attempts=unlimited
  6. bzoj2375 疯狂的涂色
  7. 【Flink】源码-Flink重启策略-简介 Task恢复策略 重启策略监听器
  8. OC基础15:内存管理和自动引用计数
  9. 华为机试HJ9:提取不重复的整数
  10. PHP通过字符串调用函数
  11. [转载] python sorted 使用cmp函数时候注意cmp需要传入两个参数,传入两个参数机制的分析
  12. linux下安装yum命令
  13. 使用IPIP.net识别客户端真实访问地址,具体到国家,省,市
  14. 晶体管放大电路之应用
  15. 微信公众号插入公式介绍
  16. 微信公众平台卡劵功能接入指南
  17. 漏洞分析检测的主要技术
  18. [架构之路-51]:架构师 - 用系统化、结构化思维解决复杂难搞的软件故障问题 - 马克思主义哲学在软件系统中的应用
  19. winpe查看不到linux硬盘,winpe不显示硬盘?教你轻松搞定pe下不显示硬盘问题
  20. matlab卡住了 打不开,win7系统matlab打不开无法运行的解决方法

热门文章

  1. Sqlalchemy 乱码解决方法
  2. 攻击银行内网,黑客只要三步
  3. 关于Socket踩过的一些坑
  4. 给页面title添加图标
  5. ubuntu如何更改crontab的默认编辑器
  6. 运行IIS提示500.21错误
  7. 高质量的用户体验 推进IT运维向业务服务转变——中国移动通信集团公司
  8. 面试官:new Object[5] 一共创建了几个对象?
  9. 运维必读:避免故障、拒绝背锅的六大原则!
  10. 致运维——运维军团告诉你如何走过七年之痒