服务绑定(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,如需转载请自行联系原作者

 

相关文章
|
10月前
|
SQL 监控 数据可视化
完全开源!国内首个完全开源JAVA企业级低代码平台
JeeLowCode 是一款专为企业打造的 Java 企业级低代码开发平台,通过五大核心引擎(SQL、功能、模板、图表、切面)和四大服务体系(开发、设计、图表、模板),简化开发流程,降低技术门槛,提高研发效率。平台支持多端适配、国际化、丰富的组件库和灵活的布局设计,适用于 OA、ERP、IoT 等多种管理信息系统,帮助企业快速实现数字化转型。
完全开源!国内首个完全开源JAVA企业级低代码平台
|
6月前
|
弹性计算 Linux 数据安全/隐私保护
阿里云幻兽帕鲁联机服务器搭建全攻略,速来抄作业!2025新版教程
阿里云提供2025年最新幻兽帕鲁服务器申请购买及一键开服教程。4核16G配置支持8人,70元/月;8核32G配置支持20人,160元/月。选择配置、地域、操作系统后,点击【一键购买及部署】,约3分钟完成创建。本地安装STEAM客户端并登录,进入游戏选择多人模式,输入服务器IP和端口(8211),即可开始游戏。详细教程及更多问题解答请参考阿里云幻兽帕鲁游戏专区。
255 20
|
8月前
|
SQL DataWorks 监控
Dataworks入门
很久前试用DataWorks,初版功能完善,通过提工单解决问题并学会日志分析。Copilot接入后,发现其SQL功能未严格遵循阿里云官方文档,修改的SQL不尽如人意,有待提升。整体而言,DataWorks功能强大、可定制化高、集成方便,在大数据处理方面表现出色。
187 13
|
10月前
|
机器学习/深度学习 人工智能 大数据
量子计算的现状与未来:从实验室到商用
量子计算正从理论探索迈向实际应用,全球科技巨头和科研机构积极研发,已在特定任务上展现巨大优势。本文探讨量子计算的现状、挑战、发展趋势及商用潜力,涵盖药物研发、金融工程、大数据处理等领域,展望其未来对各行业的深远影响。
|
数据采集 数据挖掘 数据处理
Pandas如何安装在Windows系统?
【7月更文挑战第8天】Pandas如何安装在Windows系统?
731 2
|
Kubernetes Ubuntu 应用服务中间件
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
Ubuntu 22.04 利用kubeadm方式部署Kubernetes(v1.28.2版本)
3228 0
|
安全 网络性能优化 网络安全
别再让网络瓶颈困扰你!掌握这十种交换机接口模式,提升你的网络布局技能
【8月更文挑战第23天】交换机作为网络核心,其接口模式直接影响网络布局与性能。本文介绍了十大常见接口模式及其配置实例,包括基础接入模式、优化布线的干道模式、动态学习相邻交换机VLAN信息的动态中继协议模式、固定分配VLAN的静态接入模式、确保语音优先传输的语音VLAN模式、指定默认VLAN的native模式、增加带宽与可靠性的链路聚合及EtherChannel模式、保障网络安全的端口安全模式以及确保关键业务流畅传输的QoS模式。理解并掌握这些模式对于构建高效稳定的网络至关重要。
431 1
|
easyexcel 数据库
为获取导入百分比,使用easyexcel获取导入excel表总行数
为获取导入百分比,使用easyexcel获取导入excel表总行数
576 0
|
存储 运维 监控
阿里云IoT设备运维基础——监控报警介绍(一)|学习笔记
快速学习阿里云IoT设备运维基础——监控报警介绍(一)
阿里云IoT设备运维基础——监控报警介绍(一)|学习笔记
|
Kubernetes 网络协议 前端开发
Kubernetes MetalLB 作为 Load Balancer 下
Kubernetes MetalLB 作为 Load Balancer 下
510 1
Kubernetes MetalLB 作为 Load Balancer 下