服务绑定(BinderService)

简介:

为了使Service支持绑定,需要在Service类中重载onBind()方法,并在onBind()方法中返回Service对象

 

 

Service

public class BinderService extends Service {

 

private static final String TAG = "BinderService";

private IBinder myBinder = new MyBinder();

 

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return myBinder;

}

 

public void MyMethod(){

Log.i(TAG, "MyMethod()");

}

 

public class MyBinder extends Binder{

public BinderService getService(){

return BinderService.this;

}

}

 

}

 

Activity

 

package com.mzh.www;

 

import com.mzh.www.BinderService.MyBinder;

 

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.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

 

 

/** 

* @Title: BinderServiceActivity.java

* @Package com.mzh.www

* @Description: 绑定服务

* @author mzh

* @version V2.2

*/

public class BinderServiceActivity extends Activity {

 

private static final String TAG = "BinderServiceActivity";

private Button startBinderBtn;

private Button stopBinderBtn;

private Boolean flag = false;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.binder);

       

        startBinderBtn = (Button)findViewById(R.id.startBinderService);

        stopBinderBtn = (Button)findViewById(R.id.stopBinderService);

        startBinderBtn.setOnClickListener(listener);

        stopBinderBtn.setOnClickListener(listener);

    }

   

    private OnClickListener listener = new OnClickListener() {

 

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.startBinderService:

bindService();

break;

case R.id.stopBinderService:

unbindService();

break;

 

default:

break;

}

}

 

};

 

private void unbindService() {

if(flag){

                          unbindService(conn);

                          Log.i(TAG, "unbindService()");

}

}

 

private void bindService() {

Intent intent = new Intent(BinderServiceActivity.this,BinderService.class);

bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

 

private ServiceConnection conn = new ServiceConnection() {

 

@Override

public void onServiceDisconnected(ComponentName name) {

flag = false;

}

 

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

MyBinder myBinder = (MyBinder)service;

BinderService binderService = myBinder.getService();

binderService.MyMethod();

flag = true;

}

};

 

}

取消绑定仅需要使用unbindService()方法,并将ServiceConnection()传递给unbindServicce()方法,但需要注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()仅在意外断开绑定时才被调用 

 

 

 

 

 小笔记:供自己加深记忆

 

 

 

看这个时可以参考:file:///D:/Android_Environment/android-sdk_r12-windows/android-sdk-windows/docs/guide/developing/tools/aidl.html#CreateAidl

 

 

 

 

AIDLAndorid Interface Definition Language)接口描述语言

 

 

 

 

Android系统中使用跨进程服务,一般按照以下三个步骤实现:

首先,使用AIDL语言定义跨进程服务的接口;

其次,根据AIDL语言定义的接口,在具体的Service类中实现接口中定义的方法和属性;

最后,在需要调用跨进程服务的组件中,通过相同的AIDL接口文件,调用跨进程服务。

 

ANDROID中,不同进程不能访问其他进程的内存控件,为了使数据能够在不同进程意会北,数据必须转换成为能够穿越进程边界的系统级原语,同时,在数据完成穿越后,还需要转换回原来的格式。

 

 

记住此处一点:AIDLJAVA中的接口定义类似,只是AIDL可以定义参数传递的方向,而JAVA接口定义不行

AIDL支持三种方式 in outinout,

in:标识的参数将从调用者传递到跨进程服务中,其它同理推

 

 

 

远程数据访问的创建和调用需要使用AIDL语言,一般有以下过程 

1.使用AIDL语言定义跨进程服务和接口。

2.通过继承Service类实现跨进程服务。

3.绑定和使用跨进程服务。

 

数据传递:

进程间传递的数据类型除了JAVA支持的基本类型以外,还可以是自定义的数据类型,但用户自定义数据类型时要实现Parcelable接口,使自定义的数据类型能够转换为系统级原语保存在Parcel对象中,穿越进程边界后可再转换为初始格式

AIDL支持的数据类型如下:

1.JAVA语言的基本类型

2.String

3.CharSequence

4.List

5.Map

List Map:其中所有的键和元素都必须是AIDL支持的数据类型

6.其它AIDL接口

7.Parcelable对象

 

 

 

 

 

      本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/733367,如需转载请自行联系原作者

 

相关文章
|
8天前
|
JavaScript
表单输入绑定 值绑定
表单输入绑定 值绑定
|
5月前
|
JavaScript 前端开发
js事件绑定的几种方式
js事件绑定的几种方式
114 0
|
5月前
|
JavaScript 前端开发
js事件绑定的几种方法?
js事件绑定的几种方法?
|
11月前
Listener概述、监听对象的创建和销毁、监听域对象属性变化、监听会话相关的感知型监听器及监听器实现
Listener概述、监听对象的创建和销毁、监听域对象属性变化、监听会话相关的感知型监听器及监听器实现
66 0
|
开发者
绑定(bingding)
绑定(bingding
66 0
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
851 0
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
|
开发者 Python
绑定端口的意义 | 学习笔记
快速学习绑定端口的意义
117 0
|
.NET 容器 开发框架
数据绑定(三)为Binding指定绑定源的几种方法
原文:数据绑定(三)为Binding指定绑定源的几种方法 Binding的源是数据的来源,所以,只要一个对象包含数据并能通过属性把数据暴露出来,它就能当作Binding的源来使用,常用的办法有: 一。
968 0
|
算法 网络虚拟化