day01 英语****
Generation 一代人;代(约30年),时代
icon 图标
Libraries:c代码库
OpenGL:图形快速显示,游戏开发
webkit:浏览器内核
Android Runtime
Dalvik VM:虚拟机,android代码运行在此虚拟机
运行时调用Libraries C代码库
Application Framework中间介,java代码,调用底层c代码
n.构架;框架;(体系的)结构;机构,组织
Applications原生的应用程序:浏览器、桌面、联系人等
eclipse就是存放编译器的目录。
sdk为Android提供的软件开发工具包,
SDK Manager.exe就是sdk管理工具,下面会介绍。
sdk目录为:
异常cause by 事件方法无参数。 方法私有啦
andorid eclipse 路径的配置
JAVA_HOME D:\software\jdk1.8.0_25
path %JAVA_HOME%/bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
今天的知识
一。安卓发展史
3G
4G 4th -Generation ,速度可达到100Mbps以上,可以在线观看高清视频,上传下载大批量数据。4g: lte , long time evolution
5G 5th - Generation, 速度可达到1Gbps以上,几乎满足人们的所有需求。
二。android的版本
2.3 具有NFC 近场通信技术
3.0 具平板设计
三。Android 操作系统架构 (重点)
Android架构
application 运用层 (java开发)
浏览器、桌面、联系人
application framework 运用框架层 (java开发+JNI)
(JNI java native interface 呈上其下 )
Libraties 函数库 (c/c++开发) 和 Android Runtime 虚拟器层
OpenGL:图形快速显示,游戏开发 Dalvik VM:虚拟机,android代码运行
webkit:浏览器内核
Linux Kernel : linux 硬件内核驱动层 (c开发 )
用于安全管理、内存管理、进程管理、电源管理、硬件驱动
四。两种虚拟机的不同
1.基于的架构不同: jvm 基于栈(位于内存的一个空间,执行指令需要寻找cpu的地址 )
DVM 基于寄存器(CPU的一个组成部分,不需寻找Cpu地址,直接运行执行)
2.执行的文件的格式不同: JVM 一次执行多个.class文件,运行慢
DVM 一次运行 将多个.class文件编成一个.dex文件 执行 ,运行快
五。 ART 与 DVM
ART 不需转换代码,直接预编译成机器码,效率高
优点:程序无需转换, 运行速度块,
缺点: 占用内存大,
DVM 运行慢 卡顿
六;Android 开发环境的搭建
1.匹配 Android JDK 要匹配位数 32 64
2.
3. adt-bubdle : android develpement tools bubdle 安卓开发工具集
eclipse
sdk
SDK Manager 在此翻墙下载一些新的API文档
4. plamform的 apilevel 19 4.4版本
18 4.3
11 3.0
10 2.3
8 2.2
5 plamform-tools
aapt.exe android application package tool 安卓运用包工具
adb.exe 建立电脑与手机之间的链接
dx.bat 讲多个.class文件打包成一个.dex文件
七, SDK下的目录
add-ons 预留的一个附加目录
build-tools 构建工具目录
docs SDKAPI参考文档,所有的API都可以在这里查到。
extras 开发中额外提供的一些工具及jar
platforms 不同版本android的核心jar包
platforms-tools 平台一些相关的工具
soursce 原码
system-images:系统镜像文件
tools:开发中使用的一些工具,如9path,做图片拉伸适配
八:Android Manager 介绍
九:模拟器的简介及创建
Device 常用的分辨率
3.2----- QVGA ------320480
3.7=====WVGA=========480800
4.7------WXGA-------1280*720
十 DDMS
-
dalvik debug manager system:delvik调试管理系统
|--Devices 显示当前电脑所连接的所有android设备
显示 android设备运行的进程
|--Debug小蜘蛛 用来调试程序用的
|--Start Method Profiling 开始方法的分析 分析某个操作,某个方法的性能
|--Stop Process 停止进程,可以结束一个应用进程,杀死应用,清理缓存。
|--Screen Capture 屏幕捕获,可以给连接上的设备截屏。 -
File Explorer:文件系统 列出当前设备所有目录。
dataapp: 自己安装的应用程序apk文件存放的目录,
|-- data-data:应用的私有目录,系统每安装一个新的应用程序,都会在此目录创建该应用包名的文件,用来存放该应用的私有数据,当应用卸载时,该包名的文件夹也会被删除。
|--mnt-sdcard:SD卡目录
|--system-->app:系统应用程序apk文件存放的目录
十一:
部署运行的三种方式:- 右击工程 run as
- 工具栏的按钮
- 快捷键:ctrl+F11
dalvik debug manitor service
十二: android工程目录结构
src 源代码
gen 自动申城的文件目录,不能修改
|----Builder
|---R.java 里面有很多的内部类 是对资源文件的一个索引
Android4.3
|-- android.jar 属性可修改版本等级 (只要一个)
Android Dependencie 第三方jar包
assets 资产目录 用来存放程序运行过程中需要的一些工具
bin
|--dexeLibs
|--res
|---res
drawable-hdpi 存放图片资源
layout 布局资源
menu 菜单资源
activity_main.xml
|--values
dimens.xml 封装长度
String.xml 封装字符串
type.xml 封装样式
|--values-zh value还可国际化 自建 国际化资源 中国的
|--values-en 美国的
AndroidMainfest.xml 清单文件
程序的入口,action:main 主要的 category Lancher 启动 发射
包名
图片图标
版本名
运用名
package 包名 唯一标示
versionCode
minsdkVersion 运用程序安装的最低版本
引用一张图片 @文件夹/图片
@draw
图片命名规则: 不能字母大写,中文命名, 数字开头
activity.java
oncreate 是activity启动时调用,
activty 可还以配置运用程序的使用 权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
十三:android 打包过程
.java
------jdk------->.class
-----dx.bat------>一个.dex 联合 res assets androidmanifest.xml
-----aapt------>.apk
---签名认证jarsigner---- ->final.apk 上市
任何一个apk都需要签证才能上市,
十四:adb命令行操作
android debug bridge 调式桥 建立手机与电脑直接的连接 adb运行的端口号是5037
1.环境变量的配置:path C:\kaifa\adt-bundle-windows-x86_64_20140101\sdk\platform-tools
2.指令
adb devices 列出当前电脑连接的android设备桌面
adb pull phone_paht pc_path : 将手机端(设备)文件 拉到 电脑里 // pull 拉 托
adb push pc_path phone_path 将电脑文件 倒到手机里
adb install [-r] apkpath 电脑的文件(记事本) 安装到手机上 -r 强制安装
adb install -r C:\user]Administrator\Desktop\com.HonestNotebook.apk
adb uninstall packagename; 从手机卸载一个应用程序
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
adb kill-server 关闭调式桥
adb start-server 开启调式桥
adb端口号占用的问题
netstat -oan 查看 adb的端口号 被那个进程占用啦
在启动任务管理器里找到该进程,把其关掉,然后重启cmd就行啦
adb shell 进入当前设备linux环境下
案列
--> adb shell
进入私有文件目录
--> root@android:/ # cd data/data/com.itheima.filePermission
+ls -l 查看当前设备的目录结构
-->root@android:/data/data/com.itheima.filePermission # ls -l
drwxrwx--x u0_a48 u0_a48 2015-08-31 02:04 cache
drwxrwx--x u0_a48 u0_a48 2015-08-31 02:04 files
drwxr-xr-x system system 2015-08-31 02:04 lib
进入文件 files的目录
----> root@android:/data/data/com.itheima.filePermission # cd files
进入文件 files的目录结构
--->root@android:/data/data/com.itheima.filePermission/files # ls -l
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 append.txt
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 private.txt
-rw-rw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 read.txt
-rw-rw--w- u0_a48 u0_a48 18 2015-08-31 02:04 write.txt
使用 linux的指令 chmod 更改私有文件的权限
输入 # chmod 要成为的权限(十进制) 修改的私有文件
---> # chmod 764 append.txt
---> # ls -l
-rwxrw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 append.txt (权限发生了改变-rw-rw----为-rwxrw-r--)
-rw-rw---- u0_a48 u0_a48 18 2015-08-31 02:04 private.txt
-rw-rw-r-- u0_a48 u0_a48 18 2015-08-31 02:04 read.txt
-rw-rw--w- u0_a48 u0_a48 18 2015-08-31 02:04 write.txt
adb shell +ls -l 查看当前设备的目录结构
adb shell+logcat 查看系统运行中的日志信息(错误信息)
注意 如果当前电脑连接多态android设备,需要指定操作的当前是那台android设备。
要在 adb后加 -s 设备序列号
十五.案列:电话拨号器(重点)
1.需求分析文档,设计UI原型图
2.UI工程师 设计UI界面
3.架构师 写架构,写接口文档
4.码农 客户端
A写布局界面
1.res/layout/activity_main.xml 布局控件代码 搭建界面需要控件有:TextView控件(请输入电话号码)、EditText控件(xxx号码)、Button(呼叫此号码)
B 写业务逻辑 MainActivity.java
1. 通过布局文件中对控件配置的id,在activity中获取控件的对象
findViewById(int id)
2. 为按钮设置点击事件,当点击Button时发生事件 获取EditText中文本内容,号码
bt_callphone.setOnClickListener( new OnClickListener(){public void onClick(View v){syso(....);}}
3.在点击事件的onclick方法中,获取用户输入的电话号码
//获取EditText extends TextView 对象的文本内容
String strNumber=et_number.getText().toString().trim();
4.创建一个意图Intent对象 向 电话拨号器发送意图拨打电话
Intent intent = new Intent();
5..为Intent对象设置一个打电话的动作
intent.setAciton(Intent.ACTION_CALL);
6.为Intent对象设置一个数据,告诉意图对象具体做什么事
intent.setData(Uri.parse("tel:"+strNumber));
7.启动Intent对象,执行以上动作
startActivity(intent);
8.在androidmanifest.xml中设置一个打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
5.测试工程师 测试运用
十六.按钮的四种点击事件 crl+shift+g 看事件是否引控件用
方法一:使用匿名内部类实现点击事件,但对于多个按钮的点击事件比较臃肿
btn_call.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number = et_number.getText().toString().trim();
// 获取文本框的内容
if ("".equals(number)) {
// context 上下文 duration 显示土司的时长
//这里不用MainActivity.this, 要用 mcontext // private Context mcontext // mcontext=this
Toast.makeText(mcontext, "号码不能为空", Toast.LENGTH_LONG).show();
return;
}
Intent intent = new Intent(); // 创建意图对象
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
}
});
方法二:内部类来实现 定义一个内部类MyButtonListener 实现接口OnClickListener,重写OnClick(View v)方法
private class MyButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number =
et_number.getText().toString().trim();
// 获取文本框的内容
if ("".equals(number)) {
Toast.makeText(mcontext, "号码不能为空", Toast.LENGTH_LONG).show();
return;
}
System.out.println("number--" + number);
Intent intent = new Intent();
// 创建意图对象
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:" + number));
startActivity(intent);
}
}
//方法三 使用switch选择语句 实现N多个按钮的点击事件 ,这种方法最优,开发经常用
//但是MainActivity要实现OnClickListener接口 ,重写Click(View v)方法
public class MainActivity extends Activity implements OnClickListener {
private Button bt_01;
private Button bt_02;
private Button bt_03;
private Context mcontext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mcontext=this;
使用switch选择语句 实现N多个按钮的点击事件
//但是MainActivity要实现OnClickListener接口 ,重写Click(View v)方法
bt_01.setOnClickListener(this);
bt_02.setOnClickListener(this);
bt_03.setOnClickListener(this);
}
private void callphone() {
//3.获取用户输入的电话号码
String number = bt_01.getText().toString().trim();//通过EditText获取该控件上显示的文本内容
//4.拨打电话号码
Intent intent = new Intent();//创建一个意图对象; 奴隶,打电话
intent.setAction(Intent.ACTION_CALL);//设置意图对象的动作,打电话
intent.setData(Uri.parse("tel:"+number));// 设置意图对象的数据,告诉奴隶拨打的电话号码
startActivity(intent);//去启动一个意图对象
}
对象 View v 有一个方法getId() 获取当前被点击的控件对象的id
@Override
public void onClick(View v) {
int id = v.getId();
switch( id){
case R.id.bt_01: //当点击按钮1时,调用 callphone()方法, 执行拨打电话功能
callphone();
break;
case R.id.bt_02: //当点击按钮2时,显示按钮02被点击啦
Toast.makeText(mcontext, "按钮02被点击啦", Toast.LENGTH_SHORT).show();
break;
case R.id.bt_03://当点击按钮3时,显示按钮03被点击啦
Toast.makeText(mcontext, "按钮03被点击啦", Toast.LENGTH_SHORT).show();
break;}}
}
1.使用匿名内部类的方式,
bt_callphone.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
String strNumber=et_number.getText().toString().trim();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+strNumber));
startActivity(intent); } });
2. 创建一个子类MyonclickListener实现接口onclickListener, 重写onclick()方法, 设置控件点击事件时传一个类的对象。
private class MyButtonListener implements OnClickListener {
// 当按钮被点击的时候调用
@Override
public void onClick(View v) {
// 3. 获取到 我要拨打的号码 首先我要 找到 文本框
EditText et_number = (EditText)
findViewById(R.id.et_number);
String number =
et_number.getText().toString().trim(); // 获取文本框的内容
// 判断number 如果号码为空 我弹出一个提示 土司 Toast
if ("".equals(number)) {
// context 上下文 duration 显示土司的时长
Toast.makeText(MainActivity.this, "号码不能为空",
Toast.LENGTH_LONG).show();
return;
}
System.out.println("number--" + number);
// 4 拨打此号码 意图 干 一件事的想法 打 狗 猫 打代码 打电话
Intent
Intent intent = new Intent(); // 创建意图对象
// 设置要拨打的动作
intent.setAction(Intent.ACTION_CALL);
// 设置拨打电话号码的数据 uri统一资源标示符 范围要比
url定义范围要广定义的语法规则 比较 url
// http://www.baidu.com 统一资源定位符
intent.setData(Uri.parse("tel:" + number));
// 真正的拨打号码 开启意图对象
startActivity(intent);
}
3. 让当前类MainActivty实现接口onclickListener,设置控件点击事件时传一个this。这种方式适合按钮比较多的情况,一般在公司采用该方式。
4. 在布局文件中为控件添加一个onclick属性,在布局对应的Activity中写一个一onclick属性值为名的方法,要public,传一个View类型的参数。比较适合做简单的测试。
十七. 控件布局方式
控件的编号id android:id="@+id/当前控件对象"
1.LinearLayout(线性布局)
<TextView/> 文本框 显示框的内容
水平线性布局 android:orientation=“horizontal”表示水平方向
、垂直线性布局 android:orientation=“vertical”表示垂直方向
android: gravity=center/left/right gravity:对齐方式 子控件以当前控件为参照物的对齐方式 (注:与父窗体界面无关)
android: layout_gravity=center/left/right 当前控件以父窗体为参照物的对齐方式 (父窗体可能指手机屏幕,也可能指孙控件的父控件窗体)
android:background="#ffffff" 控件的背景颜色
android:layout_margintop/Bottom/Right/Left="50dp" 当前控件 与上面/下面/右边/左边 控件 的间距
android: padding=10dip 当前控件里面的子控件 与 当前控件的四周间距
android:paddingTop="20dp" 当前控件与上面的控件的间隙
android:paddingBottom="20dp" 当前控件与下面的控件的间隙
android: hint 友情提示,引导你做什么
android:layout_width="match/fill_parent" 控件的宽填充父窗体
android:layout_width="wrap_content" 控件的宽被父窗体包裹
android:layout_height="match/fill_parent" 控件的高填充父窗体
android:layout_height="wrap_content" 控件的高被父窗体包裹
RelativeLayout(相对布局)都是从左上角开始布局,要控制位置需要 设置 每个控件相对于其他控件的位置。
都是从左上角开始布局,要布局控件的位置就要以其他的控件为参照物
当前控件相对于另一个控件
layout _below="@id/bt_center" 当前控件位于哪个控件的下方
android:layout_above="@id/bt_center" 当前控件位于哪个控件的上方
android:layout_toLeftOf="@id/bt_center" 当前控件位于那个控件的左边
android:layout_toRightOf="@id/bt_center" 当前控件位于那个控件的右边
layout_alignParentright 当前控件以父窗体(手机界面)为参照物的对其方式
android:layout_centerHorizontal="true":当前控件在父窗体中水平居中
android:layout_centerVertical="true":当前控件在父窗体中垂直居中
android:layout_centerInParent="true": 当前控件位于父窗体的正中间
帧布局 FrameLayout
控件一层一层往上叠加布局
表格布局 TableLayouts
TableRow 此控件代表一行,
TableRow 此控件代表一列
绝对布局 AbsoluteLayout
-------------------------应用列表界面。
Settings设置-display
*Screentimeout,屏幕超时。超出设置时间,自动锁屏。在4.1中是Sleep选项。
Package
Name:包名,这个命名要具有一定意义,比如:com.公司名称.xxx
Minimum Required SDK:工程最低要求运行版本
Target SDK:最高可运行的版本
Compile With:编译的版本,一般用较高的版本
Theme:主题:none即可
注意这里的工程名是01.HelloWorld,这是下边的包名Package
Name会自动生成com.example.1.helloworld,包名中不允许出现数字,所以删掉
即
Android工程目录结构
src:源代码。如果最初选择创建Activity,会有一个Activity的子类
gen:系统自动生成的文件。R.java 中记录了项目中各种资源ID
BuildConfig.java 标记项目是否可以Debug
Android 4.4
当前工程所使用的SDK类库
Android Private Libraries
用来支持各个版本的类库
assets:资源文件
不会在R文件注册,原封不动发布
里面可以放置应用程序依赖的一些文件
如果此文件夹中存放的文件过大,在发布时,上传apk将会很慢。
bin:编译后的二进制文件
包括class、资源文件、dex、apk、清单文件等
libs:工程中使用的库
默认带有版本支持的类库,像v4、v7包
res:系统资源,所有文件都会在R文件生成资源ID
drawable:图片
layout:界面布局
menu:菜单
values:字符串、样式等数据
anim:动画
raw:原生文件
drawable-hdpi:高分辨率的图片目录
drawable-ldpi:低分辨率的图片目录
drawable-mdpi:中分辨率的图片目录
drawable-xhdpi:大分辨率的图片目录
drawable-xxhdpi:超大分辨率的图片目录
AndroidManifest.xml:清单文件
Android中的四大组件(Activity、ContentProvider、BroadcastReceiver、
Service)都需要在该文件中注册
程序所需的权限也需要在此文件中声明,例如:电话、短信、互联网、
访问SD卡。
manifest节点:pakeage:是应用安装的路径data/data的目录,手机上的
应用程序的不能有一样的包名/目录。
manifest节点:
versionCode:应用程序版本号
versionName:应用程序版本名称
proguard.cfg:
用来混淆代码的配置文件,防止别人反编译
project.properties:
标记该项目使用SDK版本号,早期版本名为:default.properties
Android程序部署与启动
应用程序安装、发布:Package Explorer中右键点击工程 – Run As –
Android Application,快捷键Ctrl+F11
程序启动过程:
Eclipse将.java源文件编译成.class
dx工具将所有.class文件转换为.dex文件
再将.dex文件和所有资源打包成.apk文件
将.apk文件上传并安装到模拟器,存储在/data/app目录下
启动程序,开启进程
根据AndroidManifest.xml文件找到MainActivity类,创建Activity
Activity创建后执行onCreate(Bundle)方法,根据R.layout.activity_main构建
界面
Android程序部署与启动
应用程序安装、发布:Package Explorer中右键点击工程 – Run As –
Android Application,快捷键Ctrl+F11
程序启动过程:
Eclipse将.java源文件编译成.class
dx工具将所有.class文件转换为.dex文件
再将.dex文件和所有资源打包成.apk文件
将.apk文件上传并安装到模拟器,存储在/data/app目录下
启动程序,开启进程
根据AndroidManifest.xml文件找到MainActivity类,创建Activity
Activity创建后执行onCreate(Bundle)方法,根据R.layout.activity_main构建
界面
public class MainActivity extends Activity {
@Override
//oncreate()运用程序界面被创建时调用此方法
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置运用程序的UI界面显示调用setContentView()方法
/*R是个最终类 能自动生成 ,不能修改 AUTO-GENERATED FILE. DO NOT MODIFY.
* res 是个资源文件夹
* R.layout.activity_main 调用.layout文件夹里的activity_main.xml文件,就会显示出虚拟机界面在eclipse里 */
setContentView(R.layout.activity_main);
}
}
R.layout.activity_main是R类中的一个成员变量,指向res/layout/activity_main.xml文件
activity_main.xml文件中描述了Activity的布局方式以及界面组件
解析activity_main.xml,通过反射创建对象,生成界面
Android程
各个关于
关于MainActivity.java 文件 ----activitiy 第一次创建的时候调用
/02_常见布局/src/cn/itheima/flayout/MainActivity.java
public class MainActivity extends Activity {
@Override
//oncreate()运用程序界面被创建时调用此方法 //运用程序只要一开启就会调用oncreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置运用程序的UI界面显示调用setContentView()方法
/*R是个最终类 能自动生成 ,不能修改 AUTO-GENERATED FILE. DO NOT MODIFY.
* res 是个资源文件夹
* R.layout.activity_main 调用.layout文件夹里的activity_main.xml文件,就会显示出虚拟机界面在eclipse里 */
// 加载 activity 需要显示布局
setContentView(R.layout.activity_main);
}
}
关于R.java 文件
/02_常见布局/gen/cn/itheima/flayout/R.java
public final class R
|---- public static final class attr {}
|---- public static final class dimen {
static final int activity_horizontal_margin=0x7f040000;
static final int activity_vertical_margin=0x7f040001; }
|---- static final class drawable {
public static final int ic_launcher=0x7f020000;}
|---- public static final class id {
public static final int action_settings=0x7f080000;}
|---- static final class layout {
static final int activity_main=0x7f030000;}
|---- static final class menu { static final int main=0x7f070000; }
|---- static final class string {
static final int action_settings=0x7f050001;
static final int app_name=0x7f050000;
static final int hello_world=0x7f050002;}
关于activity_main.xml文件
描述了Activity的布局方式以及界面组件
/02_常见布局/res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="ceenter_horizontal" // 让控件在界面水平居中
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
//设置控件的id
<EditText android:id="@+id/et_password" />
<EditText android:id="@+id/et_password"/>
<CheckBox android:id="@+id/cb_remember"/>
关于 AndroidManifest.xml 文件
/02_常见布局/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.itheima.flayout"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="cn.itheima.flayout.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
(4.2前) Dalvik VM 安卓运用虚拟机程序
(4.2后) 新版本 ART 安卓虚拟机运用程序
1.提高程序运行效率
2.但是不稳定,耗电量大,占用内存
2.android开发工具的下载配置
www.andro s 安卓开发工具集
.*下载安卓的ADT的插件 for eclipse
instaling eclispe plugin eclispe插件
*android SDK 开发工具集
eclipse
Android Studio
*下载 adt-bundle-windows-x86-2013-解压:
有 eclipse
sdk
SDK Managet.exe
* 选 Android 4.1.2(API16)为例 选择 ARM system-images 选择模拟器创建需要的镜像
android SDK Manger开发环境的目录结构 :下载安装最新的 sdk程序
sdk 包
-
build-tools 编译需要用到的所有工具,把开发的程序装进手机
-
docs 开发的离线文档
-
extras 额外工具,模拟器加速器,向下兼容的jar包
---android/ support:存储的是goole开发的新特性jar包
-----intel /...Mannger(硬件加速管理器)/IntelHaxm.exe 提高电脑inter的运行速度(i3以后处理器) -
platforms 开发需要的版本平台,每个平台的android.jar在对应的文件夹里面
-
platform-tools 开发调试的工具
----adb.exe 一个重要的调试桥(连接pc机与手机模拟器) -
sources 存储android.jar的源码 goole工程师开发的源代码存于此
-
system-images 存储各个不同版本模拟器创建需要的镜像
-
tools 开发辅助需要用到的工具,
---emulator.exe 模拟器.exe
手动配置安卓eclipse开发环境
eclipse/window/preferces/Android/输入sdk路径 :找到sdk存储的路径
建立android项目工程
new/Android Applicstion project
或/other/Android/Android Application project
弹框
运用名 Application Name : helloworld
工程名 project Name: helloworld
包名 pakge Name : com.itheima.helloworld
minimum required SDK :设置即你编写的安卓程序代码 能够安装移植运行的最低版本的安卓手机
API 9 Andorid 2.3 安装的程序的最低版本手机是 9(2.3) 9(2.3)以下的版本则不能安装
Target SDK : 设置即你编写的安卓程序代码 能够最高兼容版本的手机
API 21 Andorid 5.0
Compile With : 用..进行编译,即把java代码打包成jar包 装在手机里
API 16 Andorid 4.1 最稳定
下一页面
选 ceate custum lanucher icon
选 create activity
选 create project in workplace 选择工作空间
下一页面 创建 create activity
eclipse 页面
Android virtual Device Manger 安卓虚拟设备
AVD Name : ipone6
设备 Device : HVGA 480x320 (小尺寸的 我的点哪配置低,分辨率低)
Target Android 4.1.2 -APIlevel 16
CPU/ABI Intel Atom(x86)
内存 Menory oPtion: Ram:512 不能太大,否则溢出
VM 16
手机内存卡 Internal Storage 200M
外卡 SD Card 32M
Snapshot 开发休眠 不建议选
如何把工程项目部署到安卓的模拟器里那?
右击项目工程/run as/android application
VGA
过去的一种图形显示大小的规范 480*640 标准
QVGA 分辨率 240x320 // Q 1/4
HVGA 480x320 //H 一半
WVGA 480x800
FWVGA 854x480
ADB
adb:android debug bridge 安卓调试桥 (pc与手机相连)
*DOS adb devices
查看链接到电脑上的所有的手机设备。(模拟器,真实的手机)
emlator-5554 device 上线
emlator-5555 offline 没上线
emlator-5556 offline 没上线
如果都显示的是 offline 说明模拟器掉线啦
解决:关掉 adb调试桥,重启adb调试桥
DOS adb kill-server
DOS adb start-devices
- adb kill-server
杀死adb的调试桥
- adb start-server
重新启动adb的调试桥
如何把电脑上的一个文件(记事本) 安装到 模拟器(真实的手机)上
- adb install xxx.apk
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
从手机卸载一个应用程序,参数是应用程序的包名, 打开DDMS,查看应用程序的包名的路径
*DOS adb uninstall 应用程序的包名
DOS adb uninstall C:\user]Administrator\Desktop\com.HonestNotebook.apk
对adb.exe进行环境变量配置,可以在DOS的任意目录下运行
path
;E:\Android SDK\adt-bundle-windows-x86_64_20140101\sdk\platform-tools;
DDMS
dalvik debug manager system dalvik 虚拟机调式系统
1.Devicer 显示手机的各个软件的进程和路径
-
file Explorer 文件浏览器 上传到电脑和下载数据到手机
把虚拟机/手机的文件倒到桌面上 点击小标签 pull a file from the device如何把电脑的音乐文件倒到手机里 /虚拟机的sdcard卡可以放些歌曲视频文件
DDM /sdcard 点击右上角按钮 pullafile onto the device 选择电脑的歌曲即可导入到手机里
3.Emulator contor 控制模拟器
可以模拟打电话 发短信
注意:要是Devicer 无进程显示 则模拟器掉线啦
DOS adb kill-server
adb devices
android应用的目录结构(左边)
-
src文件夹,java源代码
onCreate()界面被 开启调用该方法//设置应用程序显示的ui setContentView(R.layout.activity_main);
-
gen目录
自动生成的文件夹 ,里面保存的是res资源文件的引用 -
android4.1.2 代表的是引用的android.jar包
-
libs文件夹
代码的三方jar包。会自动的被添加到android.dependencies目录下
如何把jar包添加进libs里去 -
android dependencies 开发依赖的jar包
-
bin
编译生成的临时文件和二进制文件和上传到虚拟机的apk文件都在bin里。会自动生成的 -
res目录
- drawable-ldpi 运用程序的自身使用的图片。 low 低分辨率 小图
- drawable-mdpi middle 中等分辨率
- drawable-hdpi high高分辨率
- drawable-xhdpi x加大高分辨率
- drawable-xxhdpi 加大再加大的分辨率
- layout 用xml文件编写的布局
- menu 菜单文件夹
-values 里有个string.xml文件,代表程序的字符串资源,打开可以修改代码内容
-
AndroidManifest.xml
清单文件,配置应用程序的版本,图标,名称等重要信息。
android应用程序开发的步骤
1.设置空间布局 res-->layout文件夹 修改xml布局文件(即修改UI的文档代码),修改按钮
- src目录 -->编写MainActivity.java文件的代码
- 找到关心的控件,我就要添加什么控件
view findViewById(int id);
View button= findViewById(R.id.bt_call)
4.控件是按钮对象button 设置点击事件动作 Intent setAction(String action) 方法 并获取数据 Intent setDate(int data)方法
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel://15671307215"));
- 记得添加权限。 涉及隐私 注册拨打电话权限android.permission.CALL_PHONE
关于控件的 一系列、
TextView
EditText
Button
控件的id
<TextView android:id="@+id/textView1"/>
<EditText android:id="@+id/et_number"/>
<Button android:id="@+id/btn_call" />
控件的 事件
android:onClick="getPrivateFile"
android:onClick="read"
android:onClick="write"
Android常见布局
- 线性布局 LinearLayout 按线排列
重要参数
1.1朝向 orientation = horizontal水平朝向 或 vertical垂直朝向
android:orientation="vertical" 控件垂直朝向
android:orientation="horizontal" 控件水平朝向布局
1.2
width 宽度 控制控件在父窗体里面显示的比例。
---->weight=fill/match_parent 我的布局填充占满父窗体(虚拟机界面)
--->也可以weight=“160px”宽占整个界面的一半
height 高度 控件布局在窗体里 显示的高度比例
--> height =warp_parent 控件布局部分填充父窗体(被父窗体包裹)
--> 也可以 height =“160px” 高整个界面的一半
<Button/EditText
android:layout_width="match_parent" //高布局占满
android:layout_height="warp_parent" //宽布局部分填充界面
android:orientation="vertical/horizontal" />//控件布局 水平或垂直朝向
1.3 weight 指此按钮占整个界面的百分比重
<Button
android:layout_width=" 0dp"
-- weight 指此按钮占整个界面的百分比重 2 此按钮占 正整个界面的2/3、
android:layout_width=" 2"
android:layout_weight="2"
android:text="按钮01"
/>
<Button
android:layout_width=" 0dp"
-- weight 指占整个界面的百分比重 1 此按钮占 正整个界面的1/3、
android:layout_weight=" 1"
android:layout_height="wrap_content"
/>
-
相对布局 Relate Layout :找准参照物
要不一个按钮控件带 带有 Parent 就是与父窗体(手机界面)相关,此空间属性 不需要id,属性直接true flase
以父窗体为参照物进行布局
要不一个按钮控件 如果没带Parent ,此控件的属性 就要有id,是以某个控件的id编号为参照物,进行布局
正中间按钮, 有个 id编号,以此按钮为参照物
<Button
//为正中间的按钮定义了一个id 编号 "@+id/bt_middle"
//在R文件里一保存就会在class id 类里生成一个 常量 int bt_minddle=0x7f070000;
android:id="@+id/bt_middle"android:layout_width="wrap_content" android:layout_height="wrap_content" center Horizontal="true" 按钮控件水平居中 android:layout_centerHorizontal="true" centerInParent="true" 按钮空间垂直居中 //centerInParent="true" 按钮控件在父窗体的正中间 android:layout_centerInParent="true" android:layout_centerVertical="true" android:text="正中间按钮" /> 在中间按钮的上方按钮 ,以中间按钮的编号为依据android:layout_above="@id/bt_middle"
<Button
android:layout_width="wrap_content "
android:layout_height="wrap_content"
//此按钮在 中间按钮 的上方 //layout_above
android:layout_above="@id/bt_middle"
android:layout_centerHorizontal="true"
android:text="↑上方按钮" />在中间按钮的下方按钮 以中间按钮的编号为依据 android:layout_below="@id/bt_middle"
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//此按钮在 中间按钮 的下方 //layout_below
android:layout_below="@id/bt_middle"
android:layout_centerHorizontal="true"
android:text="↓" />
在中间按钮的左方按钮 以中间按钮的编号为依据 android:layout_toLeftOf="@id/bt_middle"
<Button
//toLeftOf 控件左边布局
android:layout_toLeftOf="@id/bt_middle"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="←" />
在中间按钮的下右方按钮 以中间按钮的编号为依据 android:layout_toRightOf="@id/bt_middle"
<Button
//toRightOf 控件右边布局
android:layout_toRightOf="@id/bt_middle"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="→" />
凡是控件带有 Parent 就是与父窗体(手机界面)相关,此空间属性 不需要id,属性直接true flase
如果没带Parent ,此控件的属性 就要有id,以某个控件的id为参照物,进行布局
此按钮在父窗体 最左上角。 与中间的按钮控件 无关,不需要 中间按钮的编号 依据
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentTop="true" 按钮控件与父窗体的最顶部对齐
android:layout_alignParentTop="true"
//alignParentLeft="true" 按钮控件与父窗体的最左边对齐
android:layout_alignParentLeft="true"
android:text="左上角"
/>
此按钮在父窗体 最左下角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentBottom 按钮控件与父窗体的最底部对齐
android:layout_alignParentBottom="true"
//alignParentLeft 按钮控件与父窗体的最左边对齐
android:layout_alignParentLeft="true"
android:text="左下角"
/>
此按钮在父窗体 最右下角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentBottom 按钮控件与父窗体的最底部对齐
android:layout_alignParentBottom="true"
//alignParentRight 按钮控件与父窗体的最右边对齐
android:layout_alignParentRight="true"
android:text="右下角"
/>
此按钮在父窗体 最右上角
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//alignParentTop="true" 按钮控件与父窗体的最顶部对齐
android:layout_alignParentTop="true"
//alignParentRight 按钮控件与父窗体的最右边对齐
android:layout_alignParentRight="true"
android:text="右上角"
/>
</RelativeLayout>
- 帧布局 FrameLayout
div 暂停的图标,显示在界面的中间。
帧布局布局特点:下个(后个)控件布局总是悬浮在前个控件的上方,若下个控件面积大于前个控件的面积,则会覆盖掉前个控件。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
//帧布局的控件宽高匹配父窗体
android:layout_width="match_parent"
android:layout_height="match_parent" >
//父窗体是白色底板,TextView就是悬浮在父窗体上的一个 红色画布
<TextView
android:layout_width="300px"
android:layout_height="300px"
//TextView的布局方式:layout_gravity ="center/button/top"//让 TextView居中/低/顶 布局
android:layout_gravity="center"
android:background="red" />
// 此控件布局悬浮与上个红色控件的上方。
<TextView
android:layout_width="200px"
android:layout_height="200px"
android:layout_gravity="center"
android:background="green" />
// 此控件布局悬浮与上个绿色控件的上方
<TextView
android:layout_width="100px"
android:layout_height="100px"
android:layout_gravity="center"
android:background="blue" />
// 此控件布局悬浮与上个蓝色控件的上方
<TextView
android:layout_width="50px"
android:layout_height="50px"
android:layout_gravity="center"
android:background="yellow" />
</FrameLayout>
- 表格布局 TableLayout
表格布局;就是里面有很多的行 TableRow代表行
//第一行 姓名
<TableRow
// TableRow代表行 宽 填充父窗体,高被包裹
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0px"
android:layout_weight="2" //权重 占2
android:layout_height="wrap_content"
android:text="姓名:" />
<EditText
android:layout_width="0px"
android:layout_weight="5" //权重 占5
android:layout_height="wrap_content"
//hint 填写
android:hint="请填写姓名" />
</TableRow>
//第二行 填身份号码
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="0px"
android:layout_weight="2" //权重 占2
android:layout_height="wrap_content"
android:text="身份证号码:" />
<EditText
android:layout_width="0px"
android:layout_weight="5" //权重 占5
android:layout_height="wrap_content"
android:hint="请填写身份证号码" />
</TableRow>
</TableLayout>
- 绝对布局 AbsoluteLayout
废弃,不推荐使用。 deprecated 废弃
720p (1280×720)
1080P (1920X1080)
ANDROID 中显示像素问题
为了适应不同分辨率,不同的像素密度,推荐使用dip/dp, 文字使用sp。
px (pixels)像素 就是分辨率
一般HVGA代表320x480像素。该单位不常用. 机顶盒开发可能用.。
px 当界面小分辨率小,控件按钮占的父窗体界面就多,
当界面 分辨率大,控件按钮占的父窗体界面就小,
dip或dp (device independent pixels)设备独立像素
这个和设备硬件有关,一般为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
使用dp 像素单位,控件随着界面的大小(分辨率)变化,而自动变化控件大小,但自生的大小不变..占得权重不变。
sp (scaled pixels — best for text size)比例像素,用于字体
主要处理字体的大小,可以根据用户系统的字体自适应。
除了上面三个显示单位,下面还有几个不太常用:
in (inches)英寸
mm (millimeters)毫米
pt (points)点,1/72英寸
为了适应不同分辨率,不同的像素密度,推荐使用dip/dp,文字使用sp。
点击事件的几种写法
-
内部类实现onclickListener的接口
class MainActivity extends Activity implements OnClickListener -
匿名内部类实现onclickListener接口,重写接口的vid OnClick(view v)点击事件方法
- 让当前的Activity实现onclickListener的接口
界面的按钮比较多,就要建立很多个内部类对象(对应一个按钮控件),麻烦。
如果通过内部类或者匿名内部类代码比较臃肿。
-
在配置文件里布局xml文件里面声明 onclick属性 ="方法名"
方法一:使用匿名内部类实现点击事件,对于多个按钮的点击事件比较臃肿
public class MainActivity extends Activity {
private Button bt_01;
private Button bt_02;
private Button bt_03;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取 按钮01的对象
Button bt_01=(Button) findViewById(R.id.bt_01);
//为按钮01设置点击事件 //调用 View setOnClickListener(OnClickListener l); l 是个接口
//使用接口的匿名内部类
bt_01.setOnClickListener( new OnClickListener(){
public void onClick(View v) { Toast.makeText(MainActivity.this, "按钮01被点击啦", 0).show();}});
//获取 按钮02的对象
Button bt_02=(Button) findViewById(R.id.bt_02);
bt_02.setOnClickListener(new OnClickListener() {
public void onClick(View v) { Toast.makeText(MainActivity.this, "按钮02被点击啦", 0).show();}});
//获取 按钮03的对象
Button bt_03=(Button) findViewById(R.id.bt_03);
bt_03.setOnClickListener(new OnClickListener() {
public void onClick(View v) { Toast.makeText(MainActivity.this, "按钮03被点击啦", 0).show(); }});
}
}
网友评论