博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Service学习篇三:Service启动方式之bindService
阅读量:5880 次
发布时间:2019-06-19

本文共 3767 字,大约阅读时间需要 12 分钟。

hot3.png

105515_03Ed_2296916.png

客户端通过调用bindService方法能够绑定服务,然后Android系统会调用服务的onBind回调方法,这个方法会返回一个跟服务端交互的IBinder对象。这个绑定是异步的,bindService方法立即返回,并且不给客户端返回IBinder对象。要接受IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService方法。

注意:只有Activity、Service和内容提供器(content provider)能够绑定服务,广播接收器是不能绑定服务的。

通过绑定服务来实现功能有以下几个步骤:

  1. 实现一个ServiceConnection接口,并重写里面的onServiceConnected和onServiceDisconnected两个方法,其中,前者是在服务已经绑定成功后回调的方法,后者是在服务发生异常终止时调用的方法。

  2. 在客户端,通过bindService方法来异步地绑定一个服务对象,如果绑定成功,则会回调ServiceConnection接口方法中的onServiceConnected方法,并得到一个IBinder对象。

  3. 服务端通过创建一个*.aidl文件来定义一个可以被客户端调用的业务接口,同时,服务端还需要提供一个业务接口的实现类,并实现*.aidl中定义的所有方法,通常让这个实现类去继承Stub类。

    注意:创建aidl文件时有几个注意点:

    (1)定义的方法前面不能有修饰符,类似于接口的写法。

    (2)支持的类型有:8大基本数据类型,CharSequence,String,List<String>,Map,以及自定义类型。

    自定义类型需要做到以下几点:

    1. 实现Parcelable接口。

    2. 定义一个aidl文件来声明该类型。

    3. 如果要在其他的aidl文件中使用,则必须要使用import来引用。

  4. 通过Service组件来暴露业务接口。

  5. 通过Service的onBind方法来返回被绑定的业务对象。

  6. 客户端如果绑定成功,就可以像调用自己的方法一样去调用远程的业务对象方法。

为了便于理解,可以看一看下面的这个项目,项目名为ServiceINS。

先来看看项目的构成:

154803_ShQ0_2296916.png

MainActivity:

package com.example.serviceins;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {	private ICat cat;	private boolean isBound = false;// 用于判断是否绑定	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);	}	// 绑定服务的连接回调接口	private ServiceConnection conn = new ServiceConnection() {		// 已经绑定完成时调用		@Override		public void onServiceConnected(ComponentName name, IBinder service) {			// 绑定成功后回调的方法			cat = ICat.Stub.asInterface(service);			isBound = true;			Toast.makeText(MainActivity.this, "绑定成功", Toast.LENGTH_SHORT)					.show();		}		// 服务发生异常终止时调用的方法		@Override		public void onServiceDisconnected(ComponentName name) {			isBound = false;		}	};	// 绑定服务	public void boundClick(View view) {		Intent intent = new Intent(this, MyBoundService.class);		// 这个绑定的步骤是异步的,绑定成功后会回调onServiceConnected方法		bindService(intent, conn, Context.BIND_AUTO_CREATE);	}	// 解除绑定	public void unBoundClick(View view) {		if (isBound) {			unbindService(conn);			Toast.makeText(MainActivity.this, "解除绑定成功", Toast.LENGTH_SHORT)					.show();		}	}	// 通过IPC调用业务方法	public void callClick(View view) {		if (cat == null) {			return;		}		try {			cat.setName("黑猫警长");			Toast.makeText(this,					cat.desc() + "\n" + cat.getPerson().toString(),					Toast.LENGTH_LONG).show();		} catch (RemoteException e) {			e.printStackTrace();		}	}}

activity_main.xml

    
    
    

ICat.aidl:

package com.example.serviceins;import com.example.serviceins.Person;interface ICat {	    void setName(String name);	    String desc();}

ICatImpl:

package com.example.serviceins;import android.os.RemoteException;import com.example.serviceins.ICat.Stub;/* * 业务接口的具体实现类 */public class CatImpl extends Stub {	private String name;	@Override	public void setName(String name) throws RemoteException {		this.name = name;	}	@Override	public String desc() throws RemoteException {		return "hello! my name is " + name + "," + "I am a police.";	}}

MyBoundService:

package com.example.serviceins;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyBoundService extends Service {	public MyBoundService() {	}	@Override	public void onCreate() {            super.onCreate();	}	@Override	public IBinder onBind(Intent intent) {	    return new CatImpl();	}	@Override	public boolean onUnbind(Intent intent) {	    return super.onUnbind(intent);	}	@Override	public void onDestroy() {	    super.onDestroy();	}}

转载于:https://my.oschina.net/u/2296916/blog/512368

你可能感兴趣的文章
python中类方法和静态方法区别
查看>>
HBase运维基础——元数据逆向修复原理
查看>>
input的button类型,点击页面跳转
查看>>
linux题目
查看>>
js网页定位,window,body元素的定位属性
查看>>
YII2的乐观锁和悲观锁
查看>>
java开发技巧之 lombok.jar包的使用
查看>>
Maven中-DskipTests和-Dmaven.test.skip=true的区别
查看>>
javaweb 基于springMVC实现文件上传
查看>>
2.1/2.2 系统目录结构 2.3 ls命令 2.4 文件类型 2.5 alias命令
查看>>
压缩打包介绍 、gzip压缩工具 、 bzip2压缩工具、xz压缩工具
查看>>
【技术系列】浅谈GPU虚拟化技术(第一章)
查看>>
Jerry的Fiori原创文章合集
查看>>
IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?...
查看>>
十六周三次课
查看>>
Kubernetes重大漏洞?阿里云已第一时间全面修复
查看>>
Java VM 内存 栈 堆 小笔记
查看>>
Tomcat部署时war和war exploded(可以热部署)
查看>>
31.网络相关 firewalld、netfilter 5表5链 iptables语法
查看>>
oracle里的正则表达式
查看>>