第一章、环境搭建前端
一、项目下的目录:java
lib:存放源代码编译出来的文件。android
res:资源文件夹:文件下的资源是会被编译的,而且在gen目录下的R.java中生成ID。shell
assers:文件下的资源是不会被编译的。windows
project.properties:表明编译的版本。对应android.jar包的版本。api
gen:自动生成的目录文件。数组
AndroidManifest.xml:清单文件,程序的配置信息,有启动的图标、应用程序名称、包名、版本号、在桌面上建立快捷方式。缓存
二、环境变量配置:网络
找E:\Android\adt-bundle-windows-x86-20130729\sdk\platform-tools下的adb.exe。app
方法一:在用户变量Path中直接输入路径。
方法二:在系统变量中新建Android-HOME,值为sdk路径(E:\Android\adt-bundle-windows-x86-20130729),而后在用户变量Path中添加%Android-HOME%\platform-tools。
方法三:在系统变量Path中直接输入路径。
三、名词含义:
(1)avd:Android virtual devices Android虚拟设备
(2)adt:Android develop tools Android开发工具(eclipse的插件)
(3)sdk:standard develop kits 标准开发工具集
(4)adb.exe:android debug bridge Android调试桥 每一个模拟器可看做一个独立的Linux系统,要与Windows系统联系起来就要用到android调试桥。
四、常见的命令操做:
adb devices :列出全部链接的模拟器设备。
reset adb :重启adb的调试桥(至关于执行了如下两个指令)。
adb kill-server :杀死adb调试桥。
adb start-server :启动adb调试桥。
netstat -ano :查询当前端口占用状况。
adb install HelloWorld.apk :为虚拟机安装apk程序。
adb uninstall HelloWorld :卸载程序。
adb -s emulater-5554 install HelloWorld.apk:如有多个机子,为指定机子安装程序。
adb pull 设备中文件 此文件命名 :将设备中的文件导出来。
adb push 文件 导入手机后的名称 /位置 :将文件导入手机。
adb -v :查看adb版本。
adb shell :远程链接到模拟器Linux终端。能够对模拟器文件进行操做。ls:显示目录结构。ps :列出正在进行的进程。ping :查看手机网络连通性。
adb logcat :查看日志文件
Ctrl+F11 :横竖屏切换。
五、apk安装的过程:
①利用javac将.java文件编译成.class文件
②用dx.bat将.class文件编译成.dex文件
③resources.arsc :应用程序全部的资源放到此文件中
六、eclipse的操做:
(1)将部分代码抽取出来放在一个方法里面:选中要抽取的代码,右键Refactor-----Extract method...
(2)捕获异常:选中代码,右键Surround With-------Try/catch Block...
第二章、Android基本知识
一、布局:
(1)霓虹灯效果:FrameLayout层叠嵌套(见例FrameLayout下的NeonLight)。
A.用进程的概念:先new Handler对象handler,调用handler.postDelayed(this,300)方法,实现Runnable接口中的void run(),每300秒执行run()方法。
B.用数组实现TextView的颜色循环变化。
(2)按钮分而治之:线性布局linearlayout(见例FrameLyout下的MainActivity)。
A.线性布局LinearLayout里面的属性:android:layout_weight=”1”;表明同一层次的布局将页面水平(horizontal)或垂直(vertical)按比例分割。
B.组件里面的位置属性是android:layout_gravity=”center”;布局里面的位置属性是android:gravity=”center”;
二、相对布局RelativeLayout:注重控件之间的位置关系。
(1)相对与控件的一些属性:
android:layout_below=”控件ID” :某控件的下方。
android:layout_toLeftOf=”控件ID” :某控件的左边。
android:layout_toRightOf=”控件ID” :某控件的右边。
android:layout_above=”控件ID” :某控件的上边。
android:layout_alignLeft=”控件ID” :与某控件左边对其。
(2)相对于父窗口的属性:
android:layout_centerInParent=”true” :在父窗体居中。
android:layout_centerHorizontal=”true” :在父窗体水平居中。
android:layout_centerVertical=”true” :在父窗体垂直居中。
android:layout_alignParentButton=”true” :与父窗体底部对齐。
三、android中的基本单位:
dp == dip 单位像素密度。在不一样大小的屏幕分配的像素不一样,按比例分配。Android中控件的位置单位通常用dp。
px : 固定像素。不论屏幕有多大,距离都是固定的像素,因此不一样屏幕中控件可能会乱,因此不建议使用。
sp : 和dp差很少,专门为文字大小建立的单位,。使得文字在缩放的时候不会产生锯齿。
四、线性布局LinearLayout:注重控件在水平或垂直的排列。
(1)LinearLayout中的属性:
android:orientation=”vertical” (horizontal) :布局里面控件垂直(水平)排列。
(2)控件中的属性:
android:layout_weight = ”1” :权重,将控件按比例分配空间。
android:gravity=”center” :控件中的内容居中显示,默认是left。
五、表格布局TableLayout:
(1)<TableRow>
放入控件,按表格显示。
</TableRow>
六、绝对布局Absolutely:
(1)控件位置属性:
android:layout_x=”100dp” :控件与父窗体左边界的距离。
android:layout_y=”100dp” :控件距父窗体上边界的距离。
七、帧布局FrameLayout:各控件层层覆盖。
(1)控件中的属性:
android:visibility=”visible” :设置此控件可见。
android:visibility=”invisible” :设置此控件不可见。
例子:帧布局。实现某一控件的隐藏,如视频播放器暂停时会出现暂停图标。
八、fragment:
(1)概念:帧 片断 轻量级的activity。封装布局(封装UI的机制)和代码的组件,可看做一个panel容器。不须要在清单文件中配置。平板的用处比较大。
注:在sdk的版本11后才有。
(2)建立Fragment的两种方法
A、在xml中fragment里面属性class,指定此片断中内容的类位置。(见例FirstFragment)。
继承Fragment的类要实现onCreateView()方法,进行建立,返回View。
B、在主Activity的类中直接调用Fragment类建立对象,用fragment管理器替换当前片断。(见例Fragment页面切换)。
得到fragment的管理器:FragmentManager fm = getFragmentManager();
开启此管理器的事务:FragmentTransaction ft = fm.beiginTransaction();
注:既然是事务(操做同时成功,或操做失败),在最后就得关闭事务:ft.commit();
Fragment的添加:ft.add(); 移除:ft.remove();
替换(第一个参数:当前Activity的界面):ft.replace(android.R.id.content,fragment1);
(3)Fragment之间的传值:
Android中传递数据通常用bundle,
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putString("name", "Hello Fragment1");
fragment.setArguments(bundle);
接收传来的值getArguments():
String name = getFragmentManager().findFragmentByTag("fragment")
.getArguments().getString("name");
(4)Fragment的向下兼容(在低版本的手机上也能够用fragment):
建立的每一个项目都会在libs的文件夹下有一个android-support-v4.jar包,Fragment导包import android.support.v4.app.Fragment; 得到管理器时FragmentManager fm = getSupportFragmentManager(); Activity继承的是FragmentActivity。
九、实现点击事件的四中方法:
(1)建立一个内部类定义点击事件。
button.setOnClickListener(new MyListener);
private class MyListener implements OnClickListener{
public void onClick(View view){
//点击事件的具体操做
}
}
(2)采用匿名内部类建立点击事件。
button.setOnClickListener(new OnClickListener(){
public void onClick(View view){
//点击事件的具体操做
}
});
(3)让Activity实现点击事件接口里面的点击方法。
button.setOnClickListener(this);
好处:此页面中可能有不少点击事件,避免用内部类,减小代码。
(4)在要点击的view对象里面添加点击属性。
android:onClick=”onclick_button”
十、电话拨号器:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel”+number));
startActivity(intent);
十一、短信发送器:
(1)设置EditText的行数:
android:lines=”5” 行数为5的文本编辑框。
android:singleline=”true” 单行文本编辑框。
(2)主要代码:
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
//判断号码与内容是否为空
if(TextUtils.isEmpty(number)||TextUtils.isEmpty(content)){
Toast.makeText(MainActivity.this, "号码或发送内容不能为空", Toast.LENGTH_SHORT).show();
return;
}
//建立短信管理实例
SmsManager sm = SmsManager.getDefault();
//短信内容过大时,将内容分割,分批发送
ArrayList<String> contents = sm.divideMessage(content);
for(String str:contents){
//第一个参数:要发送的地址;第二个参数:发送方的地址;第三个参数:发送内容; 第四个参数:是否发送失败;第五个参数:送达报告
sm.sendTextmessage(number,”110”,str,null,null);
}
十二、测试
(1)根据测试是否知道源代码:
黑盒测试:只关心程序执行的过程和结果。
白盒测试:根据源代码写测试方法和测试用例。
(2)根据测试的粒度:
方法测试:function test
单元测试:unit test
集成测试:intergration
(3)根据测试的次数:
冒烟测试:smoke test (android 猴子)
在cmd中进入手机终端adb shell---------monkey--------monkey 5000
此命令在手机上胡乱随机点击5000次。
压力测试:pressure test
1三、保存文件到手机内存(见例:登录界面保存密码)
(1)保存文件:
try {
// File file = new File("/data/data/com.itheima.login/info.txt");
/*
*为了不包名的修改等操做,会对文件路径有影响,没必要在代码中改动,
*谷歌工程师暴露出一个context的方法
*context.getFilesDir()
*帮助返回一个目录/data/data/com.itheima.login/files/
* 注:在包名根目录下建立了files的文件夹
*/
String path = context.getFilesDir().toString();
File file = new File(path,"info.txt");
FileOutputStream fos = new FileOutputStream(file);
//将用户名和密码保存为zhangsan##123格式
fos.write((userName+"##"+password).getBytes());
//关闭流
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
//打印日志
Log.i(tag, userName);
Log.d(tag, password);
Toast.makeText(context, "用户信息存储失败!", 0).show();
return false;
}
(2)回显:
try {
String path = context.getFilesDir().toString();
File file = new File(path,"info.txt");
FileInputStream fis = new FileInputStream(file);
BufferedReader bf = new BufferedReader(new InputStreamReader(fis));
String str = bf.readLine();
//zhangsan##123 将此文本分隔出来
String[] s = str.split("##");
Map<String, String> map = new HashMap<String, String>();
map.put("userName", s[0]);
map.put("password", s[1]);
return map;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
(3)catch :缓存文件夹。
1四、内存中文件访问权限(见例:文件访问权限):
Linux系统下的文件访问权限,用权限permissions下的十个字符来标识。见下图。
十个字符:位置0:- 表明文件(在内存中定义为0),d表明目录(内存中定义为1)。
位置1~3:表明当前用户(此程序),r可读,w可写,x可执行,不管何种模式对当前用户可读可写。
位置4~6:表明当前用户所在的组。(组:通常状况下每一个用户是一个组,系统中有些应用程序是一个组。 查看终端组:在cmd下进入终端adb shell~~~~cd data/data/~~~ls -l 能够看到第一列为权限,第二列为用户ID,第三列为用户所在的组,第四列是包名)。
位置7~9:表明其余用户的权限。
在内存中:用二进制表示。- --- --- --- 四个十进制表示0 0 0 0,以下:
这些访问权限值在终端是能够修改的,首先找到该文件:adb shell~~~cd data/data/~~~cd com.itheima.login~~~cd files~~~ls -l 获得files目录的文件,改变文件权限:chmod 666 private.txt
(1)私有文件:
FileOutputStream fos = context.openFileOutput(“private.txt”,Context.MODE_PRIVATE);
(2)可读的文件:
FileOutputStream fos = context.openFileOutput(“read.txt”,Context.MODE_WORLD_READABLE);
(3)可写的文件:
FileOutputStream fos = context.openFileOutput(“write.txt”,Context.MODE_WORLD_WRITEABLE);
(4)可读可写的文件:
FileOutputStream fos = context.openFileOutput(“public.txt”,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);
(5)默认文件权限类型:
File file = new File(context.getFilesDir().toString(),”info.txt”);
FileOutputStream fos = new FileOutputStream(file);
第三章、知识点总结
一、从assets中得到某文件的内容:
InputStream in = getActivity().getResources().getAssets().open(文件名);
二、判断屏幕朝向(横或竖):
int width = getWindowManager().getDefaultDisplay().getWidth();
int Height = getWindowManager().getDefaultDisplay().getHeight();
水平方向:width>height; 反之是垂直方向。
三、Ctrl+1:xml文件中android:text=”国际化”,里面的内容能够用此快捷键设置将其替换到string.xml中。
Ctrl+F:修改选中内容,将此页面中同名的都改掉。
四、Url:统一资源定位符。Uri:统一资源标识符。Uri的范围大于Url。
五、trim():将字符串中的空格和回车去掉。
String number = editText.getText().toString().trim();
六、android中判断文本是否为空:
文本工具类TextUtils的isEmpty()方法,返回boolean类型。
例:if(TextUtils.isEmpty(number)){}
七、日志信息LogCat:
分等级:verbose 提醒 黑色
Debug 调试 蓝色
Info 信息 绿色
Ware 警告 橙色
Error 错误 红色
Log.v(tag,”输出内容”) tag为找到此日志的标识。同理还有d、i、w、e。
八、context上下文:
就是一个系统类,提供一些方便的api,里面的方法能够获得应用程序的环境(包名,安装路径,文件路径,资源路径,资产路径)。
context.getFilesDir() :获得应用程序的包名下的files文件夹。
context.getCatchDir():获得缓存目录(包名下的catch文件夹)。
context.openFileOutput(name,mode):在包名下建立文件。