Android-APP之桌面宠物
源码:https://github.com/benxhinGH/Desktopet.git
本是需要研究android-app漏洞挖掘,那前提就是要先了解android-app的内部原理。于是开始上手学习android-app,借机参加了腾讯提供的android移动开发课程。
这个app主要是实现一个桌面宠物,同时可以提供多项功能:接受微信消息;闹钟功能;蓝牙配对;宠物属性设置等。其中我主要负责两个部分,一个是软件开始之前的设计工作;另一个是详细的设计蓝牙配对功能。
前期设计工作基本不做详细描述,主要是按照要求,并加上我自己的想法搭建起一个具体框架,具体的实现是由队友负责。
蓝牙配对功能是我实现的,操作方式是,当用户点击宠物的蓝牙配对功能时,就会根据提示打开蓝牙并且主动搜索其他的蓝牙设备,两个设备的宠物就可以进行通信;除此之外,计划的蓝牙配对还包含可以在一个界面内显示配对成功后对方的宠物。就像qq里边的厘米秀功能一样;我们可以利用java的多态特性,使得不同的宠物拥有相同的动作;我们就可以发送动作。
在这个过程中遇到的问题主要有:
A. android-app中蓝牙通信的原理
B. 蓝牙协议实现过程的代码完备性
C. 如何处理socket接口以及各个组件返回的信息
D. 句柄对各种返回信息的处理
E. Activity,Service,BroadcastReceiver等四大组件的生命周期(此功能中主要用到的是前三个)
F. 如何实现调用宠物对象到自己的容器内(暂未解决)
-----------------------------------------------------------------------------
此过程中的开发学习了git,可以使用git+github实现协作开发
-----------------------------------------------------------------------------
1.首先需要蓝牙权限&&设置蓝牙可见性:
l 允许程序打开蓝牙设备;并且连接到已配对设备
l 允许程序发现和配对蓝牙设备
l 其中遇到的疑惑:安全连接与不安全连接的区别
2.BluetootAdapter
l 本地蓝牙适配器;可执行基本的蓝牙任务;如:
l 启动蓝牙设备;查询已配对的设备列表;使用已知的MAC地址实例化一个BluetoothDevice类;创建一个BluetoothServerSocket建立来自其他设备的连接请求
l 获取蓝牙适配器getDefaultAdapter();开启蓝牙(Intentin activity+startActivityForResult);获取本地蓝牙信息(bluetoothAdapter.getAddres);搜索蓝牙设备,此过程为异步的,需要注册一个广播接收者,监听是否搜到设备(bluetoothAdapter.startDiscovery);监听扫描结果(通过广播接收者onReceive查看扫描到的蓝牙设备,每扫描到一个设备,系统都会发送此广播BluetoothDevice.ACTION_FOUND);停止搜索(bluetoothAdapter.cancelDiscovery)
3.SDP协议通信
l 服务器端:
a) 通过SDP协议建立链接进行通信;类似于平常使用的socket
b) 创建BluetoothServerSocket
c) 安全的RFCOMM Bluetooth socket:连接时需要配对
d) 不安全的RFCOMM Bluetooth socket:连接时不需要配对
e) AcceptThread创建侦听线程;accept阻塞;另一线程.close(),终止该阻塞;侦听到连接后连接;这里需要注意状态的的异常判断
l 客户端:
a) RFCOMM socket,并连接服务端。
b) 先扫描周围的蓝牙设备,如果扫描到指定设备则进行连接
c) ConnectThread
l 数据传输:
a) ConnectedThread
b) 发送数据
c) 接收数据
-------------------------------------------------------------------------
消息处理:分为两类:各个组件之间的消息传递+蓝牙配对之后两个设备之间的消息传递
第一部分的组件之间的消息传递主要使用的是各个组件内部的接口函数;比如activity的startActivityForResult函数;onReceive等
第二部分的两个设备连接之后通过蓝牙进行传递的主要是利用消息句柄;这里的消息句柄不仅处理蓝牙通信过程中的数据;还会处理蓝牙连接和配对过程中的蓝牙状态/控制信息。这些需要非常严谨的逻辑,并且处理整个流程可能会出现的异常。这部分借鉴了google的sample,不得不说高级工程师的代码还是很牛的。
--------------------------------------------------------------------------
Activity : 不同的启用模式对应任务栈的改变情况;比如Standard、SingleTop、SingleTask..
生命周期:onCreate() onStart() onStop() 。
Service: 1.Service不是一个单独的进程,它和它的应用程序在同一个进程中
2.Service不是一个线程,这样就意味着我们应该避免在Service中进行耗时操作
onCreate()、onStart()或者说是onStartCommand();onDestroy()
Broadcast: 所有广播会一起收到广播;广播不可以被截断同时也不可以对传输的数据进行修改
contentProvider: ContentProvider 实例通过处理来自其他应用的请求来管理对结构化数据集的访问。所有形式的访问最终都会调用 ContentResolver,后者接着调用ContentProvider的具体方法来获取访问权限。
Intent: 协助应用间的交互与通讯;Intent负责对应用一次操作的动作、动作设涉及数据、附加数据进行描述,Android则根据此Intent描述,找到对应组件,将Intent传递给调用的组件,并完成组件调用。