一、概述
二、环境搭建
1、Android---电脑===>兼容机
开源/免费
Android联盟
2、Android开发环境搭建
A、java+eclipse3.5+
B、android sdk
C、adt--android的eclipse开发插件(安装)
模拟器
屏幕分辨率
HVGA:320×480
QVGA:240x320
WQVGA400:240X400
WQVAG432:240X432
WVGA800: 480X800
WVGA854: 480X854
3、Android应用程序架构
src/java源代码存放目录
gen/自动生成目录,Android开发工具自动根据你放入res目录的xml界面文件、图标与常量,同步更新R.java文件。通过R.java,应用可以很方便地找到对应资源。另外编译器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编译进软件中,这样可以减少应用程序在手机占用的空间。
res/资源目录,在这个目录中我们可以存放应用使用到的各种资源
assets资源目录,改目录也可以存放资源,而且改目录下的资源不会在R.java自动生成ID,所以读取/assets目录下的文件必须制定文件的路径,如
file:///android_assets/xxx.3gp
AndroidManifest.xml:列出了应用程序所提供的功能,开发的各种组件需要在该文件中进行配置,
如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),你还需在该文件中声明使用权限。
l
default.properties项目环境信息,
4、基本工具的应用
A、往模拟器上上传东西---File Explore
B、设备管理Device--模拟器管理
C、控制模拟器--Emulator Control
5、第一个Android应用程序创建
应用名
包名---唯一的java包名
Activity名称---类名
6、Android应用的简单组成
AndroidManifest.xml---Android项目清单文件(配置文件)
res目录--存放各种资源文件信息,比如字符串,图片,音乐等,会自动把里面的东西生成应用常量在R文件中。要注意文件名及name必须是合法的java标识符。
文件更特殊,Invalid file name: must contain only [a-z0-9_.]
<string name="address.city">城市</string>---这种资源解析时会变成address_city。
7、Android程序运行的过程
(1)、检查环境
[2012-03-18 11:51:17 - gz1205-helloworld] ------------------------------
[2012-03-18 11:51:17 - gz1205-helloworld] Android Launch!
[2012-03-18 11:51:17 - gz1205-helloworld] adb is running normally.
[2012-03-18 11:51:17 - gz1205-helloworld] Performing cn.itcast.gz.hello.HelloActivity activity launch
[2012-03-18 11:51:17 - gz1205-helloworld] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'android2.2vm'
(2)、把应用上传到模拟器上
[2012-03-18 11:51:17 - gz1205-helloworld] Uploading gz1205-helloworld.apk onto device 'emulator-5554'
(3)、在模拟器上安装
[2012-03-18 11:51:42 - gz1205-helloworld] Installing gz1205-helloworld.apk...
[2012-03-18 11:51:52 - gz1205-helloworld] Success!
(4)、起动程序
[2012-03-18 11:51:52 - gz1205-helloworld] Starting activity cn.itcast.gz.hello.HelloActivity on device emulator-5554
[2012-03-18 11:51:55 - gz1205-helloworld] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
cmp=cn.itcast.gz.hello/.HelloActivity }
8、关于andorid的apk包
jar包
web程序war包
android程序apk包---也是一个普通的压缩文件。---里面的xml资源文件是加密的。
*.class文件被打包到classes.dex (类似于jar包,实际是包含了jar包及一些xml资源文件)===可以通过工具把他里面的jar包提取出来。
四、Android应用程序界面简单开发
1、Activity及View介绍
A、Activity代表一个屏幕--Android四大组件之一
(1)、写一个类继承Activity类
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加入自己的代码
System.out.println("onCreate()....");
}
}
(2)、配置Activity-在AndroidManifest.xml进行配置
<activity android:name="cn.itcast.gz.ui.MainActivity"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name">
<!-- 意图过滤器 ,设置为起动Activity,这样就会在开始菜单界面中找到-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
(3)、设置内容,调用Activity的setContentView()方法即可。
B、View---可视化的控件
Veiw-具体的控件,比如Button。
ViewGroup->容器控件,布局控件。
2、直接用程序创建界面。---与Swing类似
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加入自己的代码
System.out.println("onCreate()....");
//往Activity中设置内容
//在写Android组件的时候,凡是要用Context的地方,要么就组件本身继承自Context(直接用this),或者组件提供getContext()方法来获得
Button btn1=new Button(this);
//设置按钮的属性
btn1.setText("确定");
//this.setContentView(btn1);
Button btn2=new Button(this);
//设置按钮的属性
btn2.setText("取消");
//创建ViewGroup
//ViewGroup vg=
//往容器中添加控件
LinearLayout layout=new LinearLayout(this);
//设置布局的属性,比如设置Orientation来指定容器中控件的排放方式
layout.setOrientation(LinearLayout.VERTICAL);
layout.addView(btn1);
layout.addView(btn2);
setContentView(layout);
}
}
3、使用标记语言来声明界面。
A、Activity类
public class MainActivity2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//设置屏幕中显示的内容,从layout布局中文件中加载
setContentView(R.layout.ui);
}
}
B、布局资源文件layout\ui.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确定" >
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="取消" >
</Button>
</LinearLayout>
五、事件处理
1、事件响应
2、在程序中使用setOnXXXX方法来设置事件监听对象
//获得Button对象,通过按钮的id去查找
Button btn=(Button)this.findViewById(R.id.btnOk);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("点击了按钮....");
EditText et=(EditText)findViewById(R.id.txtMsg);
System.out.println(et.getText().toString());
}
});
3、可以直接在布局资源文件中指定事件响应方法-- android:onClick="test"
A、布局文件
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="test"
android:text="Button1" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="cancel"
android:text="Button2" />
B、Activity的源代码
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
}
public void test(View v){
System.out.println("测试一下....");
}
public void cancel(View v){
EditText et = (EditText) findViewById(R.id.txtMsg);
System.out.println(et.getText().toString());
}
}
4、处理按键事件--重写Activity的onKeyDown等事件处理方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
System.out.println("按键:"+keyCode);
//return true;
return super.onKeyDown(keyCode, event);
}
六、Android应用简单示例及工具应用:
1、电话拔打实例 dial
A、界面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/telNumber" />
<EditText
android:id="@+id/txtTel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btnDial"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dial"
/>
</LinearLayout>
B、添加代码
public class MainActivity extends Activity {
private EditText txtTel;
private Button btnDial;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//初始化控件对象--直接查找
txtTel=(EditText) findViewById(R.id.txtTel);
btnDial=(Button)findViewById(R.id.btnDial);
//设置事件监听对象
btnDial.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//获得用户输入电话号码
String tel=txtTel.getText().toString();
//调用Android中的拨号程序来拨号
Intent it=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+tel));
//起动通话程序
startActivity(it);
}
});
}
}
C、出示权限
03-18 16:31:56.414: E/AndroidRuntime(3898): java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.CALL dat=tel:110
cmp=com.android.phone/.OutgoingCallBroadcaster } from ProcessRecord{44f7c158 3898:cn.itcast.gz.dial/10039} (pid=3898, uid=10039) requires android.permission.CALL_PHONE
<!-- 出示权限,表示应用要使用到哪些权限的操作 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
2、发短信
public void sendSms(View v){
//获得电话号码及短信内容
String tel=txtTel.getText().toString();
String c=txtContent.getText().toString();
//发送短信,调用手机短信管理硬件设备来发短信
//获得短信管理器
SmsManager smsManager=SmsManager.getDefault();
//撤分短信,确保全部发完
ArrayList<String> msgs= smsManager.divideMessage(c);
for (int i = 0; i < msgs.size(); i++) {
smsManager.sendTextMessage(tel,null,msgs.get(i),null,null);
}
System.out.println("成功发送了"+msgs.size()+"条短信!");
}
3、消息通知
A、对话框 B、消息栏Notification C、Toast消息
Toast消息的实现
/*
//创建Toast对象
Toast toast=Toast.makeText(this, "成功发送了"+msgs.size()+"条短信!", Toast.LENGTH_LONG);
//显示
toast.show();
*/
//直接创建后立即显示
Toast.makeText(this, "成功发送了"+msgs.size()+"条短信!", Toast.LENGTH_SHORT).show();
4、真机测试
A、卖出价一台手机
B、装驱动usb驱动,从设置中并打开USB调试模式
C、直接运行即可---与在模拟器上一样。