基于蓝牙的考勤系统
基于蓝牙的考勤系统-用户界面设计 基于蓝牙的考勤系统 摘 要 随着教育的普及,大学生的数量也越来越多。不同于初高中的管理,大学更偏向于自主学习。且高校流行选分制度班级流动性增强,因此大学生获得了更多课程选择上的自由度,班级概念弱化,因此学生有着充裕的时间可以去做自己喜欢的项目,从而在自己喜欢的项目上大放异彩,但是在这种情况下,学院管理难度变大。有些学生过于放纵导致对上课产生厌倦情绪,因此产生了逃课,代名互相顶替等行为。而且有些老师淡化管理,进一步纵容了这种行为。在传统的考勤方式比如口头点名,在学生人数太多情况下很难有效检测这些行为。因此,为了杜绝这种行为,基于蓝牙的考勤系统被广泛的应用起来。
本设计虽然叫基于蓝牙的考勤系统,但蓝牙只负责签到,连接信息交互这方面的功能,其他数据的交互只要靠app和服务端完成。本文主要描述在设计的工作原理和各个模块的内容。本设计以数据库和服务端的交互和作为核心,让学生的蓝牙名称改为自己学号,让设备自己进行搜寻和定位,从而确定学生状态。mysql是服务端的数据库主要用来处理登录、注册、收发通知sqlite为本地数据库,主要用来存储蓝牙通讯的签到以及请假的数据。对于缺勤的学生做出特殊标记且显示出勤率,事后打包信息传送给相关管理人员。这种方法能提高学生出勤率,也能改善教学质量。而且比口头点名更加现代 化. 。
关键词:蓝牙考勤;
数据库;
服务端;
Bluetooth Management System Based on - User Interface Design Abstract With the popularization of education, the number of college students is increasing. Different from the management of junior and senior high schools, universities prefer autonomous learning. In addition, the class mobility of the popular selection and scoring system in colleges is enhanced, so college students have more freedom in course selection and class concept is weakened. Although there is plenty of time to do the projects they like, so as to shine in the projects they like, in this case, the school management becomes more difficult. Some students are so indulgent that they get bored of classes, so they skip classes and substitute for each other. And some teachers downplay the management, further condoning this kind of behavior. In traditional attendance methods such as oral roll call, it is difficult to detect these behaviors effectively when there are too many students. Therefore, in order to eliminate this kind of behavior, bluetooth based attendance system is widely used.Although this design is called a bluetooth-based attendance system, bluetooth is only responsible for check-in, connection information interaction, other data interaction as long as the app and the server to complete. This paper mainly describes the working principle in the design and the content of each module. The design of the database and server side of the interaction and as the core, let the students' bluetooth name changed to their student number, let the device to search and locate, so as to determine the status of students. Mysql is a server-side database mainly used to handle login, registration, send and receive notification sqlite is a local database, mainly used to store the bluetooth communication check-in and leave data. Students who are absent from school are specially marked and their attendance is displayed. The information is then packaged and sent to the relevant management. This method can improve student attendance and the quality of teaching. And it's more modern than a verbal roll callKeywords: Database;
Bluetooth Managerment System;
Clinet-side System 目 录 1前言 1 1.1本设计的目的、意义及应达到的技术要求 1 1.2本设计在国内外的发展概况及存在的问题 1 1.3本设计应解决的主要问题 2 2搭建环境及工具 2 2.1关于Android Studio 2 2.1.1介绍 2 2.1.2环境搭建 2 2.2 关于MyEclipse 2 2.2.1 介绍 2 2.3关于Mysql 2 2.3.1介绍 2 2.3.2环境搭建 3 2.4操作系统选择 3 2.4.1关于Android 3 2.4.2Android架构 3 2.4.3Andr应用程序oid开发的四个主要模块 4 2.5语言JAVA 4 3设计原理 5 4用户界面设计 5 4.1用户界面设计的原则 5 4.1.1界面整洁 5 4.1.2通用性 5 4.1.3合理的界面布局 5 4.14界面设计使用到的布局属性 6 5教师学生界面设计 10 5.1注册界面 10 5.2欢迎界面 10 5.3查询请假界面 10 5.4工具栏界面 11 5.5 登录界面 11 5.6关于系统界面 11 5.7左滑小菜单 11 5.8教师功能界面 11 5.9学生功能界面 12 6接口设计 12 7考勤签到设计原理 13 8总结工作与展望 13 参考文献 14 谢 辞 16 1 前言 在现代化信息管理的时代下 ,教育工作者可用蓝牙考勤系统进行签到。学生可以进行请假,进而更好安排自己的学习计划。老师端不仅可以通过考勤检查学生到勤状况,还可以发布群消息。不仅节省了人工成本,还提高了效率。本设计的基于蓝牙的考勤系统是基于app和服务端交互,蓝牙之间连接。课题针对用户界面设计,意在做出互动性强的界面。[1] 1.1本设计的目的、意义及应达到的技术要求 目前,考勤签到多采占用时间长效率的口头签到,这样易造成课堂学生学习时间减少,时间花在考勤。为了造就一个良好的教学环境,本设计易在完成一个先进高效的蓝牙考勤系统,并使用Android设计一个一致性高,受众广,易上手,界面切换迅速,字体颜色分布看着舒适的界面。选择一个主要色调作为APP的主题色。让操作达到简单舒适的范畴,合理传达视觉元素,达到信息对于用户来说一目了然。
1.2本设计在国内外的发展概况及存在的问题 近年来随着大学生数量增多,考勤任务变得越来越兼巨,拖延时间也长。教师也不可能每节必点名,这样引起学生的侥幸心理,对学生的学习和发展无疑是种巨大的影响。而改变机制使得点名时间大幅度减少,效率变高。而用户界面设计也是不可或缺的一环,因为考勤的顺利与否会影响积极性(用户体验),所以优化用户使用感受,尽量使用户感受傻瓜式体验。因为企业学习都是追求效率,时间就是金钱,在这种基础上蓝牙考勤系统越来越普及。无论国内还是国外,在不久的将来,口头点名这类地效率低下的方式最终将被淘汰。[4] 在国外,app的设计更加人性化,他们把用户体验作为最终目标,打造了许多让人爱不释手的app。那些app下载率都高居不下,见到有趣十分减压,它由许多元素组成,譬如俏皮的文字,适宜的画面,完美的组合成了这个app,多次使用视觉手法,引发人们的共鸣。
所以一个好的用户体验是用户对这个app的直观感受,不夸张地说一个良好的互动的的确确能影响到用户对其的使用积极性,从而引发一系列相关连锁问题。本设计以安卓为平台,以点名app为媒介,找到符合大众视觉需求的界面样式。以舒适简洁好用出发。
但是受限于某些限制,国内设计的操作系统在经验和性能上与国外还有一定差距,手机用户界面没有国外那么人性化,缺少良性互动,缺少实用性。所以应该想方设法增加客户粘。
1.3本设计应解决的主要问题 打造用户喜欢的用户界面,根据用户的使用习惯设计界面,如阅读习惯,信息语言使用是否恰当,数据对齐排列,屏幕各类图标摆放适宜。减少app中广告植入,过多的广告植入不在用户的享受范围内,而且app应该简单好用,减少复杂的操作和过多的页数。拉近app与客户的距离,应该为了针对该app的专用人群添加该人群熟悉的元素。
2.1关于Android Studio 2.1.1介绍 Android Studio是Google这家技术公司推出的,用于给Android这个需要合适工作环境的工具用于开发应用和调试的集成工具。
2.1.2环境搭建 下载安装Android Studio。(可不选择安装Virtual Device)。设定使用Custom,可按照自己的喜好设置。安装路径不能出现中文,因为Android Studio的默认语言中没有中文。根据自己喜好选择内存。第一次安装会自动配置gradle。
2.2 关于MyEclipse 2.2.1介绍 MyEclipse是一个包含几乎所有Java所学特殊功能于一体开发环境。是高效开发的选择,从Java Spring到REST Web服务再到Maven均可在MyEclipse中统一开发。它有着强大的Java EE优势,也可在WebSphere、WebLogic、Tomcat、Glassfish这种使用各种应用系列服务器。
该软件没有什么特殊之处。但自带的tomcat并没有那么好用,需自己安装一个7x的,导入路即可。再启动服务器, 下方Console可显示内容与相关信息。
2.3关于Mysql 2.3.1介绍 MYsql是一个数据存放的仓库。为了方便管理和使用数据库中的数据,数据被按照早就编写好的规律存放。在数据库对数据的管理下,用户日常的操作将更加有效且组织化,也更加易于管理。它由5部分组合成。数据库服务器。数据库,数据表,字段和行。SQL,结构化查询与程序的应用设计语言,是一种有着不寻常目的编程语言,用于存取查询,更新,管理数据库系统。
2.3.2环境搭建 将Mysql的安装路径配置到Path环境变量中。安装的时候避免中文路径。设置端口为3306.。将字符集设置值为默认的字符其集。
2.4操作系统选择 2.4.1关于Android 2007年刚成立才22个月的Android公司被Google收购并在11月份被Google纳入OHA(Open Handest Ailance),即是所谓的手机开放联盟。它是在Linux系统上建立的,从开发到现在,Android操作系统一直保持着不可思议的进步速率,而它相对于其他操作系统的优势便是其完全开放的代码。在2008年,第一台基于Android的智能手机面向世人。在此次事件之后,Android以凭借着它的优势势不可挡地进入了其他电子设备地开发领域,并在2011年地第一季度成为全球使用最多地操作系统。在2013年,Android成为了这领域当之无愧的霸主。
2.4.2Android架构 Android的架构可具体分为4部分。因为Android操作系统是基于Linux内核的基底上开发的,所以这层为Linux Kernel。在这一层中使用的是C语言开发的,都是一些设备的驱动程序,这些驱动程序均为最基础且核心的功能,功能相对比较简答。其进程和内存管理还有服务功能都需要linux来驱动,如显示蓝牙照相机音频驱动。而在这层上面为LIibararies和虚拟机所构成。Library包含一些C++和C语言的程序包。有了这些程序包,许多功能各异的组件就可以被利用到,使开发者在开发过程中更加便捷方便。如因为大多程序要用到图片和视频,所以录制功能和解码有媒体文件功能要用到媒体库。以及标准的系统都要用到的C语言库。又因为Android使用Java编程语言,所以其拥有一个安卓核心系统运行库。有对2D底层图像处理的库SGL。不同于SGL,Surface是用于子系统管理且对图像处理上更有建树。
Dalvik虚拟机也是这部分的重要组成鹅部分之一,它对于移动的电子设备如平板和智能手机有着与其他设备得天独厚的优势,比如说在有限的组装空间里的芯片储存空间和能快速响应的能力。在这些的上层是应用程序框架(Application Framework),它作为连接程序和linux驱动层能在此基础上开发应用程序,也就是说一个开发人员想要开发应用程序都必须基于开发应用程序框架。在Android程序框架中,而且这必须建立在保证框架是对整个结构没有不良的影响下,为了方便开发人员对程序的访问,一大部分核心重要代码是开放的。因此开发人员在开发不同的应用程序时可以很便捷地互相使用或提供给其他人思路。重复的组件使用减少了,想要替换模块中的组件也更加简单。如内容提供器、通知管理器。
最上层即为用户直接接触的程序层(Application),在我们的日常生活中有丰富且功能各异的应用程序。如最基础的电话和短信功,备忘录时间网页浏览功能。或可从Google play上下载应用程序其中包括许多开发人员自己开发的程序。使用的语言为JAVA,程序比较灵活不会死板。着这很大程度上归因于用户个人开发和Android本身的核心为同一层次,即构建于安卓系统上的应用程序接口。
2.4.3Android应用程序开发的四个主要模块 Activity屏幕组件Service服务组件Broadcast Receiver广播接受组件Content Receiver内容提供者。
Activity 它时一种包含用户界面的组件,这是用户唯一能看到的,也是进行交互的界面。一个应用程序包含着零个或以上的组件。而在活动组件内又包含多个控件。Textview是用来显示文本的EditText顾名思义就是一个可给用户在程序上编辑信息的组件。Button则用来给予用户监听事件活动的功能。具体点理解Activity就是一个程序上的屏幕之一。Activity有四种活动模式,本设计采用默认standard模式。
Service 它不属于一个独立进程,属于用户看不见的界面,它让Android实现了后台运行的方案,比较适用于那些一直长时间运行但又不用用户进行交互的任务。有点类似于电脑的后台进程。它不需要任何用户界面的帮助,且当用户打开或切换应用程序时并不会对它造成影响。
Broadcaster Receiver 用来接收系统或者自身应用程序的广播。比如注册软件时的短信提醒,来电提醒功能,闹铃提醒功能等。在Android的广泛选择中你可以选择自己更加感兴趣的程序进行广播。广播分为有序广播和标准广播。标准广播为完全异步,所有接收器几乎同时接收,效率高,但是不能被拦截。有序广播只有等逻辑执行完才有下一步,有先后顺序,优先级高的先接受且它可拦截广播。
Content Provider 应用程序通常只能访问应用内储存的数据,共享的数据则不能对外提供。内容提供者则实现了跨程序间的数据共享。它有一整套完健全的机制去给权限一个程序去访问另一个程序中的属数据,与此同时还能保证数据在操创建一个供给于数据的访问接口 2.5语言JAVA 目前Java主要应用于中间件的开发 -- 明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发. Java的语法与C++语法类似 ,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage Collector)垃圾处理机制,防止内存溢出。
优点:JAVA语言健壮且安全,使用servlet机制使得编程更加高效不易崩溃。它时多线程工作模式且可移植性好。
3设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。
4用户界面设计 本设计研究内容基于Android这个比较方便使用的系统。设计出来界面内容以XML的格式存储。在研发过程中只需解析这些XML文件,然后再将其中信息补充进相对的界面中。由于本人负责的是用户使用各项功能的见界面设计和界面接口设计。所以本位会着重讲Activity及相关组件。
4.1用户界面设计的原则 它存在的意义在于它是人与机器交互如进行信息交互对话的中间体。随着高科技的发展,人机交互的方式方法也更加多样化。它有很多种元素构成,比如视觉上和听觉上的交互,用户使用时的操作逻辑。因此界面设计可以说时是一款软件的门面。一个好的人性化设计应该涵盖一下几个方面。[1] 4.1.1界面整洁 保持界面整齐简洁,一个好的界面一定能让用户轻松地掌握它地使用方法,尽量达到用户感觉不到很复杂地界面存在但能快速区分信息地重要性。
4.1.2通用性 无论是在此应用内还是与其他app比较起来,大体地布局都应该相似。在整体的界面中应该高度一致,特别是在字体的应用上还有对方块的颜色和放置的位置。这样用户的使用才会更加的舒适整洁。用户熟悉界面后能效率更高的工作或转战于其他app。
4.1.3合理的界面布局 Android中的各种组件位置的放置是非常有讲究的。为了让的界面看起来舒适,排版应均匀,元素放置不应该全聚集于一处或又过于稀疏。可以合理运用颜色,纹理,对比度和光效来制造美感或引导用户的注意力到重点的事物上。文字在某种意义上是传达文化符号的一种信息,所以可对文字进行艺术效果处理,增强联系结构。在重点想描述部分可是用加粗或者黑体下划线来特别说明。应认真思考重点文字的字体和所放置位置,提高可读性和舒适性。除非想打造一种别样的风格,增加视觉感,不然还是以阅读舒适性为主。为了主流大众符合阅读习惯,大多使用左对齐,也可使文字和图片搭配使用,但是还是要以文字为主图片为辅。图形是比较多用到的一种素材。常用于传达信息的用户头像,代表方向的箭头。在一定程度上减少文字的表达,使得app更加多样化且有趣。同时还要注意对应分辨率的大小。在不同情况下,app要按照严格的设计规定。有时候空间有限,应适当剪裁留下重要部分。颜色选用高辨识度。[2] 在进行排版设计中,不仅要靠虑到用户的实际需求还要将想表达的主题信息和视觉要素以适合融洽的方法联系到一起。来自巴塞卢罗那庞培法布拉大学的心理学教授葛思达在研究人类的视觉规律时曾经提到过“最佳视域”这个概念。在一个版面中,它的左和上部分是让人最轻松且容易接收信息的部分,所以设计的时候要注意这两部分的构造。要强调重复性,因为重复的元素不仅可以吸引用户的注意力还能着重强调某种特殊的信息,一般是在用类似和或近似的图片来搭建,可以在律动和放置的位置或者方位上有细微的调整,比只是单一枯燥的重复要好。在构建界面时要注意平衡性,两个有联系的元素上保持视觉的平衡,平衡不一定要完全一样,而是在某些微小特真上改动,大体还是要保持平衡联系性。
因为用户对色彩是十分敏感的,选择正确的颜色能影响客户的心理程序,比如本设计为与学习相关的app,所以使用让人冷静的墨绿色。而如,消防栓,和灭火器这种能让用户十分敏感,刺激视觉能让人马上注意啊到的颜色。文化的不同对颜色和文字使用不一样,如西方13被代表恶魔,和中国 忌讳谐音。色调统一,能代表开发者对本app的主旨,符合设计心灵学。[5] 4.14界面设计使用到的布局属性 线性布局:Android操作系统布局中比较常用到且简易的布局方式。在这种布局里,它的子布局按照横线或者竖线排布。并可分配权重。
1其中可用orientation设置为水平或者竖直的排列方式。
2 gravity里面的控件或者字体的对齐方式,子容器相对于父容器的布局,如左对齐或者底部对齐。而layout_gravity指的是该元素本身的布局。同理width控制控件内文本宽度,layout_width控制控制该元素本身的宽度。height和layout_height一样。layout_weight指布局所占比重,可通过更改属性调整屏幕占比。
3 在Android中有些组件需要一个int值,表示只接收int该类型的值,按照格式必须以@开头。而如果s是@+则表示修改完某些布局后要在文件中生成相应int值,例@+id/bzzb。变量名为/后面的值。但如果文件中已经存在相同名字的变量则会直接使用已经存在的值。常用在一些输入文本上,比如输入id或者密码。
4 background,为你的组件生成一个背景图也可以全用别的颜色。
5 divider,分割线。可以用drawable中的图片,也可以shape定义一个。也可以用showDividers来设置分割线所在位置,有none(无分割线)middle(在两控件中间设置分割线)begining(在顶端设置)end(在末端设置分割线)。
6 fill_parent,wrap_content,match_parent,这三个属性都是用来将视图内容或尺寸的大小及布局作调整的。fill_parent用来强制性的使组件的尺寸填满该布局内的空间.wrap_content用来完整显示整个布局。match_parent与fill_parent一样。
7 drawable图片资源,通过@drawable可获取已放置在里面的图片资源。许多app自定义的图标和背景图及其开发者要使用的图片转为xml文件里放在drawable中储存。
8 values。values存放了colors常用默认的颜色值,使用时可调用,每个颜色有专用的代码。Dimen是屏幕中像素的大小,本设计主要用到的是dp。Strings是字符串,提前写好,使用使直接调用即可。Stylenames是本设计的某些控件主要风格。总的来说就是一个已经整合好的资源库随时可以拿出来调用。
9 layout_margin,指距离父控件的各距离。Padding控制的内容距离四 边界的距离。Visibility可设置控件是否可见,可设置为不可见及可见,但不可见仍占据布局。Scrollbar用来设置滚动条,用法很多,可设置为是否可见,滚动方向,背景色,是否有轨道,褪色方向。
10 Edittext文本编辑。Hint可输入提示信息。在输入账号或者密码的时候经常用到。numeric=integer/decimal当有特殊需求只能输入整数或者小数的时候用到。singleLine=true则为设置只能输入单行。TextColour字体颜色。Textstyle字体。TextColourHint默认字体颜色。Typeface=monospace字体间距。Background背景,可设置为null默认没有。MaxLengtht限制文本长度。CusorVisivle设置光标是否可见。Capitalize设置英文字母大小写类型。可设置为AutoText自动纠正文本错误。Editable是否可编辑。Elipise,TextScaleX=1.5控制字与字之间距离。设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)。
11 Textview:android:text设置显示文本。android:textappearan设置文字外观。android:textcolor设置文本颜色。android:textcolorhighligh被选中文字的底色,默认为蓝色。android:textcolorhint 设置提示信息文字的颜色,默认为灰色。android:textcolorlink文字链接的颜色 textscalex设置文字之间间隔,默认为1.0f。android:textsize 设置文字大小,推荐度量单位”。textstyle设置字形。android:autolin设置是否当文本为:url链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)android:autotext设置,将自动执行输入值的拼写纠正。此时是无效果的,只在显示输入法并输入的时候起作用。android:buffertyp指定gettext()方式取得的文本类别。android:capitalize设置英文字母大写类型。需要弹出输入法才能看得到。android:cursorvisible设定光标为显示/隐藏,默认显示。android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”android:drawablebottom 在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。android:drawableleft在text的左边输出一个drawable。android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)android:freezestext 设置保存文本的内容以及光标的位置。android:gravity 设置文本位置,如设置成“center”,文本将居中显示。android:hinttex为空时显示的文字提示信息,可通过textcolorhint设置提示信息的颜色。android:impositions附加功能,设置右下角ime动作与编辑框相关的动作,如actiondone右下角将显示一个“完成”,而不设置默认是一个回车符号。android:includefontpadding设置文本是否包含顶部和底部额外空白。inputmethod为文本指定输入法,需要完全限定名(完整的包名)。android:inputtype设置文本的类型,用于帮助输入法显示合适的键盘类型。android:linksclickable 设置链接是否点击连接,即使设置了autolink。android:ems设置textview的宽度为n个字符的宽度。这里测试为一个汉字字符宽度。
12ListView是一个能将数据集合起来以动态滚动方式展示到用户界面View。将具体内容 以列表的形式展示并且能够自适应数据内容,然后通过适配器加载到屏幕。如此说来Adapter是用来在View和数据之间传递的。
13Button普通按钮ImageButton为图像按钮,为Textview字类,所以它的很多属性可以应用到Button上,通过drawable里的资源StateListDrawable可以将按钮设置成按下去为一个颜色弹起来又为一个颜色。drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态 。state_focused:是否获得焦点。state_window_focused:是否获得窗口焦。state_enabled:控件是否可用。state_checkable:控件可否被勾选,state_checked:控件是否被勾选,state_selected:控件是否被选择,针对有滚轮的情况,state_pressed:控件是否被按下,state_active:控件是否处于活动状态 。state_single:控件包含多个子控件时,确定是否只显示一个子控件。state_first:控件包含多个子控件时,确定第一个子控件是否处于显示状态。state_middle:控件包含多个子控件时,确定中间一个子控件是否处于显示状态。state_last:控件包含多个子控件时,确定最后一个子控件是否处于显示状态。
14 ImageView为图像视图,就是用来显示图像的一个组件。值得注意的是background背景通常是为了填充屏幕而进行拉伸。而图像试图属于内容,不会进行拉伸而是按照原图片直接进行填充。且在调整缩放的时候要配合maxWIdth最大宽度和maxHeight最大长度这两个属性一起使用,它才会成功调整。fitXY:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变。fitStart:保持纵横比缩放图片,知道较长的边与Image的编程相等,缩放完成后将图片放在ImageView的左上角。fitCenter:同上,缩放后放于中间;fitEnd:同上,缩放后放于右下角。center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。centerCrop:保持横纵比缩放图片,知道完全覆盖ImageView,可能会出现图片的显示不完全。centerInside:保持横纵比缩放图片,直到ImageView能够完全地显示图片matrix:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理 15 fragment可看作一个小型Activity,组件多管理过于麻烦,此时就要用到fragment进行模块化管理,但fragment不可单独使用,会收到宿主Activity的生命周期影响。Fragment的生命周期和Activity有点类似:三种状态:Resumed:在允许中的Fragment可见,Paused:所在Activity可见,但是得不到焦点,Stoped: ①调用addToBackStack(),Fragment被添加到Bcak栈 ②该Activity转向后台,或者该Fragment被替换/删除,但是停止状态的fragment仍然活着 不过对用户不可见。
16 progressbar是安卓下的进度条,当使用到加载画面的时候或者在看视频的时候进场用到。
相对布局:也是Android界面设计里常用到的一种布局。顾名思义就是相对父元素或者兄弟组件来有参照的布置子元素。
5教师学生界面设计 这次设计的教师主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、查看考勤、查看请假、发布通知以及打开校园官网、关于和退出系统。
本次设计学生主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、蓝牙签到、蓝牙请假、吊起qq联系老师、接收通知、关于系统、退出系统。
本设计建立的Activity 主要有介绍本APP应用,添加通知界面,登录界面,查看请假和查看签到界面,注册和加载界面。学生老师操作的界面则为了方便管理使用fragment。
5.1注册界面 当学生或者老师使用本app时首先应注册一个账号,那么就来到了RegisteActivity。采用了线性布局,界面垂直排布,界面占满整个屏幕,调用了drawable里的背景图作为背景,调用了放在layout里面的考勤签到注册布局.整体让这个小长方形里的元素采用竖直线性结构,具体里面采用相关布局因为元素比较多。包含了工具栏toolbar。使用显目大框和bold字体还有符合主题的颜色作为题目。为了能让用户分清哪个框是填对应什么的,使用了hint提示文字并配上对应图标使左对齐。为了能更清晰的让用户看清填的东西将背景色设置为null。并所有文本左对齐layout_marginLeft。使各布局central_vertical垂直居中。服务器地址需要限制输入文本Digits =0,1,2,3,4,5,6,7,8,9,0,.。最下方是提交BUTTON,button放块设置为比其他输入按键稍大。
5.2欢迎界面 背景布局为全绿色。有开场动画,先弹出string里面第一串字符串考勤签到app然后再弹出第二串字符串毕设作品。然后就进入主界面。
5.3查询请假界面 先设置好每个item即每个小项目的的规格。比如查询请假时每个学生的请假信息。然后用ListView加载。如果没有项目将用TestView显示暂无数据记录。
查询签到界面 项目界面与查询签到界面一样。
5.4工具栏界面 Toolbar在界面的最上端,为了方便用户使用,存在于每一个界面最上端。采用了相对布局,在每一个界面的最上方都存在工具栏。
5.5 登录界面 将整体设置为好打理的相对布局。在主要界面的上方有加载图标ImageView,在用户填写完账户后弹出。在左上方设置了一个半圆的图标提示用户现在使用的是学生端或教师端。在最下方用Textview设置2020 毕业设计作品提示字样。然后include登录表格布局与注册中一样。不过在最下方添加了注册和登录的Button。
发布通知界面:最上方是背景图为学校缩略图。往下为三个EditText,分别为发布内容姓名时间。其中发布内容占据板块较大并且都带有hint提示字符。最下方为发布提交Button。
5.6关于系统界面 有关于系统的介绍和使用的工具,app所拥有功能,开发团队及版本号均使用TextView展示。
5.7左滑小菜单 在学生或老师主要功能界面有fragment展示学校背景和两个TextView,分别是学校官网和退出系统。在现有的移动用户端中,大多都采用这种形式,不仅与大众群体的习惯有关,这还能整个操作过程变的更加平滑,让用户的操作更加具有流畅性。而且还能再拥挤的屏幕上节省了时间,用户整洁度提高。
5.8教师功能界面 使用fragment.在登陆界面左上角有可切换为学生端按键。中间有深色底白色字体显示界面的标题。从上到下为符合行业标准的蓝牙地址,账号,密码。并且每个图标必须有特色,不需要字体也可快速分辨出对应图标。登录成功过后下次可记忆最近一次的账号密码。最下面两个功能为注册和登录。最下方字体标明产品来源。登录界面的背景图选用跟app主题颜色相互搭配的图片。
在点击登录之后,在教师端打开蓝牙期间可现实加载图案。最上方像许多常规app一样显示当前界面,方便用户查明所在界面。下方为教师可发布的公告。公告需放置于仅大标题下,但字体放小可滚动的提醒作用。显示蓝牙状态,因为此为重要状态显示功能,用生活种红色代表失去连接,绿色代表已连接的状态显示,并且消息窗口可现实与哪位学生连接,并且显示蓝牙地址,连接成功后有灰底黑字小框提示。登陆界面的切换学生端改为显示教师名字。并且可发布Tips。由于该页面功能较多,有蓝牙设置,考勤签到,查看签到,查看请假,发布通知,及关于系统的介绍。所以排版不可过于紧凑,流出舒适空间。因此,功能均采用圆形图标。图标要符合审美比例,字体要与界面大小和相应功能图标和界面比例要符合用审美。在做到这些的基础上尽量简洁。一个良好的用户界面设计应与用户的显示世界感官相贴近。
在学生进行请假时,会有白底黑字弹窗提示,下方可选择拒绝或同意。同时操作后会有通知更新。关于系统介绍北京采用北理珠图片。有作品介绍及使用了哪些工具。下方为主要涵盖功能,如教师学生端均有的登陆注册,蓝牙设置,蓝牙连接,分享至第三方,查看考勤,查看请加发通知,校园官网,关于系统,通出系统。而学生端有蓝牙签到请假,接收通知。主要开发工具为AndroidStudio,MyEclipse,My'Sql,Tomcat,Navicat for MySQL等开发工具,还有开发人员和版本号。这些都是为了使用者能更好了解本功能。并且在此界面右上角为第三方分享,方便使用。
5.9学生功能界面 同样使用fragment除了开启考勤换成了学生的开连接。
除了学生端界面改了上面的注释标,发布通知换成了联系老师,查看签到和查到请假换成对应的查看和请假,其他均与教师端基本相同。
提示界面:因为提示界面转瞬即逝,所以通常使用fragment。加载界面由TextView显示正在加载和Progressbar进度条即可。分别显示的是在有网络延迟正在加载的“正在玩命加载”界面来提示用户现在的情况和“没有更多了”来提示用户浏览界面已经到头了还有最后出现错误的“出错了”界面,后面还加上猫表情拉近开发者与用户的距离。
6接口设计 界面接口设计指的就是人机的交互形式。因为虽然我们可以用控件做一个精美的界面,但它仅仅只是界面而已,无法与用户进行互动。所以就要用到Android使用最频繁的监听机制。比如用户填写完了基本信之后点击注册按钮,这时候开始向服务器发送登录请求。其实就是在屏幕的后面,当用户交互时看不见的一些动作。
流程:一开始先为事件源注册监听器,一般是组件。然后用户外部的动作触发然后触发事件源的事件。事件源受到影响后会生成对应事件,此时事件监听器将会把事件的参数记录下来,从而对不同的数据进行数据分析,分析后得到事件的处理方法。事件源,事件,事件监听器。
主要方法:
1 直接使用匿名内部类,通常只是用一次,复用性不高,是本设计使用最多的监听方法。
2 使用内部类,好处是可在该类中进行复用并可直接访问所有界面的组件。
3使用外部类,这种形式比较少见,即为创建另一个JAVA文件,但通常会导致代码不够简洁好用。
4 将Activity作为事件的监听器。
5 直接绑定到标签,即为在layout布局的文件中将对应的Activity中可以定义一个事件的处理方法 ,相对应组件触发事件的组件即可。
7考勤签到设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。
8总结工作与展望 本文主要针对设计的考勤签到系统和交互界面设计的优点和一些不足进行总结。
优点:必要功能健全,使用操作方便,Android系统比较灵活。人和UI界面互动良好,教师可从发布通知,查看考勤情况,也可与学生进行互动。
缺点:虽然手机端操作方便,但电脑端还要打开服务器,用户界面比较拥挤,而且接口项目有限,多个学生同时连接可能存在丢失情况, 展望:可以拓展更多功能,如签到排名,学生可发弹幕,增加学生与学生及学生和老师之间的良性互动。蓝牙考勤的系统普及关系一定越来越高,app已经广为社会使用。随着技术的更新换代,人机交互的形式也必然更加让用户感同身受。
参考文献 [1] 王鹏飞,移动设备应用软件交互界面设计[D].工业设计工程,2013 [2] 王延盼,基于安卓的App界面视觉艺术元素的分析与探究[D].艺术与设计学院,2013 [3] 葛会会,基于蓝牙考勤系统的设计与实现[D].电子与通信工程,2016 [4] 向小琼,李敏,蒲昱霖,刘海燕,基于蓝牙通信的高校课堂手机考勤管理系统[R],长沙医学院,2018 [5] 王曦,有关软件中用户界面设计的探讨[N].山东工业技术,2018-10-25(10). 附 录 MyEclipse所用到代码:
//Food.java package com.bs.bean;
//功能说明:
public class Food { public String id; public String uuid; public String name; public String state; public String time; } //Like.java package com.bs.bean; public class Like { public String id;// public String num;// public String name;// public String like;// } //NotifyInfo.java package com.bs.bean; public class NotifyInfo { // 通知 public String id;// public String name;// 姓名 public String content;// 内空 public String type;// 类型 public String time;// 时间 public NotifyInfo(String name, String content) { super(); this.name = name; this.content = content; } } //RatingBar.java package com.bs.bean; /** * * 功能说明:
* */ public class RatingBar { public String id; public String uuid; public String name; public String state; public String time; } //Suggestion.java package com.bs.bean; /** * * 功能说明:
* */ public class Suggestion { public String id; public String uuid; public String name; public String state; public String time; } //User.java package com.bs.bean; public class User { public String uuid;// public String name;// public String psd;// public String type;// public String logourl;// public String chineseName;// 中文名字 } //=============================== //FunctionServlet.java package com.bs.servlet; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.bs.bean.NotifyInfo; import com.bs.util.DBUtil; import com.bs.util.ReqType; import com.bs.util.RspType; import com.bs.util.T; /** * 项目名称:bs002 功能说明:多功能管理类 */ @SuppressWarnings(“serial“) public class FunctionServlet extends HttpServlet { private String tag = “FunctionServlet:“; private HttpServletResponse response; private boolean result; private List datalist; private String requestType;// 请求参数集 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.response = response; request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); requestType = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); if (!requestType.contains(“QueryNotify“)) { System.out.println(T.getDateTime() + “=====“ + tag + “======正在请求获取:“ + requestType); } if (requestType.startsWith(“Add“) || requestType.startsWith(“Remove“)) { addTypeRequest(requestType); } else if (requestType.startsWith(“Query“)) { queryTypeRequest(requestType); } else if (requestType.startsWith(“Delete“)) { deleteTypeRequest(requestType); } } /** * 新增数据接口 */ private void addTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Add_Notify)) {// 发布通知 String[] params = requestType.split(“:“); NotifyInfo notify = new NotifyInfo(params[1], params[2]); result = DBUtil.addNotify(notify); } else { return; } if (result) { returnResponseStringData(RspType.SUCC); } else { returnResponseStringData(RspType.FAIL); } System.out.println(“add result:“ + result); } /** * 查询数据接口 */ private void queryTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Query_Notify)) { List<NotifyInfo> notify = DBUtil.getFirstNotify(); returnResponseListData(notify, “notify“); } } /** * 删除数据接口 */ private void deleteTypeRequest(String requestType) { } private void returnResponseStringData(String result) { PrintWriter out; try { out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } private void returnResponseListData(List datalist, String type) { try { JSONObject object = new JSONObject(); JSONArray array = new JSONArray(datalist); object.put(type, array); OutputStream os; os = response.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, “utf-8“); BufferedWriter bw = new BufferedWriter(osw); bw.write(new String(object.toJSONString().getBytes())); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } } //LoginServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:登录校验 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class LoginServlet extends HttpServlet { private String Tag = “LoginServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; String result = DBUtil.checkUser(user); String[] reStrings = result.split(“:“); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); switch (Integer.parseInt(reStrings[0])) { case -1: // 用户名不存在 response.getWriter().print(“用户名不存在“); System.out.println(Tag + “用户名不存在:“ + user.name); break; case 0:// 登录成功 response.getWriter().print(“登录成功“); System.out.println(Tag + “登录成功:“ + user.name); break; case 1:// 密码错误 response.getWriter().print(“密码错误“); System.out.println(Tag + “密码错误:“ + user.name); break; case 2:// 查询异常 response.getWriter().print(“查询异常“); System.out.println(Tag + “查询异常:“ + user.name); break; } } } //RegisteServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:注册 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class RegisteServlet extends HttpServlet { private String Tag = “RegisteServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); System.out.println(Tag + “收到请求:“ + param); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; user.chineseName = reqArray[2]; boolean result = DBUtil.addUser(user); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); if (result) { System.out.println(Tag + “注册成功:“ + user.name); out.print(“0:“ + user.chineseName); } else { System.out.println(Tag + “用户名已存在:“ + user.name); out.print(“-1“); } out.flush(); out.close(); } } //DBUtil.java package com.bs.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.bs.bean.NotifyInfo; import com.bs.bean.User; /** * * 数据库连接工具 */ public class DBUtil { private static Connection con; private static PreparedStatement ps; private static ResultSet rs; static { try { Class.forName(“com.mysql.jdbc.Driver“); con = DriverManager .getConnection( “jdbc:mysql://localhost:3306/bs002elm?characterEncoding=utf-8“, “root“, “123“); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /** * 用户注册 * * @param name * @param psd * @return */ public static Boolean addUser(User u) {// TODO Boolean result = null; List<User> list = DBUtil.getAllUsers(); for (User user : list) { if (u.name.equals(user.name)) { return false; } } String sql = “insert into user(uuid,name,psd,chinese_name) values(?,?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, UUID.randomUUID().toString()); ps.setString(2, u.name); ps.setString(3, u.psd); ps.setString(4, u.chineseName); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addUser Exception]“ + e.toString()); } return !result; } /** * 用户登录校验 * * @param uu * @return */ public static String checkUser(User user) { String result = “-1“; String sql = “select * from user where name=?“; try { ps = con.prepareStatement(sql); ps.setString(1, user.name); rs = ps.executeQuery(); while (rs.next()) { if (user.psd.equals(rs.getString(4))) { result = 0 + “:“ + rs.getString(6);// 返回移动端 中文名字 } else { result = “1“; } } } catch (SQLException e) { e.printStackTrace(); result = “2“; } return result; } /** * 添加通知 * * @param name * @param psd * @return */ public static Boolean addNotify(NotifyInfo notify) { Boolean result = null; String sql = “insert into notify(content,name,time) values(?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, notify.content); ps.setString(2, notify.name); ps.setString(3, T.getCurrentTimeMillis()); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addNotify Exception]“ + e.toString()); } return !result; } /** * 获取通知 * * @return */ public static List<NotifyInfo> getFirstNotify() { List<NotifyInfo> list = null; NotifyInfo m = null; String sql = “select * from notify order By id desc limit 1“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<NotifyInfo>(); } m = new NotifyInfo( rs.getString(“name“),rs.getString(“content“)); list.add(m); } } catch (SQLException e) { System.out.println(“[getNotifyInfo Exception]“ + e.toString()); } return list; } /** * 修改密码 */ public static Boolean updatePsd(String uuid, String psd) { Boolean result = false; String sql = “update user set password=? where id =?“; try { ps = con.prepareStatement(sql); ps.setString(1, psd); ps.setString(2, uuid); result = ps.execute(); result = true; } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 获取注册用户列表 * * @return */ public static List<User> getAllUsers() {// TODO User user; List<User> list = null; String sql = “select * from user“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<User>(); } user = new User(); user.uuid = rs.getString(“uuid“); user.name = rs.getString(“name“); user.psd = rs.getString(“psd“); user.chineseName = rs.getString(“chinese_name“); list.add(user); } } catch (SQLException e) { System.out.println(“[getAllUsers Exception]“ + e.toString()); } return list; } } //JsonUtils.java package com.bs.util; import com.sun.org.apache.bcel.internal.generic.NEW; import test.Student; public class JsonUtils { public static void main(String[] args) { } // public static String toJson(RspType r) { // // 1、使用JSONObject // // JSONObject json = JSONObject.fromObject(r); // // String result = json.toString(); // return result; // } public static String toJson2() { Student stu = new Student(); stu.setName(“JSON“); stu.setAge(“23“); stu.setAddress(“北京市西城区“); // // 1、使用JSONObject // JSONObject json = JSONObject.fromObject(stu); // // 2、使用JSONArray // JSONArray array = JSONArray.fromObject(stu); // String jsonString = com.alibaba.fastjson.JSONObject.toJSONString(stu); System.out.println(jsonString); // String strJson = json.toString(); // String strArray = array.toString(); // // System.out.println(“strJson:“ + strJson); // System.out.println(“strArray:“ + strArray); // strJson:{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“} // strArray:[{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“}] return jsonString; } public void test2() { } public void test3() { } } //ReqType.java package com.bs.util; public class ReqType { public static final String Query_RatingBar = “QueryRatingBar“; public static final String Query_Suggestion = “QuerySuggestion“; public static final String Query_FoodOrder = “QueryFoodOrder“; public static final String Query_Notify = “QueryNotify“; public static String Add_RatingBar = “AddRatingBar“; public static String Add_Suggestion = “AddSuggestion“; public static String Add_FoodOrder = “AddFoodOrder“; public static String Add_Like = “AddLike“; public static String Add_Notify = “AddNotify“; public static String Remove_Like = “RemoveLike“; public static String Query_Favorite = “QueryFavorite“; } //RspType.java package com.bs.util; public class RspType { // 返回给移动端的状态值 public static String SUCC = “true“; public static String FAIL = “false“; private int code; public RspType(int code) { this.code = code; } @Override public String toString() { return “ResponseCode{“ + “code:“ + code + '}'; } } //T.java /* */ package com.bs.util; import java.io.ByteArrayInputStream; import java.text.SimpleDateFormat; import java.util.Date; /** * 功能介绍:多功能工具类 * * @author JianRong * @date2016-12-30上午11:09:00 */ public class T { public static String getDateTime() { SimpleDateFormat farmatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“);// 获取日期时间 return farmatter.format(System.currentTimeMillis()); } public static String getCurrentTimeMillis() { return String.valueOf(System.currentTimeMillis()); } public static void log(String log) { System.out.println(“===========“ + log); } public static boolean strIsNumber(String str) { String reg = “-?[0-9]+(.[0-9]+)?$“; return str.matches(reg); } } //test //Student.java package test; public class Student { // 姓名 private String name; // 年龄 private String age; // 住址 private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return “Student [name=“ + name + “, age=“ + age + “, address=“ + address + “]“; } } 发送蓝牙连接 package com.app.bs.kqqd.bluetooth.api.request; import org.json.JSONException; import org.json.JSONObject; public class RequestMessage extends com.app.bs.kqqd.bluetooth.api.Request { public RequestMessage() { super(REQ_MSG); } public RequestMessage(int cmd, String msg) { super(REQ_MSG); this.cmdId = cmd; this.msg = msg; } @Override public RequestMessage newInstance() { return new RequestMessage(); } @Override public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(MSG, msg); return jsonObject; } @Override public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getString(MSG); } } //适配器 package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class GanHuoAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public GanHuoAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new GanHuoViewHolder(parent); } } //-------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.widget.TextView; import com.app.bs.kqqd.R; import com.app.bs.kqqd.model.GanHuo; import com.app.bs.kqqd.util.TimeUtil; import com.jude.easyrecyclerview.adapter.BaseViewHolder; /** * */ public class GanHuoViewHolder extends BaseViewHolder<GanHuo.Result> { private TextView title; private TextView type; private TextView who; private TextView time; public GanHuoViewHolder(ViewGroup parent) { super(parent, R.layout.ganhuo_item); title = $(R.id.title); type = $(R.id.type); who = $(R.id.who); time = $(R.id.time); } @Override public void setData(GanHuo.Result data) { super.setData(data); //标题 title.setText(data.getDesc()); //干货类型 type.setText(data.getType()); //根据干货类型动态替换干货图标 if (data.getType().equals(“Android“)){ setDrawableLeft(R.drawable.ic_android_black_24dp); }else if (data.getType().equals(“iOS“)){ setDrawableLeft(R.drawable.ic_whatshot_black_24dp); }else { setDrawableLeft(R.drawable.ic_play_circle_filled_black_24dp); } //干货贡献者 who.setText(data.getWho()); //干货提交时间 time.setText(TimeUtil.getFormatTime(data.getPublishedAt())); } public void setDrawableLeft(int imageId){ Drawable drawable = getContext().getResources().getDrawable(imageId); drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); type.setCompoundDrawables(drawable,null,null,null); } } //----------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } //----------------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } App注册响应和请求 package com.app.bs.kqqd.bluetooth.api; import com.app.bs.kqqd.bluetooth.api.request.RequestMessage; import com.app.bs.kqqd.bluetooth.api.request.ResponseMessage; import com.app.bs.kqqd.bluetooth.api.request.UnknownReq; import java.util.HashMap; import java.util.Map; public class CmdFactory { private static CmdFactory instance; private Map<Integer, Request> requestMap = new HashMap<>(); private Map<Integer, Response> responseMap = new HashMap<>(); private CmdFactory() { register(new RequestMessage()); register(new ResponseMessage()); } public static CmdFactory getInstance() { if (null == instance) { synchronized (CmdFactory.class) { if (null == instance) { instance = new CmdFactory(); } } } return instance; } public void register(Request req) { requestMap.put(req.getCmdId(), req); } public void register(Response rsp) { responseMap.put(rsp.getCmdId(), rsp); } public Request createRequest(int cmd) { Request request = requestMap.get(cmd); if (null != request) { return request.newInstance(); } return new UnknownReq(); } public Response createResponse(int cmd) { Response response = responseMap.get(cmd); if (null != response) { return response.newInstance(); } return new Response(Request.REQ_UNKNOWN); } } 对app请求响应和处理 package com.app.bs.kqqd.bluetooth.api; import org.json.JSONException; import org.json.JSONObject; public class Response { public static final int SUCCESS_CODE = 0; public static final String CMD = “cmd“; public static final String CODE = “code“; public static final String MSG = “msg“; public int cmdId; public int code; public String msg = ““; public Response(int cmdId) { this.cmdId = cmdId; } public int getCmdId() { return cmdId; } public boolean isOK() { return code == SUCCESS_CODE; } public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(CODE, code); jsonObject.put(MSG, msg); return jsonObject; } public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getInt(CODE); jsonObject.getString(MSG); } public Response newInstance() { return new Response(cmdId); } } 蓝牙连接 package com.app.bs.kqqd.bluetooth.api; import java.io.IOException; import java.util.concurrent.TimeoutException; public interface Connector { void startServer(); void stopServer(); boolean isServerOK(); void connect() throws TimeoutException, IOException; boolean isConnected(); void send(byte[] b) throws IOException; int recv(byte[] b) throws IOException; int recv(byte[] b, int offset, int count) throws IOException; void disconnect(); } 未知请求信息 package com.app.bs.kqqd.bluetooth.api.request; import com.app.bs.kqqd.bluetooth.api.Request; public class UnknownReq extends Request { public UnknownReq() { super(Request.REQ_UNKNOWN); } @Override public UnknownReq newInstance() { return new UnknownReq(); } } 调用蓝牙进行匹配连接 package com.app.bs.kqqd.bluetooth.api; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class BluetoothConnector implements Connector { public final static String MOS_UUID = “6c12a327-0e0b-4344-8137-c41e2a79a50d“; private String deviceAddress; BluetoothServerSocket serverSocket; private boolean stopServerFlag; private BluetoothSocket localSocket; private BluetoothSocket remoteSocket; private BluetoothSocket connectedSocket; private InputStream inputStream; private OutputStream outputStream; public BluetoothConnector() { } public BluetoothConnector remoteDeviceAddress(String deviceAddress) { this.deviceAddress = deviceAddress; return this; } public void startServer() { new Thread(new Runnable() { @Override public void run() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (null == bluetoothAdapter) { return; } try { serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(“MOS_SERVICE“, UUID.fromString(MOS_UUID)); } catch (IOException e) { serverSocket = null; return; } stopServerFlag = false; while (!stopServerFlag) { try { remoteSocket = serverSocket.accept(); connectedSocket = remoteSocket; inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } catch (IOException e) { } } stopServer(); } }, “Bluetooth Server“).start(); } public void stopServer() { disconnect(); stopServerFlag = true; if (null != serverSocket) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } serverSocket = null; } } @Override public boolean isServerOK() { if (null == serverSocket) { return false; } return true; } @Override public void connect() throws IOException { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); boolean deviceFound = false; for (BluetoothDevice device : bondedDevices) { if (device.getAddress().equals(deviceAddress)) { deviceFound = true; localSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(MOS_UUID)); localSocket.connect(); connectedSocket = localSocket; if (null != connectedSocket) { inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } break; } } if (!deviceFound) { throw new IOException(“bluetooth device not found“); } } @Override public boolean isConnected() { if (null == connectedSocket) { return false; } return connectedSocket.isConnected(); } @Override public void send(byte[] b) throws IOException { if (null != outputStream) { outputStream.write(b); } } @Override public int recv(byte[] b) throws IOException { return recv(b, 0, b.length); } @Override public int recv(byte[] b, int offset, int count) throws IOException { if (null != inputStream) { return inputStream.read(b, offset, count); } return 0; } @Override public void disconnect() { if (null != connectedSocket) { try { inputStream = null; outputStream = null; connectedSocket.close(); connectedSocket = null; } catch (IOException e) { e.printStackTrace(); } } } }
推荐访问:
- 文秘
- 范文
- 文秘知识
- 书信条据
- 行政
- 求职离职
- 名人名言
-
劳动节手抄报初二_五一劳动节手抄报初中
热爱劳动就是热爱生活,尊重劳动就是尊重自己!你知道初二的学生是怎么做一份劳动节的手抄报吗?今天小编给大家带来了劳动节手抄报初二,供大家阅读和参考。 劳动节手...
【写作】 日期:2019-10-26
-
小学教师随笔晨诵课教研心得 晨诵心得体会
今天下午我们学校所有语文老师在会议室举行了一场以《诵读,为人生奠定底色》为主题的教研,在教研过程中,我受益匪浅。在教研中,三位展示课的老师首先进行了交流和展...
【谈判】 日期:2019-12-12
-
电大形考任务1答案 国开(中央电大)专科《外国文学》网上形考(任务一至三)试题及答案
国开(中央电大)专科《外国文学》网上形考(任务一至三)试题及答案备注:本资料整理于2020年5月10
【工商税务】 日期:2020-06-11
-
[立足本职履职尽责踏踏实实做好本职工作]
篇一立足本职履职尽责踏踏实实做好本职工作——“创造价值、创造效益,我该怎么办?”2014年3月公司党
【写作】 日期:2019-12-16
-
物理内能知识思维导图【物理内能思维导图】
思维导图又叫心智导图是表达发散性思维的有效的图形思维工具,它简单却又极其有效,是一种革命性的思维工具。接下来小编为你整理了物理内能思维导图,一起来看看吧。 ...
【谈判】 日期:2019-10-04
-
[想请客户吃饭客户被拒绝怎么回答] 客户请吃饭怎么拒绝
当遇到客户拒绝吃饭邀请的情况下,我们要怎么回答呢?下面是小编搜集整理的一些想请客户吃饭被拒绝如何回答的内容,希望对你有帮助。 被客户拒绝回答的方法 业务...
【工商税务】 日期:2019-07-30
-
红阳牌盐藻是骗局吗【盐藻哪些人不能吃】
在众多的保健品中,盐藻是近年来被普遍追捧的。据说盐藻能提高免疫力,含有很多人体所需的营养物质。每一种东西,都有宜忌人群。那么盐藻哪些人不能吃?下面小编带你一一...
【办公】 日期:2019-10-24
-
歌颂税务工作者的文章【歌颂地质工作者的文章】
作为一个地质工作者,地质勘探队员,找矿探矿是人生的价值追求,而找矿探矿成就卓著,就是个人价值的具体体现,事业成功的标志。很多杰出的地质工作者被世世代代的人赞扬歌颂...
【秘书基础】 日期:2019-08-25
-
学生不参加研学旅行告家长书 高一学年结束告家长书
高一学年结束告家长书 尊敬的家长: 您好! 高一学年马上结束,暑假就要开始。首先衷心感谢这一学年以来您对学校工作的理解和支持!孩子成长的每一步都凝聚了...
【写作】 日期:2020-01-01
-
冀教版八年级上册英语教案,Lesson,46,My,Dream
Unit8CelebratingMe!Lesson46MyDream1 能够掌握课标要求的“四会”词
【谈判】 日期:2022-01-26
-
在偏远山区支教的日子里_农村支教工作叙事写在支教日子里
暑假自从接到工作调动的那一刻,瞬间我的泪在眼眶里直打转。我非常舍不得离开工作十几年的校园环境,舍不得离开朝夕相处的同事,更舍不得离开还在学校就读的女儿和一起工作的...
【合同范文】 日期:2019-10-16
-
县局的政治生态建设落实情况自查报告|政治生态研判自查报告
政治生态建设工作落实情况自查报告按照省局、市局的要求,xx局党委对我局政治生态建设工作情况进行了认真
【汇报体会】 日期:2020-01-26
-
国开(中央电大)专科《建筑构造》网上形考、机考试题及答案
国开(中央电大)专科《建筑构造》网上形考、机考试题及答案说明:资料适用于电大工程造价管理,建筑施工与
【策划书】 日期:2020-07-02
-
在**市农商行系统党委理论学习中心组2020年第一次(扩大)学习会议上的汇报材料
在湛江市农商行系统党委理论学习中心组2020年第一次(扩大)学习会议上的汇报材料雷州农商银行党委书记
【策划书】 日期:2020-08-01
-
【信用社工作人员谈心记录】 信用社谈心谈话记录
谈心记录时间:2012年6月18日地点:xxx谈心人:xxx谈心对象:xxx谈心主要内容:1 你对现
【策划书】 日期:2020-02-06
-
[不忘初心,恪尽职守,做新时代合格统计人] 新时代不忘初心和使命
习近平总书记在十九大报告中指出:青年一代有理想、有本领、有担当,国家就有前途,民族就有希望。广大青年
【自我鉴定】 日期:2020-02-15
-
「最新」河南电大专科《公务员制度讲座》教学考一体化我要考试满分答案(第四套)
[最新]河南电大专科《公务员制度讲座》教学考一体化我要考试满分答案(第四套)一、单选题共20题,每题
【心得体会】 日期:2021-09-09
-
[动漫女生的帅气手机壁纸] 手机壁纸动漫男生帅气
听说手机壁纸能反映出一个人的性格,喜欢帅气类型动漫女生的你,还在发愁不知用什么做手机壁纸好?下面是小编整理的动漫女生的帅气手机壁纸,欢迎欣赏。 动漫女生帅气手机壁...
【自我鉴定】 日期:2019-08-27
-
参观红色纪念馆心得体会2000字10篇
参观红色纪念馆心得体会2000字10篇参观红色纪念馆心得体会2000字篇1红色7月,烈日炎炎,我
【心得体会】 日期:2023-04-28
-
肃流毒个人剖析材料_肃清流毒自我剖析材料
篇一鲁炜身为党的高级干部,理想信念缺失,党性原则缺失,对党中央极不忠诚,“六大纪律”项项违反,是党的
【汇报体会】 日期:2019-08-29
-
(精华版)国家开放大学电大《文论专题》网络课形考网考作业及答案_文论专题形考答案
(精华版)国家开放大学电大《文论专题》网络课形考网考作业及答案100%通过考试说明:2020年秋期电
【借条】 日期:2020-06-08
-
【对照先进典型为榜样检视自身差距和不足】对照先进典型身边榜样
篇一黄大年同志是著名地球物理学家,生前担任吉林大学教授、博士生导师。2009年,他从国外回到祖国,成
【借条】 日期:2019-09-06
-
【四年级劳动节手抄报精美图片】 劳动节的手抄报四年级
辛勤劳动的人,双手是万物的父亲。你知道制作一份四年级劳动节手抄报需要什么精美图片吗?今天小编给大家带来了四年级劳动节手抄报精美图片,供大家阅读和参考。 四年级劳动...
【决心书】 日期:2019-09-23
-
幼儿雯雯的成长日记 描写成长的小学日记
成长是每个人一生的必修课,有的人成长得乏味,有得人成长得快乐。下面小编为你带来写成长的小学日记内容,希望同学们喜欢。 写成长的小学日记篇一 201X年X月X日星期X晴...
【广告】 日期:2019-09-25
-
[好看的头像微信女生简单气质]头像微信女生简单气质
那些我们真心许下,并为之努力的愿望终将实现!这条路上我们并不孤单。头像微信女生简单气质有哪些呢?下面是小编带来的头像微信女生简单气质,希望大家喜欢! 头像微信女生简...
【调档函】 日期:2019-08-27
-
爱憋尿凌凌幼儿老师教育随笔:憋尿
爱憋尿的凌凌幼儿老师教育随笔 凌凌最近老爱憋尿,提醒她去小便时,她说不要小便,不愿意去,总要到憋的不行,才要知道上厕所,尤其是玩的正专心的时候,更是一拖再拖,不...
【新闻】 日期:2019-10-26
-
韩红抗疫情事迹 抗击疫情韩红感动事件
韩红抗疫情事迹2020疫情作文_众志成城抗击疫情作文大全5篇 众志成城,我们一定可以打赢
【论文】 日期:2020-03-17
-
[幼儿园疫情期间线上教学方案]幼儿园疫情线上教学安排
幼儿园疫情期间线上教学方案最新2020停课不停学线上直播教学老师总结心得10篇精选(2) 2020老
【接收函】 日期:2020-04-26
-
个人思想境界方面问题_个人能力境界方面存在的问题及整改措施
过这次党的群众路线教育实践活动,我深刻认识到作为一名党员肩负的使命和责任,自觉把参加教育实践活动的过
【广告】 日期:2019-08-21
-
[小学第十九周期末国旗下讲话稿2019年6月27日]2019国旗下讲话稿
小学第十九周期末国旗下讲话稿xxxx年6月27日周次:第19周主讲者:郑晖讲话主题:致毕业生祝福敬爱的老师、亲爱的同学们:大家好!今天是一个特殊的日子,我们全体六年级学生最...
【邀请函】 日期:2019-08-21
-
党员违纪检讨书怎么写:干部学历造假检讨书
身为党员,应该严格地要求自己,以下是教师范文吧小编为大家搜集整理的党员违纪检讨书怎么写,供大家参考和借鉴!更多资讯尽在检讨书栏目! 【党员违纪检讨书怎么写】 一...
【邀请函】 日期:2019-12-24
-
对领导班子的评价意见范文_对班子成员个人的意见
建议一(一)理论学习方面1 在抓常抓长上还不够,建议保持持之以恒的学习精神,发挥好示范带头作用。2
【自荐】 日期:2019-08-29
-
[炎炎夏日送清凉新闻稿]送清凉新闻稿
本报连续两期“关注高温”系列报道见报后,高温天里坚守岗位的劳动者群体引起社会的关注。最近几天,通过本
【道歉】 日期:2019-08-23
-
【文本信息加工测试题】
一、选择题1 文本信息加工是一种信息加工类型,下列不属于文本信息加工的是()A 制作电子贺卡B 制作
【邀请函】 日期:2019-12-07
-
国开(中央电大)本科《管理英语4》形考任务(单元自测1至8)试题及答案
国开(中央电大)本科《管理英语4》形考任务(单元自测1至8)试题及答案(国开平台形考任务必备资料)说
【慰问】 日期:2020-07-24
-
梦见吃丧饭是怎么一回事|丧事吃饭谢客词
梦见吃丧饭:解梦查询梦见吃丧饭的吉凶,梦见吃丧饭的解梦建议,运势,运气指数等内容,梦见吃丧饭的人都可以来看看。 梦见吃丧饭的周公解梦一 梦见吃丧饭,挑战自我能力极限...
【介绍】 日期:2019-09-23
-
无疫情感染承诺书 最新传染病疫情
无疫情感染承诺书2020最新防控疫情承诺书模板大全5篇 在抗击疫情的关键时刻,疫情防控工作
【接收函】 日期:2020-03-29
-
巡视整改专题组织生活会个人对照检查材料|巡察整改个人剖析材料
巡视整改专题组织生活会个人对照检查材料按照***党委《关于召开巡视专题民主生活会的通知》要求,根据*
【表扬】 日期:2020-02-02
-
[讲公德国旗下演讲稿-500字]演讲稿关于公德
演讲稿网国旗下演讲稿栏目为您提供《讲公德国旗下演讲稿500字》最新范文,仅供大家参考!更多国旗下演讲稿,欢迎访问www jsfw8 com 同学们:早上好!今天我讲话的题目是《...
【感谢】 日期:2019-08-17
-
【抗击疫情心得体会1000字最新(合集5篇)】 大学生抗击疫情心得体会
一场灾难笼罩了中华大地,在这场血雨腥风的战斗中,广大党党群主动请缨,义无反顾地冲到抗击疫情最前线,用
【感谢】 日期:2020-02-21
-
2020年秋冬季森林防火工作安排部署会讲话_冬季森林防火
2020年秋冬季森林防火工作安排部署会讲话为进一步贯彻好省会议精神,市政府接着开套会,总结今年以来森
【规章制度】 日期:2020-03-24
-
公务接待管理办法12篇:公务接待管理办法最新
(篇一)为规范机关公务接待工作,促进党风廉政建设,防止铺张浪费,根据《党政机关厉行节约反对浪费条例》
【调研报告】 日期:2020-02-13
-
国家开放大学电大《西方行政学说》机考3套真题题库及答案17
国家开放大学电大《西方行政学说》机考3套真题题库及答案盗传必究题库一试卷总分:100答题时间:90分
【调研报告】 日期:2021-06-11
-
带紫的微信网名四个字_女人微信网名大全四个字
女人到了一定年纪,用的微信网名也会发生变化。以下是小编收集整理的女人四个字微信网名,希望对你有帮助。 女人四个字微信网名(最新) 几分曾经 哑剧真动 还...
【企划文案】 日期:2019-07-28
-
国旗讲话-爱绿护绿争做环保小卫士|国旗下讲话争做环保小卫士
文章来源教师范文吧国旗讲话:爱绿护绿,争做环保小卫士 老师们,同学们: 大家上午好!今天我讲话的主题是《爱绿护绿,争做环保小卫士》。 3月12日是一年一度的植树...
【法律文书】 日期:2019-08-19
-
工会知识及相关法律法规 工会相关法律法规和条例
工会知识及相关法律法规1、《中华人民共和国工会法》共几章几条?答:共七章、五十七条。第一章总则;第二
【法律文书】 日期:2020-04-06
-
高中运动和力思维导图_物理力与运动思维导图
思维导图是一种将思维形象化的方法,那么物理力与运动的思维导图是怎样的呢?接下来小编为你整理了物理力与运动思维导图,一起来看看吧。 物理力与运动思维导图:牛顿运动定...
【规章制度】 日期:2019-10-03
-
部队思想认识自查 思想作风大反思自查报告
思想作风大反思自查报告为深入贯彻落实,切实加强消防救援队伍的纪律作风建设,根据《甘肃省消防救援总队专
【规章制度】 日期:2020-06-05
-
关于疫情防控工作总结_公司2020年一季度疫情期间工作总结
公司2020年一季度疫情期间工作总结2020疫情防控工作总结心得体会大全5篇 面对无情的新型冠状病毒,切实做好
【规章制度】 日期:2020-03-16
-
雨季八防内容 胜利油田雨季八防内容
雨季八防雨季“八防”(防触电、防中暑、防工伤事故、防淹溺、防洪汛、防倒塌、防车祸、防中毒):防
【规章制度】 日期:2019-08-21
-
【2篇2020年党委书记在全国两会精神专题学习会上的研讨发言心得交流(党课讲稿)】
党委书记在全国两会精神专题学习会上的讲话1同志们:2020年全国两会,是在决战脱贫攻坚、决胜全面小康
【述职报告】 日期:2020-05-29
-
国开(电大)《习近平新时代中国特色社会主义思想》网上形考任务(总论、专题一至专题十)专题检测答案
国开(电大)《习近平新时代中国特色社会主义思想》网上形考任务(总论、专题一至专题十)专题检测答案总论
【离职报告】 日期:2021-03-29
-
湘渌【渌湘实校班长负责制】
渌湘实校班长负责制 1、全面负责班级同学德、智、体、美、劳各项活动的开展,在为同学服务中提高自己的管理水平。 2、及时传达学校及班主任教师对班级活动的要求,并组...
【述职报告】 日期:2019-07-12
-
疫情防控工作先进集体事迹材料5篇|疫情防控先进个人事迹材料
防控疫情先进单位事迹(1)——xx市xx单位共产党员战斗在疫情防控第一线的事迹新型冠状病毒感染的肺炎
【离职报告】 日期:2020-02-21
-
【足球运动员冈萨洛·伊瓜因介绍】冈萨洛.伊瓜因
冈萨洛·伊瓜因,拥有法国国籍的阿根廷足球运动员,场上司职前锋、边锋,下面是小编为你整理的足球运动员冈萨洛·伊瓜因介绍,希望对你有用! 足球运动员冈萨洛·伊瓜因简介...
【离职报告】 日期:2019-10-23
-
脱贫攻坚心得体会6篇_2020年脱贫攻坚心得体会思考发言
2020年脱贫攻坚心得体会思考发言当好“合同工”,用“契约精神”践行真心实意。总书记说:“脱贫攻坚越
【述职报告】 日期:2020-05-24
-
关于开展2020年半年度固定资产清查盘点工作的通知
关于开展2020年半年度固定资产清查盘点工作的通知各单位:为准确掌握公司固定资产存量的变动情况,加强
【实习报告】 日期:2020-08-09
-
员工打架处理通报_员工打架事件通报的范文
员工打架是一种很不好的行为,影响公司形象,呀影响工作以及工作环境,因此公司会对打架员工进行通报批评,下面小编给大家带来员工打架事件通报范文,供大家参考! 员工打架...
【转正工作】 日期:2019-08-25
-
新时代新思想新作为学习心得范文十篇
(篇一)党的十九大报告,充分展示了以习近平同志为核心的党中央引领新时代中国特色社会主义的理论成果、实
【转正工作】 日期:2020-02-04
-
关于贯彻落实上级重大决策部署情况报告_贯彻落实上级决策部署方面
【篇一】尊敬的张局长及督察组各位领导:正当全镇上下深入学习实践科学发展观,按照县委、县人民政府的安排
【辞职报告】 日期:2019-11-19
-
2023年经典好句80例
经典好句80例1 要有“会当凌绝顶、一览众山小”的壮志豪情。2 以信心凝聚力量、以实干谱写华章,3 不忘初心、牢记使命,勇挑时代赋予的重任,不负人民寄予的厚望,以永不懈...
【经典名言】 日期:2023-10-17
-
乡创建卫生乡镇爱国卫生组织管理工作情况报告(完整)
X乡党委、政府十分重视爱国卫生工作,自从2022年提出创建国家卫生乡镇以来,把它列入乡党委、政府重要的议事日程,将创建国家卫生乡镇工作作为一项民心工程来抓。同时加强爱国...
【爱国】 日期:2023-10-12
-
基于我国国际传播力建设的旅游英语多样化翻译策略研究
成家慧(四川商务职业学院旅游管理系,成都611131)2021年,习近平总书记在中共中央政治局第三十
【英语名言】 日期:2023-08-13
-
新时代背景下的高职英语教育改革研究
刘斌(贵州食品工程职业学院文化课基础部,贵州贵阳551400)近几年发展中,随着国内产业升级和经济结
【英语名言】 日期:2023-08-11
-
英语弱否定句子结构探析
李雨名(吉林工业职业技术学院通识教育中心,吉林吉林132013)在英语中,否定的强化通常被讨论得很多
【英语名言】 日期:2023-08-07
-
在英语学科中实现红色文化育人
文 深圳市大鹏新区葵涌中心小学赵乐李颖王乙男英语教学是学生初步了解西方文明,学习西方文化的途径。如若
【英语名言】 日期:2023-08-07
-
目的论下科技英语长句翻译策略研究
张瑾强艳颜(华北理工大学,河北唐山063210)翻译目的论(Skopostheory)作为功能主义学
【英语名言】 日期:2023-08-04
-
基于POA的高校英语视听说混合式教学模式创新探究
余析悯从文秋芳(2008)提出的“输出驱动假设”,到她(2014)修订的“输出驱动—输入促成假设”被
【英语名言】 日期:2023-08-03
-
地方高校“综合英语”课程对接产业链的素能协同创新与实践
邹其彦,林芸(重庆对外经贸学院,重庆401520)走产教融合的道路以培养高素质应用型人才是地方高校提
【英语名言】 日期:2023-07-31
-
商务环境下英语教学中英汉词汇不对等及其教学策略
李雪峰(安徽财经大学文学院,安徽蚌埠233000)商务英语作为在商务背景下使用的英语,可以说是传统英
【英语名言】 日期:2023-07-31
