一、绑定服务介绍
 
前面文章中讲过一般的通过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. C++内存分析

    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数 ...

  2. javaWEB国际化(jsp中使用)

    在jsp页面中使用国际化方法,首先将jstl开源架包:jstl.jar,standard.jar导进去 并在src目录下建立以test开头,.properties结尾的文件:test_en_US.pr ...

  3. I love sneakers!(分组背包HDU3033)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. 新建一个DataTable(只针对一列)

    /// <summary> /// 新建一个DataTable(只针对一列) /// </summary> /// <param name="dataStr&q ...

  5. 2014江西理工大学C语言程序竞赛初级组

    坐公交 解法:略 #include<stdio.h> #include<string> #include<iostream> #include<math.h& ...

  6. anroid

    http://mirrors.neusoft.edu.cn/more.we#android http://www.cnblogs.com/youxilua/archive/2013/05/20/308 ...

  7. RabbitMQ系列二(构建消息队列)

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心.下面我们就围绕这三个主要组件,从应用使用的角度全面的介绍如何利用RabbitMQ构建消息队列 ...

  8. 区分一下dpkg,rpm和yum以及apt-get

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系):U ...

  9. 成为Java顶尖高手要看的11本书

    成为Java顶尖高手要看的11本书 学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的 ...

  10. BZOJ 3460 Jc的宿舍

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3460 题意:一棵树.每个节点住一个人,这个人打水的时间为Ti.每次查询一个路径.这 ...