安卓系统最初由安迪 鲁宾等人开发制作
最初开发这个项目的目的是创建一个数码相机的先进操作系统
后来被改造为一款面向智能手机的操作系统
于2005年被美国科技企业Google收购
【1】linux层
【2】函数库层,由c或者c++写的
【3】Application frameWork应用的框架层
【4】最上层,应用层
jvm是sun公司的产品,dvm是Google公司的产品,刚开始Google使用的jvm被sun公司给告了,后来Google就自己研发了dvm
【1】dvm吧所有的.class文件变成一个dex文件
【2】基于的架构不同
【3】为什么谷歌自己研发dvm,是由于版权的原因
补充:art模式和传统模式的概念和区别:
eclipse IBM研发的软件,开发语言是java
【1】解压安装环境
【2】安装jdk才能用
dx.bat 把所有的.class文件变成了一个dex文件
aapt Android应用打包工具
adb Android调试桥
获取SDK 工具包
在eclipse开发工具中,打开sdkManager是这样的
Android版本对应的API级别
2.3——-10
3.0——-11
4.0——-14
4.1.2—–16
Android常见的分辨率
320*480
480*800
1280*720
src java原代码存放目录
gen 自动生成目录
gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据你放入res目录的资源,同步更新修改R.java文件。正因为R.java文件是由开发工具自动生成的,所以我们应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。
res/ 资源(Resource)目录
在这个目录中我们可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。
libs/ 支持库目录
程序开发时需要的一些三方的jar包可以放在这个目录,系统会自动把里面的jar包,添加到环境变量。
assets资源目录
Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp
AndroidManifest.xml 项目清单文件
这个文件列出了应用程序所提供的功能,以后你开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
project.properties 项目环境信息,一般是不需要修改此文件
android中res目录中文件详解
一、res/drawable 专门存放png、jpg等图标文件。在代码中使用getResources().getDrawable(resourceId)获取该目录下的资源。
二、res/layout 专门存放xml界面文件,xml界面文件和HTML文件一样,主要用于显示用户操作界面。
三、res/values 专门存放应用使用到的各种类型数据。不同类型的数据存放在不同的文件中,如下:
1)strings.xml 定义字符串和数值,在Activity中使用getResources().getString(resourceId) 或getResources().getText(resourceId)取得资源。
它的作用和struts中的国际化资源文件一样。
3)colors.xml 定义颜色和颜色字串数值,你可以在Activity中使用getResources().getDrawable(resourceId) 以及getResources().getColor(resourceId)取得这些资源。例子如下:
<resources>
<color name="contents_text">#ff0000color>
resources>
4)dimens.xml 定义尺寸数据,在Activity中使用getResources().getDimension(resourceId) 取得这些资源
<resources>
<dimen name="key_height">50dipdimen>
resources>
5)styles.xml 定义样式。
<resources>
<style name="itcastText" parent="@style/Text">
<item name="android:textSize">18spitem>
<item name="android:textColor">#0066FFitem>
style>
resources>
四、res/anim/ 存放定义动画的XML文件。
五、res/xml/ 在Activity中使用getResources().getXML()读取该目录下的XML资源文件。
六、res/raw/ 该目录用于存放应用使用到的原始文件,如音效文件等。编译软件时,这些数据不会被编译,它们被直接加入到程序安装包里。
为了在程序中使用这些资源,你可以调用getResources().openRawResource(ID) , 参数ID形式:R.raw.somefilename。
【2】 写对应的业务逻辑
package com.itheima.phonedail;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
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);
//[1]找到我们关心的控件 edittext button
et_number = (EditText) findViewById(R.id.editText1);
//[2]找到按钮
Button btn_call = (Button) findViewById(R.id.button1);
//[3]给button按钮设置一个点击事件
btn_call.setOnClickListener(new MyClickListener());
}
//定义一个类去实现 按钮需要的接口类型
private class MyClickListener implements OnClickListener{
//Called when a view has been clicked. 当按钮被点击的时候调用
@Override
public void onClick(View v) {
//[4]获取edittext 文本内容
String number = et_number.getText().toString().trim();
if ("".equals(number)) {
/**
* context 上下文
*/
Toast.makeText(MainActivity.this, "number不能为空", 1).show();
return;
}
//[5]进行拨打电话 意图 Intent
Intent intent = new Intent(); //创建一个意图对象 打 猫 狗 代码 电话
//[5.1]设置动作
intent.setAction(Intent.ACTION_CALL);
//[5.2]设置要拨打的数据
/**
* uri:统一资源标示符 自己定义的路径 想代表什么就代表说明
* url:统一资源定位符 www.baidu.com
*/
intent.setData(Uri.parse("tel:"+number));
//[6]开启意图
startActivity(intent);
}
}
}
涉及到打电话,调用手机自身的功能的时候一定要在清单文件中给设置权限
【3】 测试
【1】内部类的方式(上边例子中用到的方法)
【2】匿名内部类的方式
package com.itheima.phonedail;
import com.itheima.click2.R;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
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);
//[1]找到我们关心的控件 edittext button
et_number = (EditText) findViewById(R.id.editText1);
//[2]找到按钮
Button btn_call = (Button) findViewById(R.id.button1);
//[3]给button按钮设置一个点击事件
//☆☆☆☆ 按钮第二种点击事件 匿名内部类的方式
btn_call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//[4]实现拨打电话的逻辑
callPhone();
}
});
}
private void callPhone() {
//[4]获取edittext 文本内容
String number = et_number.getText().toString().trim();
if ("".equals(number)) {
/**
* context 上下文
*/
Toast.makeText(MainActivity.this, "number不能为空", 1).show();
return;
}
//[5]进行拨打电话 意图 Intent
Intent intent = new Intent(); //创建一个意图对象 打 猫 狗 代码 电话
//[5.1]设置动作
intent.setAction(Intent.ACTION_CALL);
//[5.2]设置要拨打的数据
/**
* uri:统一资源标示符 自己定义的路径 想代表什么就代表说明
* url:统一资源定位符 www.baidu.com
*/
intent.setData(Uri.parse("tel:"+number));
//[6]开启意图
startActivity(intent);
}
}
【3】让当前类实现OnClickListener接口类型(适用于界面上有多种按钮的情况)
package com.itheima.phonedail;
import com.itheima.click3.R;
import android.net.Uri;
import android.os.Bundle;
import android.R.layout;
import android.app.Activity;
import android.content.Intent;
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);
// [1]找到我们关心的控件 edittext button
Button btn_call2 = (Button) findViewById(R.id.button2);
Button btn_call3 = (Button) findViewById(R.id.button3);
Button btn_call4 = (Button) findViewById(R.id.button4);
et_number = (EditText) findViewById(R.id.editText1);
// [2]找到按钮
Button btn_call = (Button) findViewById(R.id.button1);
// [3]给button按钮设置一个点击事件
// ☆☆☆☆ 按钮第三种点击事件
btn_call.setOnClickListener(this);
btn_call2.setOnClickListener(this);
btn_call3.setOnClickListener(this);
btn_call4.setOnClickListener(this);
}
private void callPhone() {
// [4]获取edittext 文本内容
String number = et_number.getText().toString().trim();
if ("".equals(number)) {
/**
* context 上下文
*/
Toast.makeText(MainActivity.this, "number不能为空", 1).show();
return;
}
// [5]进行拨打电话 意图 Intent
Intent intent = new Intent(); // 创建一个意图对象 打 猫 狗 代码 电话
// [5.1]设置动作
intent.setAction(Intent.ACTION_CALL);
// [5.2]设置要拨打的数据
/**
* uri:统一资源标示符 自己定义的路径 想代表什么就代表说明 url:统一资源定位符 www.baidu.com
*/
intent.setData(Uri.parse("tel:" + number));
// [6]开启意图
startActivity(intent);
}
// 当我点击按钮的时候执行
@Override
public void onClick(View v) {
// 具体判断点击的是哪个按钮
switch (v.getId()) {
case R.id.button1: // 代表点击了第一按钮
callPhone();
break;
case R.id.button2: // 代表点击了第一按钮
callPhone();
break;
case R.id.button3: // 代表点击了第一按钮
callPhone();
break;
case R.id.button4: // 代表点击了第一按钮
System.out.println("我被削了");
break;
default:
break;
}
}
}
【4】通过在UI的xml文件中设置onclick属性设置值,这个值就是要在Activity里面要实现的方法名
package com.itheima.phonedail;
import com.itheima.click4.R;
import android.net.Uri;
import android.os.Bundle;
import android.R.layout;
import android.app.Activity;
import android.content.Intent;
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);
}
//☆☆☆☆☆ 按钮的第四种点击事件 声明一个方法 方法名和你要点击的这个按钮 在布局中生命的onClieck属于一样
public void click(View v){
//拨打电话
callPhone();
}
private void callPhone() {
// [4]获取edittext 文本内容
String number = et_number.getText().toString().trim();
if ("".equals(number)) {
/**
* context 上下文
*/
Toast.makeText(MainActivity.this, "number不能为空", 1).show();
return;
}
// [5]进行拨打电话 意图 Intent
Intent intent = new Intent(); // 创建一个意图对象 打 猫 狗 代码 电话
// [5.1]设置动作
intent.setAction(Intent.ACTION_CALL);
// [5.2]设置要拨打的数据
/**
* uri:统一资源标示符 自己定义的路径 想代表什么就代表说明 url:统一资源定位符 www.baidu.com
*/
intent.setData(Uri.parse("tel:" + number));
// [6]开启意图
startActivity(intent);
}
}
【1】线性布局
布局方式有水平布局和垂直布局,
就像羊肉串一样的,以垂直布局为例,定义的组件会一个一个的往下边排列
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="请输入电话号码" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入电话号码" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拨打"
/>
LinearLayout>
【2】相对布局
不管定义多少组件,默认都是按照在左上方重叠排放,这就用到了每个组件的相对距离
<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"
tools:context=".MainActivity" >
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="请输入number" />
<EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_number"
android:hint="请输入电话号码" />
<Button
android:id="@+id/btn_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/et_number"
android:text="call" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/et_number"
android:layout_toRightOf="@id/btn_call"
android:text="call" />
RelativeLayout>
【3】帧布局
就像播放器里面暂停的时候一样,在一个组件里面可以嵌套另一个组件
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="哈哈哈哈" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="play" />
FrameLayout>
【4】表格布局
一个行标签代表一样,里面设置了几个组件,就表示有几列
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="呵呵"
android:textColor="#FF007D"
android:layout_marginLeft="30dp"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="嘿嘿"
android:textColor="#000000"
android:layout_marginLeft="30dp"
android:textSize="18sp" />
TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈"
android:textSize="18sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="呵呵"
android:textColor="#FF007D"
android:layout_marginLeft="30dp"
android:textSize="18sp" />
TableRow>
TableLayout>
【5】绝度布局
该布局已经被谷歌工程师废弃掉了,因为不适用于屏幕的适配,但是有些地方还用的上,就像手机斗地主里面的三个人的位置,是固定的一样,里面是根据X轴Y轴的坐标来控制组件的位置
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="79dp"
android:layout_y="64dp"
android:text="Button" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_x="186dp"
android:layout_y="33dp"
android:text="Button" />
AbsoluteLayout>
sp和dp:
sp只用在textView中用来设置文字的大小的单位
dp是用来控制其他组件的大小的,在安卓中表示大小的单位使用dp不用px