第一章、环境搭建
1、项目下的目录:
lib:存放源代码编译出来的文件。
res:资源文件夹:文件下的资源是会被编译的,并且在gen目录下的R.java中生成ID。
assers:文件下的资源是不会被编译的。
project.properties:代表编译的版本。对应android.jar包的版本。
gen:自动生成的目录文件。
AndroidManifest.xml:清单文件,程序的配置信息,有启动的图标、应用程序名称、包名、版本号、在桌面上创建快捷方式。
2、环境变量配置:
找E:\Android\adt-bundle-windows-x86-20130729\sdk\platform-tools下的adb.exe。
方法一:在用户变量Path中直接输入路径。
方法二:在系统变量中新建Android-HOME,值为sdk路径(E:\Android\adt-bundle-windows-x86-20130729),然后在用户变量Path中添加%Android-HOME%\platform-tools。
方法三:在系统变量Path中直接输入路径。
3、名词含义:
(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调试桥。
4、常见的命令操作:
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 :横竖屏切换。
5、apk安装的过程:
①利用javac将.java文件编译成.class文件
②用dx.bat将.class文件编译成.dex文件
③resources.arsc :应用程序所有的资源放到此文件中
6、eclipse的操作:
(1)将部分代码抽取出来放在一个方法里面:选中要抽取的代码,右键Refactor-----Extract method...
(2)捕获异常:选中代码,右键Surround With-------Try/catch Block...
(3)
第二章、Android基本知识
1、布局:
(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”;
2、相对布局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” :与父窗体底部对齐。
3、android中的基本单位:
dp == dip 单位像素密度。在不同大小的屏幕分配的像素不同,按比例分配。Android中控件的位置单位一般用dp。
px : 固定像素。不论屏幕有多大,距离都是固定的像素,所以不同屏幕中控件可能会乱,所以不建议使用。
sp : 和dp差不多,专门为文字大小创建的单位,。使得文字在缩放的时候不会产生锯齿。
4、线性布局LinearLayout:注重控件在水平或垂直的排列。
(1)LinearLayout中的属性:
android:orientation=”vertical” (horizontal) :布局里面控件垂直(水平)排列。
(2)控件中的属性:
android:layout_weight = ”1” :权重,将控件按比例分配空间。
android:gravity=”center” :控件中的内容居中显示,默认是left。
5、表格布局TableLayout:
(1)<TableRow>
放入控件,按表格显示。
</TableRow>
6、绝对布局Absolutely:
(1)控件位置属性:
android:layout_x=”100dp” :控件与父窗体左边界的距离。
android:layout_y=”100dp” :控件距父窗体上边界的距离。
7、帧布局FrameLayout:各控件层层覆盖。
(1)控件中的属性:
android:visibility=”visible” :设置此控件可见。
android:visibility=”invisible” :设置此控件不可见。
例子:帧布局。实现某一控件的隐藏,如视频播放器暂停时会出现暂停图标。
8、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。
9、实现点击事件的四中方法:
(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”
10、电话拨号器:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel”+number));
startActivity(intent);
11、短信发送器:
(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);
}
12、测试
(1)根据测试是否知道源代码:
黑盒测试:只关心程序执行的过程和结果。
白盒测试:根据源代码写测试方法和测试用例。
(2)根据测试的粒度:
方法测试:function test
单元测试:unit test
集成测试:intergration
(3)根据测试的次数:
冒烟测试:smoke test (android 猴子)
在cmd中进入手机终端adb shell---------monkey--------monkey 5000
此命令在手机上胡乱随机点击5000次。
压力测试:pressure test
13、保存文件到手机内存(见例:登陆界面保存密码)
(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 :缓存文件夹。
14、内存中文件访问权限(见例:文件访问权限):
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);
第三章、知识点总结
1、从assets中获得某文件的内容:
InputStream in = getActivity().getResources().getAssets().open(文件名);
2、判断屏幕朝向(横或竖):
int width = getWindowManager().getDefaultDisplay().getWidth();
int Height = getWindowManager().getDefaultDisplay().getHeight();
水平方向:width>height; 反之是垂直方向。
3、Ctrl+1:xml文件中android:text=”国际化”,里面的内容可以用此快捷键设置将其替换到string.xml中。
Ctrl+F:修改选中内容,将此页面中同名的都改掉。
4、Url:统一资源定位符。Uri:统一资源标识符。Uri的范围大于Url。
5、trim():将字符串中的空格和回车去掉。
String number = editText.getText().toString().trim();
6、android中判断文本是否为空:
文本工具类TextUtils的isEmpty()方法,返回boolean类型。
例:if(TextUtils.isEmpty(number)){}
7、日志信息LogCat:
分等级:verbose 提醒 黑色
Debug 调试 蓝色
Info 信息 绿色
Ware 警告 橙色
Error 错误 红色
Log.v(tag,”输出内容”) tag为找到此日志的标识。同理还有d、i、w、e。
8、context上下文:
就是一个系统类,提供一些方便的api,里面的方法可以得到应用程序的环境(包名,安装路径,文件路径,资源路径,资产路径)。
context.getFilesDir() :得到应用程序的包名下的files文件夹。
context.getCatchDir():得到缓存目录(包名下的catch文件夹)。
context.openFileOutput(name,mode):在包名下创建文件。