Xxxx
邮箱:手机:籍贯:年龄:
职位申请: Android软件工程师
教育背景:
2011/12-2012/05oracle学习中心Android软件开发培训
2009/09-2012/06大连职业技术学院网络技术专业大专 专业技能:
熟悉JAVA编程语言,掌握面向对象编程思想
熟悉Android平台开发环境,熟悉Android SDK开发工具
熟悉Android平台的应用开发
熟悉Linux环境,以及相关的Android开发环境.项目经历:
基于Android平台的拼图游戏时间:两周指定任意一张图片进行游戏,该程序把图片切割成十六个乱序的小图块,然后让用户通过移动小图块来完成拼图。在此项目中,本人负责了游戏界面的设计,在Eclipse和Android SDK的开发环境下。完成了该游戏图片的切割、打乱、图片移动算法的编码,该游戏能成功并流畅地在Android设备上运行。 智能课程表应用程序(团队合作)时间:四周该应用程序基于在客户端的数据库存放学校、院系、专业、课程等数据从而进行大学课表的设置;通过专业定位到自己所修课程在上课时间的设置,手机自动静音或震动;有显示课表功能供;智能课表让大学生可以不用再去记繁琐的上课时间,设置完成后在上课之前自动提醒,课上自动调成静音或者震动。本人参与了需求分析,整体功能,以及客户端应用程序UI模块的设计。在项目中负责了一些界面的处理和功能的实现,还有项目中数据库的建立和数据库与项目的连接。
Android平台的俄罗斯方块时间:二周该项目是本人独立在Android中实现的俄罗斯方块程序,是一款相当经典的小游戏,游戏中没有特别难的开发发面的东西,主要是在surfaceview中实现的,游戏主要是靠在画布中进行一些判断。最大的难点就是不同方块的模型的建立,把模型建立好了以后,就可以利用这些模型在游戏中进行运算,从而实现俄罗斯方块的功能。
实训经历:
北京市北邮3G培训机构2011.09-2012.03实习培训
主要学习Android软件应用与开发理论,JAVA编程语言,以及其他软件开发理论。在老师的指导下,通过不断实践训练,提高了软件开发水平,为以后工作打下了扎实的基础。
兴趣爱好
看书、围棋、篮球、旅游
培训课程
Android布局的概念,Android菜单介绍,常用UI组件的使用和总结
了解Android3D动画实现
对Android项目的开发与实践
自我评价
本人热爱学习,对于软件开发很感兴趣,快速学习能力强。爱思考并喜欢创新。对工作认真负责,善于团队合作、有较强的团队沟通能力、能吃苦耐劳。Android的巨大魅力吸引我愿意用巨大热情投入到与之相关的开发工作中。而且我也相信,在我扎实的专业知识基础上能给贵公司献上我的一份薄力。
个人简历
个人信息
姓名:XXX
年龄:XX
学历:本科
联系电话:186XXXXXXX
个人技能
1.熟练掌握JAVA面向对象编程语言,有良好的编码习惯;
2.熟悉jsp、javascript、servlet、javaBean进行web应用开发,了解jQuery,ajax等技术;
3.能使用Struts2、Hibernate、Spring等开源框架技术;
4.熟练操作SQL sever、MySQL数据库,熟悉SQL语句;
5.熟练掌握Android adt编程环境和调试流程;
6.熟练掌握Android的4大组件和5种常用布局;
7.熟练Sqlite、File、SharePreference等存储方式;
8.熟练使用xml、json等解析技术;
9.熟悉编程软件环境配置,熟练运用Eclipse和MyEclipse等编程软件。
教育培训
2009年9月——2013年6月
2012年2月——2012年5月
项目经验
1.Android选课系统
描述:一款基于Android平台的选课软件,通过软件访问WEB短的服务器进行操作,web端采用servlet实现,能进行课程的查询、添加、删除。
2.基于SSH的论坛
描述:实现简单的注册登录功能,用户可创建自己的论坛并有管理权限,会员可发帖,帖子有回复功能,版主可管理自己的帖子。
自我评价
我有一颗积极向上的心,对于软件开发有较大兴趣。喜欢运动,热爱生活,热爱学习。诚实做人,踏实做事是我的做人原则。有较强的团队意识,比较善于团队合作。我坚信,努力不一定会成功,但肯定会有收获。我期待这个收获的过程。我将投入自己全部的激情,努力奋进。
XX大学软件工程 XXXXXAndroid软件开发 性别:X 籍贯: 山东XX 专业: 软件工程 E-mail:XXXXXXX@126.com
董XX性别:男
年龄:24
电话:
现住地址:北京 海淀区
邮箱:.com
教育经历2007.9-2011.6潍坊学院计算机网络工程统招本科 求职意向Android软件开发工程师
专业技能 熟练掌握Core Java编程, 具有扎实的技术功底,有良好的Java编程习惯 熟练掌握常用UI控件,熟练常用布局及资源文件的使用
熟练掌握Android SDK应用程序开发(Activity、Service、Broadcast、WebView、SQLite、Location、Media、Camera、Sensor、SMS、Contacts)
熟练Android平台下的Http通信、Socket通信、XML解析(DOM、SAX、PULL)、 熟悉使用Oracle、MySql数据库、熟练使用SQL语句
熟练使用Eclipse、MyEclipse、hierarchyviewer、draw9patch、apktool等工具 熟悉Linux/Unix常用命令
了解Android NDK编程 了解JSP、JavaScript、Servlet、JQuery、Ajax、Tomcat等相关WEB应用开发技术 项目经验 项 目 一:某航空公司手机订票系统
开发工具:Eclipse + ADT + Android SDK+ MySql
开发平台:Windows平台
技术实现:Android常用UI组件自定义Adapter拨打电话
SQLite的使用Socket通信JDBC的增删改查
项目描述:该系统是一个航空手机订票系统,主要功能有用户登录、用户注册、预订机
票、订单管理、基本账户管理、乘机人管理、联系人管理、查询网点、查询机型、订阅管理等功能。
责任描述:担任项目小组长,负责组员之间代码的整合,主要每天将组员修改的代码整
合在一起,让整个程序能够正常的运行,并且负责实现了修改用户密码、订单管理的功能。
项 目 二:GoMarket 2.1(安智市场)
开发工具:Eclipse + ADT + Android SDK +PhotoShop
开发平台:Windows平台
技术实现:ListView数据的分页加载Nine-Patch图像Style机制
XML的解析(XmlPullParser)HTTP数据通信文件的下载及保存 项目描述:GoMarket是一个可以下载Android手机应用程序的软件,主要功能有下载
软件、文件管理等功能,该项目主要模仿原程序学习复杂界面的布局和综
合运用UI组件,实现软件的下载和保存,以及掌握HttpClient连接服务
器读取模拟数据、NotificationManager、XmlPullParse的运用。
责任描述:独立完成了从Tomcat后台服务器读取模拟数据,通过Pull解析,实现了
ListView数据的分页加载和软件的下载及保存
项 目 三:植物大战僵尸
开发工具:Eclipse + ADT + Android SDK
开发平台:Windows平台
技术实现:Surface双缓冲技术 CallBack回调Graphics绘图Animation动画 项目描述:该项目的主要目的是模仿植物大战僵尸,了解自定义GameView类,学习如
何开发简单游戏和了解游戏引擎以及一些游戏框架设计模式。责任描述:独立完成了植物在画布上显示并能够发子弹,让僵尸能够在画布上运动 培训经历
2011.3--2011.8北京达内科技有限公司Android开发工程师 兴趣爱好
喜欢跑步、乒乓球、旅游等
自我评价
热衷于移动互联,对手机开发有着浓厚的兴趣 性格乐观,做事稳重、待人诚恳,乐于助人,平时能和周围的同学打成一片 有良好的编程习惯,有责任心,勇于承担压力,对工作饱满热情 有良好的团队精神和自学能力,善于接受新事物,能很快的适应新的环境(培训期间曾
担任组长一职,整合组员之间代码)
01、什么是3G 02、android系统简介 03、android背景介绍 04、android的framewor简介 05、两种虚拟机的比较 06、sdk的下载以及简介 07、创建android模拟器 08、ddms简介
09、platform-tools的简介及常见adb指令
10、android项目的目录结构
11、android下apk安装的过程
12、常见的adb指令介绍
13、创建模拟器遇到的常见错误
14、电话拨号器
15、点击事件的四种写法
16、短信发送器
17、相对布局&单位介绍
18、现形布局&布局的组合
19、表格布局&绝对布局 20、帧布局
21、测试相关概念
22、android下junit测试框架配置
23、logcat简介
24、保存文件到手机内存
25、android下文件访问的权限
26、保存文件到SD卡中
27、分析setting源代码获取SD卡大小
28、_sharePreference入门
29、xml文件的序列化 30、采用pull解析xml文件
31、采用断电调试的方法观察pull解析的的流程
32、android下创建一个sqllite数据库
33、sql语句实现数据库的增删改查
34、系统api实现数据库的增删改查&Sqlite3工具的使用
35、数据库的事物
36、listView入门
37、采用layoutInflater打气筒创建一个view对象
38、采用数据适配器ArryAdapter
39、常用数据适配器simpleAdapter 40、数据适配器总结
41、内容提供者简介
42、内容提供者的实现
43、短信的备份
44、插入一条记录到系统短信应用
45、内容观察者
46、获取系统的联系人信息
47、保存联系人到系统通讯录
48、读取联系人的一个小细节
49、网络图片查看器
50、anr产生的原理&如何避免
51、android消息机制入门
52、网络html查看器
53、字符乱码问题的处理
54、采用get方式提交数据到服务器
55、采用post方式提交数据到服务器
56、提交数据到服务器中文乱码问题的处理
57、采用httpclient提交数据到服务器
58、异步http框架简介&实现原理
59、异步http框架提交数据到服务器 60、上传文件到服务器
61、smartimageview&常见开源代码 62、多线程下载的原理 63、多线程断点下载的原理
64、多线程java代码移植到android 65、多线程下载文本页面的更新 66、显示意图激活另一个activity 67、隐式意图激活另一个activity 68、隐式意图的配置
69、隐式意图和显示意图的使用场景 70、在不同activity之间数据传递 71、activity的声明周期 72、activity的启动模式
73、activity横竖屏切换的声明周期 74、开启新的activity获取他的返回值 75、请求码和结果码的作用 76、利用广播实现ip拨号 77、短信窃听器
78、自定义广播时间&发送自定义广播&广播接受者优先级 79、采用服务执行长期后台操作 80、采用服务窃听电话&服务的声明周期 81、android进程优先级&为什么使用服务 82、绑定方式开启服务&调用服务的方法 83、服务的声明周期(混合开启 84、采用aidl绑定远程服务
85、代码注册广播接受者&利用广播调用服务的办法 86、加载大图片到内存 87、获取图片exif信息 88、从gallery获取图片 89、图片画画板 90、扒开美女衣服 91、图片的缩放 92、图片的旋转
93、图片的平移&镜面&倒影效果 94、图片的合成 95、图片的颜色处理 96、多媒体播放api简介 97、人脸识别
98、mediaplayer的生命周期 99、soundpoo简介
100、sufaceview的生命周期 101、播放在线视频
102、视频播放器进度的处理 103、调用系统照相机拍照和录像 104、采用camera拍照 105、常见对话框 106、notification入门 107、菜单
108、android下的样式 109、android下的主题
110、代码编写ui 111、html创建ui 112、帧动画
113、代码创建创建的tween动画 114、xml文件定义动画 115、传感器简介 116、117、杀死进程 118、apk的安装 119、应用程序的反编译 120、动态创建fragment 121、用fragment创建一个选项卡 122、fragment的向下兼容性 123、fragment的生命周期 124、fragment之间的通讯 125、应用程序国际化
04、android的framewor简介
Wap:wait and play Wireless Makeup Language(WML)精简的html语言 Applications:android自带的基本上层应用 Aplication framework:应用程序框架 Librarics: Linux lernel:
05、两种虚拟机的比较
编译后文件格式:
jvm:.java->.class->.jar dalvik vm:.java->.dex->.odex 基于的架构:
jvm:基于栈的架构
dalvik vm:基于寄存器的架构
Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高
06、sdk的下载以及简介
->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容
Android 4.2.2(API16)
->SDK Plateform:开发时使用到的jar包->Samples for sdk:
->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API->source for android SDK:SDK全部的源代码 Extrals:
->tools:开发的工具
->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息
->gongle play service:收费服务
->google USB Driver:真实的设备驱动
开发时:基于4.0,兼容2.2、2.3.3
07、创建android模拟器
avd:android virture developer VGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)
08、ddms简介
ddms:模拟器不支持中文,因此发送中文会显示不出来
09、platform-tools的简介及常见adb指令
Android调试桥:内部实现就是socket让两个系统之间实现数据交互
->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥 dx.bat:将.class文件打包
10、android项目的目录结构
一:SDK的目录结构
->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见
相应的代码
->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像
->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器
二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容
->mark project as a library:一般不选择,意思是将这个项目提供一个
jar包供别人使用 三:文件夹目录
.setting:设置目录
assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的 apk中
bin:
gen:自动生成的目录
->builderConfig.java:生成的配置信息->R.java: Android 4.1.2->android.jar开发环境,jar包
可以在properties中修改,jar包就是SDK
011、Android下apk的安装过程
一、Android安装过程分析:
->setContentView:甚至view的对象,把里面的xml文件加载到
->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件
->apk压缩文件解压内部内容
->META-INF: 应用程序的签名
eclipse的调试签名文件
->res:资源文件
->classes.dex:class文件
->resources.arsc:资源ID映射
->android软件安装的过程:
->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名
012、常见adb指令
前提:
->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;
->设备上打开USB调试;
指令:
->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb-s emulator-5554 install c:usersadministratorhello.apk 如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到
(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端
ls:显示文件夹
ps:显示正在运行的程序 ping:网络连通性
013、创建模拟器遇到的常见错误
->路径最好不要有中文:
->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:
可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。通常情况下不会出问题,开启时候创建文件,关闭时关闭文件,但是当电脑出现不正常状态时:比如蓝屏,停电关机时候这些资源还没来得及删除,模拟器就关闭了,因此开启时这些资源仍在,程序默认模拟器被占用,因此会重新开启一个模拟器。
->模拟器没有信号:
模拟器用socket桥接在电脑上
终结解决方案是给电脑连上网,分配一个IP->常见命令操作:
14、电话拨号器
->新建文件
->界面设置:文本框、点击按钮
-> :一旦获得焦点,会立刻弹出,输入文本的软键盘->ctrl+x删除->ctrl+1提示
->设置点击事件:找到空间,然后设置点击事件,再点击事件里面获得了另外一
个空间的数据,激活一个intent->获得权限:清单文件中添加uses permision
15、点击事件的四种写法
->电话拨号器的优化:
每次拨打电话都会执行的操作是:查找控件,然后找到控件的文本,拨打电
话。其实每次拨打电话文本控件已经创建好了没有必要每次查找按钮之后再 查询控件。
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new MyListener());}
private class MyListener implementsandroid.view.View.OnClickListener{
@Override
public void onClick(View arg0){
String number = et_number.getText().toString().trim();//去除回车和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);
}
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;} }
->
1、点击事件的四种写法:
->给按钮注册点击事件:创建一个内部类定义点击事件。具体代码见上
button.setOnClickListener(new MyListener());
->
2、采用匿名内部类创建点击事件:
button.setOnClickListener(new OnClickListener()){
package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自动生成的方法存根
callPhone();
}
});}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回车和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} } }
->
3、如果有很多的按钮点击事件,建议用这种方式:让Activity实现点击 事件的接口,每个按钮点击事件都设置成this,让该类实现 OnClickListener然后进行判断。package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回车和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);}
@Override public void onClick(View v){
// TODO 自动生成的方法存根
switch(v.getId()){
case R.id.bt_dial:
callPhone();
break;
} } }->
4、在布局文件中绑定一个点击的方法,如果点击按钮就会调用这个方法,通
过反射技术试图调用这个方法
布局文件中设置: package cn.wqrt.mobile;
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_number;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button =(Button)findViewById(R.id.bt_dial);et_number =(EditText)findViewById(R.id.et_number);
}
@Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
public void dialButtonClick(View v){ callPhone();}
private void callPhone(){
String number = et_number.getText().toString().trim();//去除回车和空格
if(TextUtils.isEmpty(number)){
Toast.makeText(MainActivity.this, “号码不能为空”, Toast.LENGTH_SHORT).show();
return;
}
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel:”+number));
startActivity(intent);} }
16、短信发送器
->界面的设计:两个large Text,一个Button
android:textColor 设置字体颜色
android:singleLine=“true” 设置是否是单行
android:lines=“5” 设置行数
windows下面的颜色是GBR,而android下需要输入的格式确实
RGB,所以需要转换
adb默认设置time out为5秒->内容设计:按钮-文本->判断->发送
导包的时候千万别导到gsm包,否则会显示过时;
发送没有历史记录 package com.example.sms;
import java.util.ArrayList;
import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private EditText et_number;private EditText et_content;
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_send);
et_number =(EditText)findViewById(R.id.et_number);
et_content =(EditText)findViewById(R.id.et_content);
button.setOnClickListener(this);}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;}
@Override public void onClick(View v){
// TODO 自动生成的方法存根
switch(v.getId()){
case R.id.bt_send:
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
Toast.makeText(this, “号码或者内容不能为空”,Toast.LENGTH_SHORT).show();
return;
}else{
SmsManager smsManager = SmsManager.getDefault();
ArrayList contents = smsManager.divideMessage(content);
for(String str:contents){
smsManager.sendTextMessage(number, null, str, null, null);
}
}
} } }
17、相对布局&单位介绍
->布局说明:
->同级控件:
android:layout_toRightOf=“" android:layout_toLeftOf=”“ android:layout_below=”' android:layout_above=“" android:layout_maginBottom=”“
->相对父控件:
android:ayout_centerInParent=”“ android: layout_centerHorizontal=”“ android:layout_centerVertical=”“ android:layout_alignParentBottom=”“ android:layout_alignParentRight=”“->对齐方式:
->文本颜色:#00000000~#ff000000(argb)文字的透明度->单位介绍:
dp也就是dip:device independent pixels(设备独立像素),是一种与密度无关的像素单位,在每英寸160点的屏幕上,1dp = 1px。不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素
1.2.android:layout_height=”wrap_content“
3.android:text=”@string/clickme“
4.android:layout_marginTop=”20dp“ />
scaled pixels(刻度像素).主要用于定义字体的大小,而从来不再layout上使用
o
1.2.android:layout_height=”wrap_content“
3.android:textSize=”20sp“ />
px:pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多 总结:dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 / 160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换.附:px 和 dp 互转换
1.package com.hujl.util;import android.content.Context;
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素)的单位转成为 dp
*/
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return(int)(pxValue / scale + 0.5f);
} }
18、线性布局&布局的组合
->线性布局:
->线:就是view对象
android:layout_height=”1px“
android:background=”#ff0000“ > />
通常采用相对布局和绝对布局联合使用的方式。
19、表格布局&绝对布局
->表格布局:渲染权重
->绝对布局:对控件位置任意摆放,需要计算不同屏幕中的位置,因为android
软件的屏幕大小实在太多,所以并不方便,不推荐使用。
20、帧布局
>帧布局:
->类似于网页布局中的div
android:visibility:”“ //显示是否可见,播放器最喜欢使用帧布局,暂停播放的时候,会在上面显示一个按钮
21、测试相关概念
->根据测试测试是否知道程序的源代码:
->黑盒测试:不知道源代码,只关心程序执行的过程和程序的结果,一个资
深的黑盒程序人员工资很高,因为他们和正常用户的使用思维
不一样
->白盒测试:根据源代码写测试方法或者测试用例->根据测试的粒子度:
->方法测试:function test->单元测试:unit test->集成测试:intergration test->根据测试的次数:
->冒烟测试:smoke test 反复不停的执行,反复不停的使用(android猴子
来测试)
->adb shell
->monkey
->monkey 5000(点击五千次)
->压力测试:pressure test同时抗住多人的请求->
22、android下junit测试框架配置
23、logcat简介
->日志信息级别:
Verbose:提醒 黑色
Debug: 调试 蓝色
Info: 信息 绿色
Warn: 警告 橙色
Error: 错误 红色
24、保存文件到手机内存
->数据存储与访问
->文件
->SharePreferences(参数)
->SQLite数据库
->内容提供者(Content Provide)
->网络
->LinearLayout一定要设置水平还是垂直->文件保存:
->javase中通过创建文件对象,但是在androi中这种存放方式会失败,因
为会默认为存储在当前目录文件下
->android中创建一个包:com.itheima.login.service
创建一个类:LoginService.java
异常的处理:如果是返回值是boolean,那么抛出处理都可以,但是如果返回值是void,那么只能抛出了
->context:上下文就是一个类,这个类提供了很多方便的API,可以得到应用程
序的环境
环境包名 安装路径 文件的路径 资源的路径 资产的路径
放到缓存文件夹里面:getCacheDir();->getAssest();->getResource();->getFilesDir();/data/data/包名
->getCacheDir();/data/data/包名/cache
->MainActivity.java package com.example.login;
import java.util.Map;
import android.app.Activity;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.service.LoginService;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把页面加载进来然后才有控件的获取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
Map map = LoginService.getSavaUserInfo(this);
if(map!= null){
et_number.setText((CharSequence)map.get(”username“));
et_passwd.setText((CharSequence)map.get(”passwd“));
} }
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登录名或者密码不能为空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果选择了保存用户密码,那么就保存用户密码
boolean results = LoginService.saveuserInfo(this,number, passwd);
if(results){
Toast.makeText(this, ”保存用户信息成功“, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, ”保存用户信息失败“, Toast.LENGTH_SHORT).show();
}
}
//登陆发送消息到服务器,服务器验证是否正确
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陆成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登录失败,用户名或者密码不正确“, Toast.LENGTH_LONG).show();
}
} } }
->LoginService.java package com.example.login.service;
import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.util.HashMap;import java.util.Map;
import android.content.Context;/* * 保存用户名密码的的业务方法 */ public class LoginService { public static boolean saveuserInfo(Context context,String userName,String passWord){//没有使用任何类的方法,推荐使用静态方法
//File file = new File(”/data/data/com.example.login/info.txt“);
File file = new File(context.getFilesDir(),”info.txt“);
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write((userName+”##“+passWord).getBytes());
fos.close();
return true;
} catch(FileNotFoundException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
return false;
}
} /* * 获取保存到的数据
*/ public static Map getSavaUserInfo(Context context){
File file = new File(context.getFilesDir(),”info.txt“);
Map map = new HashMap();;
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
String str = bufferedReader.readLine();
String[] infos = str.split(”##“);
map.put(”username“, infos[0]);
map.put(”passwd“, infos[1]);
} catch(FileNotFoundException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
return null;
} catch(IOException e){
// TODO 自动生成的 catch 块
e.printStackTrace();
return null;
}
return map;} }
->activity_main.xml
android:id=”@+id/bt_login“
android:onClick=”login“
android:layout_width=”100dp“
android:layout_height=”wrap_content“
android:layout_alignParentRight=”true“
android:text=”@string/bt_login“
/>
android:id=”@+id/cb_remPass“
android:layout_width=”wrap_content“
android:layout_height=”wrap_content“
android:layout_alignParentLeft=”true“
android:layout_alignParentTop=”true“
android:layout_alignBottom=”@id/bt_login“
android:text=”@string/remPass“
android:checked=”true“ />
25、android下文件访问的权限
->private、readable、writeable、public
26、保存文件到SD卡中
->存储空间:
->手机的内部存储空间:小硬盘 /data/data->外部存储空间:SD卡 路径/mnt/sdcard 可以简写成/sdcard/
需要权限WRITE_EXTER_STORAGE
操作SD卡必须要权限
->保存数据到SD卡只需要把路径改为SD卡,读不需要权限,否则需要权限
在4.0以前的版本读SD卡不需要权限,但是在4.0以
后读写SD卡可以设置SD卡保护,读就需要权限 READ_EXTER_STORAGE->判断是否存在SD卡:Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
->为了保证程序的兼容性,有些SD卡可能路径会改变,因此系统提供了获取SD 卡的路径的方法
Environment.getExternalStorageDirectory()
27、分析setting源代码获取SD卡大小
->source的源代码是SDK的源代码,是jar里面的源代码->导入通用的文件项目eclipse要求必须要有setting文件->ctrl+h搜索文件夹
package com.example.sdsize;
import java.io.File;
import android.app.Activity;import android.os.Bundle;import android.os.Environment;import android.os.StatFs;import android.text.format.Formatter;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_SDsize;protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button =(Button)findViewById(R.id.bt_find);tv_SDsize =(TextView)findViewById(R.id.tv_SDSize);
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0){
// TODO 自动生成的方法存根
StringBuilder memorySizeInfo = new StringBuilder();
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
memorySizeInfo.append(getExternalSize());
}else{
Toast.makeText(MainActivity.this,”无内存卡“, Toast.LENGTH_SHORT).show();
}
memorySizeInfo.append(getRomSpaceInfo());
tv_SDsize.setText(memorySizeInfo.toString());
}
});} /* * 获取SD卡的存储信息 */ public String getExternalSize(){
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
long availableBlocks = stat.getAvailableBlocks();
long totalSize = blockSize*totalBlocks;
long availSize = blockSize*availableBlocks;
String totalStr = Formatter.formatFileSize(this, totalSize);
String availStr = Formatter.formatFileSize(this, availSize);
String ExternalSize = ”SD总存储空间:“+ totalStr + ”可使用的空间:“ + availStr;
return ExternalSize;} /* * 获取可用的内部存储 */ public String getRomSpaceInfo(){
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long internalblockSize = stat.getBlockSize();
long internalblockcounts = stat.getBlockCount();
long internaltotalSize = internalblockSize*internalblockcounts;
String totalStr = Formatter.formatFileSize(this, internaltotalSize);
String RomSpaceInfo = ”可用的内存“+ totalStr;
} return RomSpaceInfo;} @Override public boolean onCreateOptionsMenu(Menu menu){ // Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}
28、sharedPreferences入门
->数据存储的API:用##分割用户名和密码的缺陷,真实存
储的话必须要把##转移成其他字符,sharePreferences
(共享参数)提供了一种方便存储数据的方式。
->在data目录下创建了一个xml文件,根节点是map,其实是以map集合来存
储的用户名和密码的对特殊字符进行了转义
package loginsharedPreference.service;
import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;
/* * 保存用户名密码的的业务方法 */ public class LoginService { public static void SavaUserInfo(Context context,String username,String passwd){
//拿到上下文之后,有个方法叫getSharedPreferences
SharedPreferences sharedPreferences = context.getSharedPreferences(”config“, Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//得到sharedPreferences的编辑器
}
editor.putString(”username“,username);editor.putString(”passwd“,passwd);//类似于数据库的事物
editor.commit();//当前方法不会存在异常,所以设置为void } package loginsharedPreference;
import java.util.Map;
import loginsharedPreference.service.LoginService;import android.app.Activity;import android.content.SharedPreferences;import android.os.Bundle;import android.text.TextUtils;import android.view.Menu;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.Toast;
import com.example.login.R;
public class MainActivity extends Activity {
private EditText et_number;private EditText et_passwd;private CheckBox cb_remPass;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先要把页面加载进来然后才有控件的获取
et_number =(EditText)findViewById(R.id.et_number);
et_passwd =(EditText)findViewById(R.id.et_passwd);
cb_remPass =(CheckBox)findViewById(R.id.cb_remPass);
SharedPreferences sharedPreferences = getSharedPreferences(”config“,MODE_PRIVATE);
String username = sharedPreferences.getString(”username“, ”“);
String passwd = sharedPreferences.getString(”passwd“, ”“);
et_number.setText(username);
et_passwd.setText(passwd);
}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} public void login(View v){
String number = et_number.getText().toString().trim();
String passwd = et_passwd.getText().toString().trim();
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(passwd)){
Toast.makeText(this, ”登录名或者密码不能为空“, Toast.LENGTH_SHORT).show();
return;
}else{
if(cb_remPass.isChecked()){
//如果选择了保存用户密码,那么就保存用户密码
LoginService.SavaUserInfo(this,number, passwd);
Toast.makeText(this, ”保存用户信息成功“, Toast.LENGTH_SHORT).show();
}
//登陆发送消息到服务器,服务器验证是否正确
if(”zhangsan“.equals(number)&&”123456“.equals(passwd)){
Toast.makeText(this, ”登陆成功“, Toast.LENGTH_LONG).show();
}else{
Toast.makeText(this, ”登录失败,用户名或者密码不正确“, Toast.LENGTH_LONG).show();
}
} } }
29、xml文件的序列化
->一个小异常:如果没有识别这个设备,重启的话要记得吧adb杀掉->自己手动添加,这种方式效率低,容易出错->XmlSerializer:XML序列化生成器
30、采用pull解析xml文件
->用于对象的持久化,将对象写到硬盘中,需要用的时候再反序列化取出来。
所谓序列化其实就是将程序中的数据(对象)通过某种方式,保存到本地中。然后可以在程序关闭之后还保存程序的某个执行状态,方便在程序下次
执行的时候通过”反序列化“读取出来,并且能够还原数据的类型,从而延续程序退出时的状态。
一般来说,我们会使用序列化保存一些需要持久化的数据,当然如果这个数据会比较庞大的话,我们就直接使用数据库了!所以,序列化实际上目前很多领域用的已经不多了,大部分使用 都已被数据库替代了!
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStrea
->xml文件的解析方式:
->DOM一次将XML文件加载进内存,生成树状结构,在内存中对树状结构进
行操作,缺点是消耗内存大,->SAX解析:基于事件的方式,自上而下,事件下去了就不能解析了,优点
是速度快,效率高,缺点是不能倒退;
->android下增加了一种解析xml文件的方式,pull解析,类似于SAX解析,定义了一个指针,指向了文档的开头,得到指针,一个tag一个tag的解析下去
->利用类加载器走到文件->创建一个解析器:pullParse0
具体代码:
(MainActivity.java)package com.example.xml;
import java.util.List;
import org.w3c.dom.Text;
import com.example.xml.domain.WeatherInfo;import com.example.xml.service.WeatherService;
import android.support.v7.app.ActionBarActivity;import android.support.v7.app.ActionBar;import android.support.v4.app.Fragment;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import android.os.Build;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv =(TextView)findViewById(R.id.tv);
List weatherInfos = WeatherService.getWeatherInfos(MainActivity.class.getClassLoader().getResourceAsStream(”weather.xml“));
StringBuilder sb = new StringBuilder();
for(WeatherInfo info:weatherInfos){
sb.append(info.toString()+”n“);
}
tv.setText(sb.toString());}
@Override public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu;this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);
return true;} }
(WeatherInfo.java)/** * */ package com.example.xml.domain;
import android.R.integer;/** * @author yonghen * */ public class WeatherInfo { private int id;private String name;private String wind;private String weather;private String temp;private String pm;/*(non-Javadoc)* @see java.lang.Object#toString()*/ @Override public String toString(){
return ”WeatherInfos [id=“ + id + ”, name=“ + name + ”, wind=“ + wind
+ ”, weather=“ + weather + ”, temp=“ + temp + ”, pm=“ + pm
+ ”]“;}
/** * @param id * @param name * @param wind * @param weather
* @param temp * @param pm */ public WeatherInfo(){ super();} public WeatherInfo(int id, String name, String wind, String weather,String temp, String pm){ super();this.id = id;this.name = name;this.wind = wind;this.weather = weather;this.temp = temp;this.pm = pm;} /** * @return the id */ public int getId(){ return id;} /** * @param id the id to set */ public void setId(int id){ this.id = id;} /** * @return the name */ public String getName(){ return name;} /** * @param name the name to set */ public void setName(String name){ this.name = name;} /** * @return the wind */
public String getWind(){ return wind;} /** * @param wind the wind to set */ public void setWind(String wind){ this.wind = wind;} /** * @return the weather */ public String getWeather(){ return weather;} /** * @param weather the weather to set */ public void setWeather(String weather){ this.weather = weather;} /** * @return the temp */ public String getTemp(){ return temp;} /** * @param temp the temp to set */ public void setTemp(String temp){ this.temp = temp;} /** * @return the pm */ public String getPm(){ return pm;} /** * @param pm the pm to set */ public void setPm(String pm){ this.pm = pm;
}
}
(WeatherService.java)/** * */ package com.example.xml.service;
import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;
import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;
import android.R.integer;import android.util.Xml;
import com.example.xml.domain.WeatherInfo;/** * @author yonghen * */ public class WeatherService { public static List getWeatherInfos(InputStream inputStream){
XmlPullParser xmlPullParser = Xml.newPullParser();
WeatherInfo weatherInfo = null;
List weatherInfos = null;
try {
xmlPullParser.setInput(inputStream, ”utf-8“);
int type = xmlPullParser.getEventType();//拿到的是当前的事件类型:
while(type!= xmlPullParser.END_DOCUMENT){
switch(type){
case XmlPullParser.START_TAG:
if(”info“.equals(xmlPullParser.getName())){//解析到全局开始的标签
weatherInfos = new ArrayList();
}else if(”city“.equals(xmlPullParser.getName())){
weatherInfo = new WeatherInfo();
String idString = xmlPullParser.getAttributeName(0);
weatherInfo.setId(Integer.parseInt(idString));//字符串转化成整型数据
}else if(”temp“.equals(xmlPullParser.getName())){
String temp = xmlPullParser.nextText();
weatherInfo.setTemp(temp);
}else if(”wind“.equals(xmlPullParser.getName())){
String wind = xmlPullParser.nextText();
weatherInfo.setWind(wind);
}else if(”name“.equals(xmlPullParser.getName())){
String name = xmlPullParser.nextText();
weatherInfo.setName(name);
}else if(”weather“.equals(xmlPullParser.getName())){
String weather = xmlPullParser.nextText();
weatherInfo.setName(weather);
}else if(”pm“.equals(xmlPullParser.getName())){
String pm = xmlPullParser.nextText();
weatherInfo.setPm(pm);
}
break;
case XmlPullParser.END_TAG:
if(”city“.equals(xmlPullParser.getName())){
weatherInfos.add(weatherInfo);
weatherInfo=null;
}
break;
}
type = xmlPullParser.next();
}
} catch(XmlPullParserException e){
// TODO Auto-generated catch block
e.printStackTrace();
} catch(IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
return weatherInfos;} }(Weather.xml)
20/30
5月20日 多云转晴
南风3-4
上海
200
20/30
5月19日 多云转晴
南风3-4
上海
200
20/30
5月18日 多云转晴
南风3-4
上海
200
20/30
5月17日 多云转晴
南风3-4
上海
200
31、采用断点调试的方法观察pull解析的的流程
->现在代码双单击添加断点
->debug as Android Application->然后打开调试视图
32、android下创建一个sqllite数据库
->SQLiteOpenHelper(数据库大概帮助类):数据库创建和打开的帮助类->
->PersonSQLiteOpenHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/**
* @数据库的构造方法,用来定义数据库的名称,数据库查询的结果集,数据库的版本 */ public PersonSQLiteHelper(Context context){//Context:上下文告诉数据库存放在什么位置,String name:数据库名,factory一般为null,设置系统默认的游标工厂,super(context, ”Person.db“, null, 1);
} /* * 数据库第一次被创建的时候调用的方法,db创建的数据库 */ @Override public void onCreate(SQLiteDatabase db){
db.execSQL(”create table person id integer primary antoincrement,name varchar(20),number varchar(20)");//底层存储类型都是String,(20)都是给程序员看的,其实没有影响
}
/*(non-Javadoc)* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ } }
->TestPersonDB.java /** * */ package com.example.sqlite;
import android.database.sqlite.SQLiteAbortException;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;/** * @author yonghen * */ public class TestPersonDB extends AndroidTestCase { public void testCreateDB(){ PersonSQLiteHelper personSQLiteHelper = new PersonSQLiteHelper(getContext());//new出来一个对象,实际上数据库并未被真正的创建,测试框架提供了一个获取Context的方法
personSQLiteHelper.getWritableDatabase();//数据库才会被真正的创建出来, } }
33、sql语句实现数据库的增删改查
->javaweb:
->加载到jdbc的驱动;//android已经集成在framework->链接到数据库;//只要拿到数据库的引用
->准备sql语句 增删改查
->增加:insert into person(name,number)values('zhang','110')->删除:delete from person where name = 'zhangsan'->修改:update person set number = '119' where name = 'zhangsan'->查找:select * from person->查找具体:select * from person where name = 'zhangsan'
->PersonSQLiteHelper.java /** * */ package com.example.sqlite;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;/** * @author yonghen * */ public class PersonSQLiteHelper extends SQLiteOpenHelper {
/** * @数据库的构造方法,用来定义数据库的名称,数据库查询的结果集,数据库的版本
*/ public PersonSQLiteHelper(Context context){//Context:上下文告诉数据库存放在什么位置,String name:数据库名,factory一般为null,设置系统默认的游标工厂,
院系:美术学院班级:11级美术学国画一班学号:111014021姓名:李星
自我介绍
我是一名应届毕业生,来自河南济源的一个农村家庭,农村生活铸就了我淳朴、诚实、善良的性格,培养了我不怕困难挫折,不服输的奋斗精神。
在学习和生活中我总是严格要求自己,凡事没有最好,只有更好。我深知学习机会来之不易,在校期间非常重视专业课的学习,专业课成绩总是名列前茅。同时,在文化课方面也取得了良好的成绩。
专业课获奖情况:
① 2013年版画作品入选洛阳博物馆,并被学校收藏
②2013年6月第六届宿舍文化节”留住美好时光作品展”活动中,荣获优秀奖
③2013年山水作品入选学校展览
文化课获奖情况:
① 2011-2012学年荣获“国家励志奖学金”证书
② 2011-2012学年荣获“三好学生”证书
③ 2012-2013学年荣获“三好学生”证书
④ 2012-2013学年荣获“优秀团员”证书
⑤ 2012-2013学年荣获“国家励志奖学金”证书
而在学习专业知识和文化课的同时,还十分重视培养自己的实践能力,利用暑假参加了暑期三下乡(支教)活动,并在2013年获得“暑期实践先进个人”荣誉称号。从这次活动中我也学到了书本上学不到的知识,更加锻炼了我的能力,对我以后的从事教育工作,打下一个小小的基础,更加激励我向前迈进。
做一名合格的老师是我一直以来努力的方向,所以我始终按一名老师的要求来约束自己,“没有最好,只有更好”是我大学一直在做的。
在学习之余,我还不忘多卡一些课外书籍,丰富自己的知识,拓宽自己的知识面,而且坚持参加各种体育活动与社交活动。在学习方面,我学习认真、刻苦,具有较好的文字组织能力,有一定的英语听说读写能力。在思想行为方面,我作风优良、待人诚恳,能较好处理人际关际,在学校和同学相处融洽;乐观面对一些挫折,处事冷静稳健,能合理地统筹安排生活中的事务。
总之,在大学期间,我始终以提高自身的综合素质为目标,以自我的全面发展为努力方向,树立正确的人生观、价值观和世界观。为适应社会发展的需求,我认真学习各种专业知识,发挥自己的特长;挖掘自身的潜力,结合每年的暑期社会实践机会,从而逐步提高了自己的学习能力和分析处理问题的能力
院系:美术学院班级:11级美术学国画一班学号:111014021姓名:李星 而教师是教育过程中的主导力量。教师道德品质不仅是教师自身的行为规范,而且还是作用于学生的教育手段。其高尚与否,关系到到素质教育能否得以正确顺利地实施。
教师必须有高尚的品德。教师职业的最大特点是培养、塑造新一代,自己的道德品质将直接影响下一代的成长。在教育活动过程中,教师既要把丰富的科学文化知识传授给学生,又要用自己的高尚人格影响学生、感化学生,使学生的身心健康地成长发展。因而教师必须要有高尚的思想境界,纯洁美好的心灵。在工作中,教师要安贫乐教,甘于奉献。必须耐得住寂寞,受得住挫折,将自己的所有精力全身心地投入到教学实践中去,正如著名教育家陶行知所说的“捧得一颗心来,不带半根草去”。
教师对学生要有一颗慈母般的爱心。教师对学生慈母般的爱心应来自对教育事业的无限忠诚,对教育事业的强烈事业心和高度责任感。教师的母爱精神具有巨大的感召作用和教化力量,她能彻底地化解学生的逆反心理和对抗情绪,最大限度地激发学生的学习主观能动性。在日常教学中,教师如像母亲一样,无微不至地关心学生,帮助学生,对差生不嫌弃,不歧视,给他们多一点爱,就能极大地激发学生的积极性,使其在学习上有无穷的力量源泉。很多教师的成功经验都证明了母爱力量的神奇作用。
教师要不断更新充实自己的学识。博学多才对一位教师来说当然很重要。因作我们是直接面对学生的教育者,学生什么问题都会提出来,而且往往“打破沙锅问到底”。没有广博的知识,就不能很好地解学生之“惑”,传为人之“道”。但知识绝不是处于静止的状态,它在不断地丰富和发展,每时每刻都在日新月异地发生着量和质的变化,特别是被称作“知识爆炸时代”、“数字时代”、“互联网时代”的今天。因而,我们这些为师者让自己的知识处于不断更新的状态,跟上时代发展趋势,不断更新教育观念,改革教学内容和方法,显得更为重要。否则,不去更新,不去充实,你那点知识就是一桶死水,终会走向腐化。
通过学习,我深知作为人类灵魂的工程师,必须具有高尚的道德品质,对学生要有慈母般的爱心,且不断更新、充实自己的知识,做到与时代同步,才能培养出符合社会发展需要的人才,挑好肩上教书育人的重担。
所以我会始终按一名老师的要求来约束自己,做好以上的几点,为教师之路向前迈进。