版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
安卓移动医疗应用开发蓝牙通讯小工具设计实验06Contents.1实验内容2实验原理3代码分析线性布局管理器经典蓝牙通讯流程蓝牙权限BluetoothAdapter类的用法BluetoothDevice类的用法蓝牙套接字Android中的IO反射Handler内存泄露的处理Bundle用法synchronized的用法增强for循环遍历set集合中的元素StringBuilder的用法1.实验内容学习蓝牙通讯使用到的相关知识点,了解蓝牙通讯过程,然后通过AndroidStudio完成蓝牙应用的界面布局,并依据本章完善蓝牙通讯程序,设计出一个蓝牙通讯App。扫描设备数据收发蓝牙主界面蓝牙使用界面2.实验原理2.1线性布局管理器线性布局(LinearLayout)指将控件按照垂直或水平方向布局,控件一个紧挨着一个排列XML属性描述android:orientation指定布局管理器内控件的排列方式,可选horizontal(水平排列)和vertical(垂直排列)android:background指定控件的背景,可以是背景图片或颜色。android:visible指定控件是否可见,true可见,false不可见android:paddingLeft属性值为距离值,指定距离父布局左边界的距离android:textColor指定控件字体颜色,可使用android:textColor=“@color/colort_white”蓝牙通讯工程布局中的XML属性对比相对布局?线性布局整齐相对布局复杂2.实验原理2.2经典蓝牙通讯流程声明蓝牙权限:Android6.0(API23)开始需要使用位置权限获取蓝牙适配器并打开蓝牙搜索设备:BluetoothAdapter类,BluetoothDevice类定义广播接收:扫描状态、发现蓝牙设备、蓝牙设备连接状态蓝牙设备的配对/绑定:反射建立连接:BluetoothSocket类;客户端,服务端数据通讯:AndroidIO(InputStream和OutputStream类)客户端(安卓APP)服务端(人体生理参数监测系统)扫描蓝牙完成的广播:BluetoothAdapter.ACTION_DISCOVERY_FINISHED发现一个可用蓝牙设备的广播:BluetoothDevice.ACTION_FOUND蓝牙设备连接状态改变的广播:BluetoothDevice.ACTION_BOND_STATE_CHANGED蓝牙相关广播:2.实验原理2.3蓝牙权限权限权限名权限等级使用说明作用蓝牙权限BLUETOOTHnormal级在Manifest里面声明请求/接收连接数据传输BLUETOOTH_ADMIN初始化设备查找控制蓝牙设置位置权限ACCESS_COARSE_LOCATIONdangerous级6.0及后续版本除了蓝牙权限还需申请位置权限位置权限除了需要在Manifest里声明之外,还需要在代码中进行动态申请通过WiFi或移动基站获取粗略定位(误差在30~1500米)ACCESS_FINE_LOCATIONGPS精确定位(精度10米以内)2.实验原理2.4BluetoothAdapter类的用法BluetoothAdapter类的介绍:
本地蓝牙适配器,是所有蓝牙交互操作的入口点,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其他蓝牙设备,查询绑定配对设备的列表,使用已知的Mac地址实例化BluetoothDevice以及创建BluetoothServerSocket用来侦听来自其他设备的通信。BluetoothAdapter类中蓝牙操作的相关方法:获取本地蓝牙适配器:getDefaultAdapter(
)启动扫描设备:startDiscovery(
)取消扫描设备:cancelDiscovery(
)获取已配对设备:getBondedDevices(
)通过mac蓝牙地址获取蓝牙设备:getRemoteDevice(Stringaddress)创建一个监听连接(作为服务端连接):listenUsingRfcommWithServiceRecord(
)2.实验原理2.5BluetoothDevice类的用法BluetoothDevice对象的获取途径:
调用BluetoothAdapter的getRemoteDevice(address)方法获取物理地址对应的该类对象调用BluetoothAdapter的getBoundedDevices()方法,可以获取已经配对的蓝牙设备集合BluetoothDevice类的相关方法:获取设备名称:getName()获取设备地址:getAddress()绑定/配对设备:createBond()获取绑定状态:getBondState()通过UUID获取一个BluetoothSocket对象:BluetoothSocketcreateRfcommSocketToServiceRecord(UUID)BluetoothDevice类的介绍:
表示远程的蓝牙设备,利用它可以通过BluetoothSocket请求与某个远程设备建立连接,或查询有关该设备的信息,例如设备的名称、地址、绑定状态等。2.实验原理2.6蓝牙套接字客户端(APP)获取BluetoothSocket端口发起连接通过socket的connect()方法打开数据流通过socket获取InputStream和OutputStream类,使用输入输出流对应的方法与其他蓝牙设备进行通讯服务端(监测系统)获取BluetoothServerSocket端口侦听连接请求通过socket的accept()方法接受连接,然后返回已连接的BluetoothSocket。打开数据流BluetoothSocket:表示蓝牙套接字接口。BluetoothServerSocket:表示用于侦听传入请求的蓝牙服务器套接字。蓝牙串口服务的通用唯一识别码UUID注意:connect()和accept()是阻塞调用,因此应始终在主Activity(界面)线程以外的线程中执行此步骤允许应用使用InputStream和OutputStream与其他蓝牙设备交换数据的连接点。2.实验原理2.7Android中的IOAndroid的网络通信、文字读写都会用到输入输出流(IO流)来进行操作。IO流的根类: 输入流—InputStream,其中包含read(byte[])方法 输出流—OutputStream,其中包含write(byte[])方法注意:read(byte[])和write(byte[])方法都是阻塞调用。read(byte[])方法将会阻塞,直至从数据流中读取数据。write(byte[])方法通常不会阻塞,但若远程设备调用read(byte[])方法的速度不够快,进而导致中间缓冲区已满,则该方法可能会保持阻塞状态以实现流量控制。IO流按流向分类:输入流和输出流 输入流—用于读文件或外部设备,并将读到的数据暂存到内存 输出流—用于写文件或外部设备,并将内存中的数据存入到文件或外设IO流传输方式: 字节流(用于读写二进制数据、任何类型文件及外设数据),以字节为读写单位2.实验原理2.8反射使用class对象之获取某个成员方法:获取指定名称的方法: MethodgetMethod(Stringname,类<?>...parameterTypes)
参数介绍:name-方法名;parameterTypes-参数类型的类执行方法:
ObjectMethod.invoke(Objectobj,Object...args)
参数介绍:obj-对象名;args-参数使用场景:使用反射调用createBond()方法。API19(Android4.4)之前该方法为@hide的,代表编译时不对外公开该方法,但是运行时可以访问到,这种情况使用反射可以调用createBond()方法。反射的概念:在程序的运行过程中,对于任何一个类,都能够知道它的所有属性和方法;对于任意一个对象,都能够知道它的任意属性和方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。好处:在程序运行过程中,操作这些对象。解决版本兼容的问题,可以低版本SDK开发的代码中访问不对外公开的方法。获取class对象的方式:类名.class,通过类名的属性class获取2.实验原理2.9Handler内存泄露的处理内存泄露的原因:GC垃圾回收机制不会回收还存在引用的Activity。导致本该被回收的Activity停留在内存中,产生内存泄露。在java中非静态内部类和匿名内部类都会隐式持有当前类的外部引用;Handler是非静态内部类,所以其持有当前Activity的隐式引用;GC垃圾回收机制不会回收还存在引用的Activity。当Activity不再使用需要被回收时,如果Handler没有被释放,会导致本该被回收的Activity停留在内存中,产生内存泄露。解决方案:方法一:通过程序逻辑来进行保护。在Activity被销毁时,在onDestroy()中调用Handler的removeCallbacksAndMessages()方法,把消息对象从消息队列移除。方法二:将Handler声明为静态类。静态的内部类不会持有外部类的引用,但当handler不再持有外部类对象的引用时,导致程序不允许在handler中操作Activity中的对象,需要在handler中增加一个对Activity的弱引用。2.实验原理2.10Bundle用法Bundle介绍:Bundle经常使用在Activity之间或者线程间传递数据。它保存的数据,是以key-value(键值对)的形式存在的。传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。以传递字符串类型数据为例:Messagemsg=myHandler.obtainMessage(intwhat);Bundlebundle=newBundle();bundle.putString("key1","value1");bundle.putString("key2","value2");msg.setData(bundle);myHandler.sendMessage(msg);HandlermyHandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){switch(msg.what){caseMESSAGE_TOAST_1:
Toast.makeText(getApplicationContext(),msg.getData().getString("key1"),Toast.LENGTH_LONG);break;default:break;}}}Bundle提供putString()和getString()方法用来读写基本数据类型Message提供setData()和getData()方法用来发送和获取bundle对象2.实验原理2.11synchronized的用法synchronized介绍:synchronized是Java中的关键字,是一种同步锁,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;修饰一个普通方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
synchronized(this){//同步代码块}修饰代码块:修饰符synchronized返回值
方法名(){//方法体}修饰普通方法:2.实验原理2.12增强for循环遍历set集合中的元素Android中List、Set、Map数据结构数据结构特点List有序集合,允许元素重复Set无序集合,不能有相同的元素Map使用键值对的方式来存储数据,键不能有重复,值可以重复for(数据类型变量:集合){//这里写要遍历的元素,或者所需要的代码即可}增强for循环的语法结构:2.实验原理2.13StringBuilder的用法String,StringBuffer与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 羊水栓塞的护理团队领导力培养
- 贫血的临床表现与诊断
- 护理标准化方案的健康促进
- 痹症中医护理康复指导
- 母婴护理学专业培训
- 老年护理中的内分泌护理
- 腹部手术病人术后并发症预防与处理
- 2026年教育科技人才一体推进与新质生产力题库
- 2026年消防安全知识与应急疏散演练试题
- 高钾血症患者的家属教育与支持
- 2026年期货技术考前冲刺练习及完整答案详解【历年真题】
- 厦门广电集团招聘笔试题
- 人社局档案三合一制度方案
- 2025年北京市海淀区中考化学真题
- 2025年法考《商经法》真题汇编
- 2025年工艺工程师招聘面试参考题库及答案
- 补气血培训课件
- 有限空间应急预案演练脚本方案
- 【《无人机发动机技术发展分析》3000字】
- CSTM-成核剂 N,N-二环己基对苯二甲酰胺编制说明
- 立夏养生中医养生
评论
0/150
提交评论