一、绑定服务介绍
 
前面文章中讲过一般的通过startService开启的服务,当访问者关闭时,服务仍然存在;
但是如果存在这样一种情况:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定;
 
如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定;
如果多次调用bindService()多次绑定服务,则不会有副作用(导致多次绑定);
 
绑定服务的运行流程如下图所示:
 
 

二、Bind Service 核心代码

 
 
绑定与解绑定服务
 
 
(1)Context.bindService(Intent service,ServiceConnection conn,BIND_AUTO_CREATE);//绑定服务
(2)Context.unbindService(ServiceConnection conn); //解除绑定服务
 
 
ServiceConnection
 
 
ServiceConnection为一个接口,用于绑定和解绑定IBinder,因此需要创建一个类实现它;
class XxxServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//service为在onBind返回的IBinder
//绑定Binder对象
}
@Override
public void onServiceDisconnected(ComponentName name) {
//解绑定Binder对象
}
}
 
 
Service类
 
 
class XxxService extends Service{
private IBinder binder = new
XxxBinder();
public IBinder onBind(Intent intent){
return binder;
}
public int fun(int a){
//服务提供的方法,但是不能直接调用
...
}
private class XxxBinder extends Binder implements IXxxBinder{
//面向接口编程
public return fun1(int a){
//对外暴露的API
return fun(a);
//内部调用Service的方法
}
}
}
 
 
三、BindService案例
 
 
 
场景:服务提供了加法运算的接口,Activity需要调用服务提供的加法运算方法,并返回结果;
 
效果说明:
 
 
 
MainActivity.java
 
package com.xiazdong.bindservice;

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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity {
private EditText op1,op2;
private Button button;
private TextView result;
private IAddOp binder ;//使用接口IAddOp
private ServiceConnection conn = new AddOpServiceConnection();
private OnClickListener listener = new OnClickListener(){
@Override
public void onClick(View v) {
int number = binder.addOpService(Integer.parseInt(op1.getText().toString()), Integer.parseInt(op1.getText().toString()));
result.setText("result="+number+"");
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
op1 = (EditText)this.findViewById(R.id.op1);
op2 = (EditText)this.findViewById(R.id.op2);
result = (TextView)this.findViewById(R.id.result);
button = (Button)this.findViewById(R.id.button);
button.setOnClickListener(listener);
Intent service = new Intent(this,AddOpService.class);
this.bindService(service, conn, BIND_AUTO_CREATE);
}
private class AddOpServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {//绑定服务时调用
binder = (IAddOp)service;
}
@Override
public void onServiceDisconnected(ComponentName name) {//解绑定服务时调用
binder = null;
}
}
}

AddOpService.java

 
package com.xiazdong.bindservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder; public class AddOpService extends Service {
private IBinder binder = new AddOpBinder(); public int add(int a,int b){ //服务提供的方法
return a+b;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
} private class AddOpBinder extends Binder implements IAddOp{
public int addOpService(int a, int b) { //binder对外暴露一个API调用服务提供的方法
return add(a,b);
}
}
}
IAddOpService.java
 
package com.xiazdong.bindservice;

public interface IAddOp {
public int addOpService(int a,int b);
}

Android入门:绑定本地服务的更多相关文章

  1. Android入门(十八)服务

    原文链接:http://www.orlion.ga/674/ 一.定义一个服务 创建一个项目ServiceDemo,然后在这个项目中新增一个名为 MyService的类,并让它继承自 Service, ...

  2. andorid service 本地服务

    ActivityManifect.xml <?xml version="1.0" encoding="utf-8"?> <manifest x ...

  3. Android Service学习之本地服务

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过来声明.可以通过contect.startservice和contect.bindse ...

  4. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

  5. Android本地服务

    一.服务生命周期总结 (一).单独开启服务,并没有绑定服务Activity中调用startService(),服务的lifecycle:onCreate()→onStartCommand()→onSt ...

  6. Android Service总结04 之被绑定的服务 -- Bound Service

    Android Service总结04 之被绑定的服务 -- Bound Service 版本 版本说明 发布时间 发布人 V1.0 添加了Service的介绍和示例 2013-03-17 Skywa ...

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

    步骤就是 1:新建LR脚本.协议选择Mobile Application - HTTP/HTML 2:在record里选择第三个:Record Emulator........ 3:  选择下一步后, ...

  8. Android学习笔记_22_服务Service应用之—与Activity进行相互通信的本地服务

    一.启动服务的两种方法方法: 第一种:  startService()和stopService()启动关闭服务.适用于服务和Activity之间没有调用交互的情况.如果相互之间需要方法调用或者传递参数 ...

  9. Android菜鸟的成长笔记(18)——绑定本地Service并与之通信

    在上一篇中介绍了Service与Activity的区别及Service两种启动方式中的第一种启动方式startService(). 我们会发现用startService().stopService() ...

随机推荐

  1. maven 手动安装jar到仓库的命令

    mvn install:install-file -DgroupId=com.sun -DartifactId=tools -Dversion=1.6.0 -Dpackaging=jar -Dfile ...

  2. C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~

    暑假集训虽然很快乐,偶尔也会比较枯燥,,这个时候就需要自娱自乐... 然后看hdu的排行榜发现,除了一些是虚拟测评机的账号以外,有几个都是AC自动机器人 然后发现有一位作者是用网页填表然后按钮模拟,, ...

  3. Java中的ClassLoader

      Java中类的加载过程(如Dog类):   通过类型信息定位Dog.class文件. 载入Dog.class文件,创建相应的Class对象. 执行父类的静态字段定义时初始化语句和父类的静态初始化块 ...

  4. Poj(1325),最小点覆盖

    题目链接:http://poj.org/problem?id=1325 Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total ...

  5. SQL生成规则数

    --------------------------开始----------------------------开始值DECLARE @start INT = 1--结束值DECLARE @end I ...

  6. SPRING官方网下载地址

    SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...

  7. Flume-NG + HDFS + HIVE日志收集分析

    摘自:http://blog.csdn.net/cnbird2008/article/details/18967449

  8. ios沙盒路径

    http://www.cnblogs.com/ios-wmm/p/3299695.html iOS沙盒路径的查看和使用 NSString *path = NSHomeDirectory();//主目录 ...

  9. excel小写金额转换成中文大写

    假设 假设数据在A1单元格 任何一个个单元格输入公式=TEXT(INT(A1),"[dbnum2]")&"元"&IF(INT(A1*10)-IN ...

  10. C#实现ActiveX控件开发与部署

    现在,我们手里已经有了这个控件包:QRCode.cab,下面我们编写一个测试的网页 <html> <head> <title>无标题页</title> ...