注:本文参加“第二届 Google 暑期大学生博客分享大赛 -2011 Android 成长篇”
暑假在学校闲来无事,偶有兴趣想看看当下十分流行的android编程技术,于是发奋数日,对android总算有个初步认识,通过积累的数十页笔记,总结归类不同内容,得出此文,只是初步介绍一些入门知识,希望能够帮助那些想我一样渴望迅速加入android编程大家庭的同学们。由于技术尚不完善,恳请众大神指正!!!
开发环境: JDK 1.6
Eclipse 3.6.1
Android sdk 2.3.3
本人基础: Java语言
参 考: 《Android 2.0游戏开发实战宝典》(人民邮电出版社)
《GoogleAndroid SDK开发范例大全(第2版)》(人民邮电出版社)
www.android.com
www.eoeandroid.com
android docs
Step 1 配置环境
一、网上有很多经典的环境配置文件,这里只说说一些安装过程中的问题:
1. 在安装之前最后把管理员帐户的名字改为英文,中文会导致在安装AVD(android vitual device)时,默认路径“c:\users\”后出现乱码,导致找不到AVD;
2. 将android的sdk需要解压在根目录下
3. 除非是提前更新好的,否则会有一段时间用于下载更新文件
二 、新建 AVD
创建AVD:sdk manager中的vitual machine中选择”new”,本人选者android sdk 2.3.3 ,skin选项若选择默认的话,可能超出电脑屏幕。
注意AVD保存位置C:\Uers\”用户名” \.android\.android\avd 下一个崭新的AVD就展现在大家面前了(AVD启动需要花费较多时间)
三、 操纵手机1.DDM
DDM是Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
切换到DDMS
此处可控制自己的AVD哦,比如给自己打电话、发短信
2.安装新的应用程序
在sdk路径下\platform-tools\的adb工具,但是得使用命令行调用这个工具,具体CMD命令如下
adb install xx.apk
便可把打包好的apk文件安装到AVD上去。
Step 2 HelloWorld
AVD 自带的API DEMO
package irdc.helloworld; import android.app.Activity; import android.os.Bundle; public class HelloWorldActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
分析一下代码:
1. Activity是android应用程序的四大基本组件之一,后面会专门谈到哦。。
2. SetContentView(R.layout.main);是调用Activity要显示的布局文件(R.layout.main),即”\layout\main.xml”
XML配置文件
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" //填充父控件 android:layout_height="wrap_content" //包裹所包含的内容 android:text="@string/hello" /> </LinearLayout>
其中”@string/hello”是\res\values\strings.xml中定义的哦
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloWorldActivity!</string> <string name="app_name">Hello World</string> </resources>
LinearLayout是一种排列方式,也会在后面说的。。。
如上面的代码,通过Linearlayout这种规划方式,组织了TextView这个控件,可以在GraphicsLayout中看到组织的效果
其中通过eclipse中的Console可以看到当前的控制台信息,而LogCat可以看到一些日志文件,开可以对日志文件的内容进行筛选,类似于Log类。
Step 3 一些基本控件1. TextView
最常用最简单的控件了吧。。。
extends View //继承自View 类
implementsViewTreeObserver.OnPreDrawListener //接口
使用方法:
TextView tv = new TextView(context) //context指向当前对象,类似于this tv.setText(“你好”); //改变变量值 setContentView(tv); //使用该视图
XML attributes 控件的XML属性(通过XML文件更改)
/*只挑一些重点的哦~*/
android:gravity
Specifies how to align the text by theview's x- and/or y-axis when the text is smaller than the view.
Must be one or more (separated by '|') ofthe following constant values.
其实就是说用于设置View组件的对齐方式,共有12个值可以选择。
Android:height //Makes the TextView be exactlythis many pixels tall.
Android:width //Makes the TextView be exactlythis many pixels wide.
android:textStyle //Style (bold, italic, bolditalic)for the text.
android:textColor //Text color.
2. Button
按钮控件
extends TextView
使用方法:
public class MyActivity extends Activity { protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.content_layout_id); final Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click } }); } }
其中,setContentView(R.layout.content_layout_id);和下一句中的findViewById()是通过在xml配置文件中添加的按钮,加载其在R.java文件中系统分配的ID号,R.java文件不建议手动修改,是系统自动生成的。Button.setOnClickListener(new View.onClickListener())是添加事件监听器,并且在下面的onClick()函数中进行响应。
3. Imageview
图像浏览
extends View
使用方法:
Xml文件
/
。
。
。
< ImageView android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
< /ImageView>
/
Java文件
/
。
。
。
ImageView imgView = (ImageView) this.findViewById(R.id.imageView);
imgView.setBackgroundResource(R.drawable.pic);
/
第二句的作用是加载资源文件中的图片文件。
Step 4 编程通过五种布局模式,对用户界面进行调整。
Android编程通过布局模式,对用户界面进行调整。
1. Linearlayout
线性布局,最常见的一种布局方式,线性布局可以分为水平线性布局和垂直线性布局两种,通过android:orientation属性可以设置线性布局的方向。
如:
<LinearLayout …
Android:orientation = ”vertial”>
或
<LinearLayout
Android:orientation = “horizontal”>
其中有一个重要属性android:orientation,该属性用于控制布局控件的对齐方式
A. 若没有子控件的控件设置此属性,表示其内容的对其方式(TextView里面的文字对齐方式)
B. 若有子控件,则表示子控件的对齐方式
Android:layout_weight
通过设置控件的layout_weight属性以控制各个控件在布局中的相对大小。Layout_weight属性是一个非负整数值。线性布局会根据该控件layout_weight值与其所有布局值的和的比例为该控件分配占用的区域。
2. Relativelayout
相对布局,在容器内部的子元素们可以使用彼此之间的相对位置或者和容器之间的相对位置来进行定位。但是,不能在RelativeLayout容器本身和他的子元素之间产生循环依赖。
XMLAttributes
Android:layout_above //将该控件置于给定ID的控件之上
Android:layout_below //将该控件置于给定ID的控件之下
Android:layout_toLeftof //将该控件置于给定ID的控件之左
Android:layout_toRightof //将该控件置于给定ID的控件之右
Eg:layout_above= “@id/….
Android:layout_alignBaseline //该控件基线对齐给定ID的控件的基线
Android:layout_alignButtom //该控件与给定ID的控件底部对齐
Android:layout_alignLeft //该控件与给定ID的控件左对齐
Android:layout_alignRight //该控件与给定ID的控件右对齐
Android:layout_alignTop //该控件与给定ID的控件顶部对齐
Android:layout_alignParentLeft //如果为true,该控件位于父控件左部
Android:layout_alignParentRight //如果为true,该控件位于父控件右部
Android:layout_alignParentTop //如果为true,该控件位于父控件顶部
Android:layout_alignParentButtom //如果为true,该控件位于父控件底部
Android:layout_centerHorizontal //如果为true,该控件将被置于水平方向的中央
Android:layout_centerInParent //如果为true,该控件将被置于父控件水平方向和垂直方向的中央
Android:layout_centerVertical //如果为true,该控件将被置于垂直方向的中央
3. Absolutelayout
绝对布局(不推荐)
指定子控件的x,y精确的坐标的布局,绝对布局缺乏灵活性,在没有绝对定位的情况下相比其他类型的布局更难维护
“This class isdeprecated.”
“Use FrameLayout,RelativeLayout or a custom layout instead.”
官方的文档不推荐,在不同分辨上会使界面受到影响,没有很好的通用性和移植性。
XML Attributes
Android:layout_x = “10px”
Android:layout_y = “10px”
4. Framelayout
框架布局
所有添加到这个布局中的视图都以层叠的方式显示。第一个添加的组件放到最底层,最后添加到框架中的视图显示在最上面。上一层的会覆盖下一层的控件。
改变两个button之间的间隙
Android:layout_marginRight = ..dp;
5. Tablelayout
表格布局
文档定义:A layout thatarranges its children into rows and columns. A TableLayout consists of a numberof TableRow objects, each defining a row (actually, you can have otherchildren, which will be explained below). TableLayout containers do not displayborder lines for their rows, columns, or cells. Each row has zero or morecells; each cell can hold one View object. The table has as many columns as therow with the most cells. A table can leave cells empty. Cells can span columns,as they can in HTML.
Android:collapseColumns //Android:shrinkColumns //Android:stretchColumns //Android:layout_colum //中所处的列
该控件所跨越的列数
6. AndroidPx)(像素):屏幕上的点,与密度相关,单位面积上的pxDip(与密度无关的像素):这个和设备硬件有关,为了支持WVGA和QVGA
一般情况下,在不同分辨率,都不会有缩放的感觉。
(与刻度无关的像素):放大像素----程序背景样式
Android:theme
对话框样式
没有顶部标题栏
没有顶部标题栏且全屏
Android:theme=“Theme.Light” //Android:theme=“Theme.Light.NotitleBar” //Android:theme=“Theme.Wallpaper” //
程序背景透明
仅显示选定几个控件
应用程序的基本组件
1. ActivityActivity组件,每个Activity,这些Activity包下的Activity之间的运行是相互独立的。
Activity的生命周期如上图所示,Activity的生命周期主要包含3个阶段。
1. running state
此时Activity在显示在屏幕前台,拥有焦点,可以和用户的操作动作进行交互。
2. pause state
此时Activity失去焦点,并被运行态的Activity取代在屏幕前台显示,若当前运行态的Activity不能铺满屏幕或者透明,则此时暂停的Activity用户可见,但是不能和用户进行交互。
3. stopped state
无焦点,完全不可见,保留状态和成员信息,此状态的Activity会在系统需要时被结束。
不同状态之间可以用函数切换
Protected void onCreate(Bundle saveInstanceState);
Protected void onStart();
Protected void onRestart();
Protected void onResume();
Protected void onPause();
Protected void onStop();
Protected void onDestroy();
在XML文件中给Activity文件申明
Eg:
<activity android:name = “Activity”
Android:label = “@string/app_name
Android:theme= “@android:style/Theme.Dialog”>
</activity>
Activity的保存
若程序运行中,收到电话或者短信,当前Activtiy将会转到onStop();若此时系统资源紧缺,甚至会被kill,所以在onStop()之前,或在onPause()之前保存状态,调用onsaveInstanceState()函数。
Protectedvoid onsaveInstanceState(Bundle outState)
{
Super.onsaveInstance(outstate);
}
这样保存后,即使Activity被kill了,在程序再次调用onCreate()方法时,可以还原现场
A. Service组件
A service is anapplication component that can perform long-running operations with backgroundand does not provide a user interface.
Service一般由Activity或其他Context对象来启动,当启动后,该Service将会在后台运行,即使启动这个Service的组件已经结束生命,Service会继续运行,直到自己生命周期结束为止。每个Service都应该在AndroidManifest.xml中进行声明。
区分Service和Thread
Service: 1. runs in background and in the main thread by default
2. the user is not interacting with your application
Thread: 1. need to perform work outside your main thread
2. the users is interacting with you application
使用方法:
1. 通过startService方法启动。调用者和服务之间没有联系,即使调用者退出了,服务仍然进行,[onCreate()->onStart()->startService()->onDestroy()]
2. 通过bindService方法启动。调用者和服务绑在一起,调用者一旦退出服务,也就终止
[onCreat()->onBind()->onUnbind()->onDestory()]
Bound Service
Bound Service允许其他的组件(比如Activity)绑定到这个Service上,可以发送请求,也可以接受请求,甚至进行进程间的通话。Bound service仅仅在服务于其他组件时存在,不能独自无限期的后台运行。
定义方式:
a扩展Binder类
b使用Messager
c使用AIDL(Android Interface Definiton Language)
B. Intend 组件间通讯,Android的灵魂
An intend is anabstract description of an operation to be performed.
一个Intend就是一次对将要执行的操作的抽象描述
Eg:
通过Intend拨打电话和发短信:
1.java文件
Intent intent = newIntent();
Intent.setAction(intent.ACTION_CALL);
Intent.setData(uri.parse.(“tel:10086”));
StartActivity(intent);
///
intent.setAction(intent.ACTION_SENDTO)
intent.setData(uri.parse(“smsto:5554”));
intent.putExtra(“sms_body”,”Hello”);
2.XML文件中获取打电话或发短息的权限
<application>…</application>
<user-permission android:name= “android.permission.CALL_PHONE”>
< user-permissionandroid:name = “android.permission.SEND_SMS”>
在Android编程中,获取权限容易被忘记,而被在程序运行时模拟器主界面弹窗报错。。。
以上便是本人的一点点总结,恳请大神们继续指导,指正。。。