1 界面设计及实现
一、统一管理
客户端软件有多个界面切换,每个 activity 都有生命周期。Activity 从创建到销毁分别有如下状态:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()、onRestart()。如下图所示,activity 的生命周期分为以下几个过程:1.启动 Activity:系统在启动 Activity 阶段会依次调用 onCreate(),onStart(),onResume()三个方法。2.当前 Activity 被其他 Activity 覆盖其上或被锁屏:系统会暂停当前 Activity的执行,并且调用 onPause 方法。3.当前 Activity 由暂停状态回到前台或者解锁: onResume()方法会被调用,当前 Activity 再次进入运行状态。4.当前 Activity 转到 Home 界面或者被新的 Activity 覆盖时,系统会先调用onPause()方法,然后再调用 onStop()方法,当前页面进入停滞状态。5.用户后退回到此 Activity:系统会依次调用 onRestart(),onStart(),onResume()等方法,再次进入运行状态。6.当前 Activity 处于后台不可见状态或者被覆盖状态,即按照第 2 步和第 4 步处理,系统内存不足时,会杀死当前页面,再依次调用 onCreate(),onStart(),onResume()方法进入运行状态。7.用户退出当前 Activity:系统会依次调用 onPause(),onStop(),onDestory()等方法结束当前 Activity。
综上所述,整个平台需要一套机制能够对所有 activity 进行周期管理。本平台设计方案根据 activity 的生命周期特点建立一个堆栈(stack)对所有 activity 进行管理。每次打开一个新的界面就用 addActivity()压入堆栈,返回原界面只需将堆栈的栈顶元素取出关闭,后台隐藏的界面会 onResume()。编码时,在基类 Activity里面加入 ActivityManager.activitymanager.activitystack.add(this);即可。所有的界面都通过 ActivityManager 管理。当需要关闭某个界面只需在 onDestroy()调用ActivityManager.activitymanager.activitystack.finish(this)即可。
二、利用 IOC 简化界面初始化
IOC(Inversion of Control)在很多资料里面被翻译为“控制反转”,也有的翻译为“控制倒置”和“控制反向”。每个页面都有各种控件,如 button,TextView,ImageView 等。这些控件初始化需要调用 findViewById(),从而产生冗余繁杂的初始化代码。本文中客户端软件设计利用依赖注入来解决初始化代码繁杂的问题。首先声明一个注解@InterfaceBindview ,其次在注解里声明二个方法,也就是二个配置参数:一个为 int 类型的 id(),另一个为 boolean 类型的 click()。最后定义一个注入工具类 AnnotateUtil(),在函数 initView 里面传入 Activity 对象,利用传入的对象可以获得所有的 field(属性),再遍历所有的 field 获取 bind view,从获取到的 bind view 中提
取id和click属性,如果提取到的click为true则用setOnClickListener((OnClickListener) currentclass);设置这个 field 的监听函数。用 field.set(currentclass, sourceView.findViewById(id));设置这个 field 的值。只需在 BaseActivity 中加入 AnnoteUtil.initView(this)就完成了各个界面控件的注入,其余界面 Activity 都继承这个 BaseActivity。
三、 几种特定类型的图形编程
Android 中所有的 View 都可以自定义。自定义 view 时,继承系统 View 类,重写 onDraw(),在这个函数里面可以用画笔 paint 绘出自己想要的图形,然后再dispatchTouchEvent()、onTouchEvent()里面监听手势行为,进行定制化控制。在实际项目过程中,总结了一下几种特定场景下的图形编程:1. LayerList 将若干张图片叠加的方式来制作图形,最终代码里面一个LayerDrawable 对象代表一张最终的图片。2. StateList 主要应用于对一个空间,当该控件获取焦点时会是一种界面上的表现,当该控件被按下时是另外一种界面上的表现。3. Level list 主要用于根据不同的状态来显示不同的图片这个场景,如电池电量的变化。4. Shape Drawable 图形资源是用 XML 文件生成几何图形的一种技术,这些几何图形包括矩形、椭圆形、圆形、三角形等。5. Gallery 提供一个画廊效果,通过左右滑动,可以浏览 Gallery 中的图片。Gallery 可以通过拖动的方式来向右和向左移动图像列表。当单击当前图像的前一个图像时,该图像列表向右移动一格。当单击当前图像的后一个图像时,该图像列表会向左移动一格。
2 音量控制与自检模块
一、 音量控制原理分析
基于本文设计方案的第一代移动端设备采用无屏设计,仅设计音量+、音量-、拨号键供用户操作,每次用户按键都会播报“音量加”、“音量减”等语音。当用户连续按音量键,不断播放“音量加”与“音量减”的语音提示会引起用户的厌烦情绪。为解决上述问题,客户端设计将按键动作分为三种:短按、长按、速按。每次按键都会使 Android 平台的 onKeyDown()与 onKeyUp()响应,每次进入这二个函数就记录系统时间,并且与上次系统时间对比,当小于设定的闸值时既速按,对该次按键不予响应。长按键系统会不停地进入函数,相当于速按操作。5.1.2.2 系统自检模块
因本文采用的智能终端为无屏智能终端,用户使用过程中遇到某些问题的时候,无法在最短的时间内解决,故提出系统自检模块设计方案。任意时刻用户想了解产品的具体信息,只需用户按出“01010001”的按键指令,终端会用语音播放此时终端的蓝牙、网络、软件版本、OBD 是否工作等信息。音量+代笔“1”,音量-代表“0”,设定一个闸值时间,软件后台服务统计所有在闸值时间范围内的按键指令。
3 自动更新模块
软件发布稳定版本后,会根据运行状况以及后期需求的变化实时修改,发布新的软件版本。移动终端升级软件保证在不影响用户正常使用的情况下,静默安装升级软件。软件版本更新原理:每一次软件版本更新,版本号都会以文本的形式保存到一个本地文件 version.txt 当中。服务器更新了软件版本,服务器把消息通过心跳通知所有移动终端,移动终端在凌晨 1 点、用户没有使用的情况下,唤醒自身飞行模式,通过 GPRS 下载新版本软件,下载后,覆盖安装。如果在这个时间点上,用户正在使用产品,则顺延一天。
4 语音播报优先级管理
为便于管理 TTS 的播放,方案为 TTS 设定一个语音播报队列。终端产品使用过程中产生的语音有:系统语音(信息、导航)、媒体功能语音、警告语音(车况警告)等。任意时刻系统产生地待播报语音都插入语音播报队列,TTS 从该队列里面依次提取语音播放。按照常规队列的时间顺序来播放语音队列显然是不合理的,如紧急情况下的语音应该立即反馈给用户。故系统设计方案对语音加了优先级属性,系统将优先级分为 3 级:0 为一般优先级、1 为警告优先级、2 为系统级别优先级,3 清空前面所有语音且立即播放。语音队列会提取出优先级最高的语音给 TTS 播报。用户使用媒体功能时,车辆超速了,终端会产生一个超速的警告语音插入 TTS 语音队列,那么 TTS 会暂停媒体播放,插入警告语音播报。
5 智能休眠唤醒模块
车载产品的电池电量一直用来衡量产品优劣的重要参数,本文提出的软件设计方案为提高电池电量的耐用性,添加了智能休眠唤醒功能,增长电量的使用时间。智能休眠唤醒模块主要依据水平方向的位置加速度以及增值服务的使用情况来判断是否达到休眠的条件。每隔 10s 定时器模块获取一次设备 x、y、z 方向的线性加速度 Sensor.TYPE_LINEAR_ACCELERATION。休眠条件:加速度参数无变化且设备无任何服务运行。唤醒条件:第一种情况是用户主动唤醒通过按终端按钮或摇晃终端的方式。陀螺仪检测到轻微震动将结果反馈到后台服务软件,后台服务软件对反馈进行处理。第二种情况是软件获取到终端运动情况发生变化,自动唤醒终端。
6 NDK 封装
一、 NDK 与 JNI 的关系
(1)JNI 简介
Java 语言提供 JNI 作为与 C/C++之间沟通的桥梁。在 android 中通常将某些功能部分的 C/C++代码打包成为.so 库文件,在代码里面可以通过调用 JNI 来调用本地的 C/C++代码,本地的 C/C++的代码同时也可以调用 Java 代码,本地 C/C++多线程代码也可以使用 Java 代码,C 代码为 java 增加了高效性是 Java 中使用 C 库的重要原因。
(2)NDK 简介
Android 的 NDK(Native Development Kit)开发工具集是 Android 为了更方便Android程序开发人员通过JNI的机制达到Java和本地C/C++代码相互沟通的强有力武器。通过 Android 的 NDK,Android 软件工程师可以很方便地实现 Java 和本地 C/C++代码的相互调用,充分发挥本地硬件的特性和 C/C++代码的高效性。
二、 NDK 开发的具体流程
(1)编写包含 native 本地方法的 Java 类。(2)使用 javah 工具生成 C/C++语言对应的头文件。(3)使用 C/C++语言实现头文件。(4)用编译工具将 C/C++代码进行本地编译,最后通过链接生成*.so 可执行的 C/C++库。(5)Java 代码通过 JNI 实现与 C/C++代码的交互。
1、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“文章版权申述”(推荐),也可以打举报电话:18735597641(电话支持时间:9:00-18:30)。
2、网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
3、本站所有内容均由合作方或网友投稿,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务。
原创文章,作者:写文章小能手,如若转载,请注明出处:https://www.447766.cn/chachong/649.html,